svn commit: samba r8528 - in trunk/source: include locking smbd

vlendec at samba.org vlendec at samba.org
Sun Jul 17 13:20:27 GMT 2005


Author: vlendec
Date: 2005-07-17 13:20:26 +0000 (Sun, 17 Jul 2005)
New Revision: 8528

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=8528

Log:
I find it quite confusing which of the share mode routines need a lock and
which don't. This makes the lock explicit.

Volker


Modified:
   trunk/source/include/smb.h
   trunk/source/locking/locking.c
   trunk/source/smbd/trans2.c


Changeset:
Modified: trunk/source/include/smb.h
===================================================================
--- trunk/source/include/smb.h	2005-07-17 12:57:14 UTC (rev 8527)
+++ trunk/source/include/smb.h	2005-07-17 13:20:26 UTC (rev 8528)
@@ -634,6 +634,9 @@
 	DATA_BLOB private_data;
 };
 
+/* incomplete structure declaration for a share mode lock */
+struct share_mode_lock;
+
 /* struct returned by get_share_modes */
 typedef struct {
 	pid_t pid;

Modified: trunk/source/locking/locking.c
===================================================================
--- trunk/source/locking/locking.c	2005-07-17 12:57:14 UTC (rev 8527)
+++ trunk/source/locking/locking.c	2005-07-17 13:20:26 UTC (rev 8528)
@@ -426,6 +426,43 @@
 	tdb_chainunlock(tdb, locking_key(fsp->dev, fsp->inode));
 }
 
+struct share_mode_lock {
+	SMB_DEV_T dev;
+	SMB_INO_T ino;
+};
+
+static int share_mode_lock_destructor(void *p)
+{
+	struct share_mode_lock *lck =
+		talloc_get_type_abort(p, struct share_mode_lock);
+	unlock_share_entry(lck->dev, lck->ino);
+	return 0;
+}
+
+struct share_mode_lock *get_share_mode_lock(TALLOC_CTX *mem_ctx,
+					    SMB_DEV_T dev, SMB_INO_T ino)
+{
+	struct share_mode_lock *lck;
+
+	lck = TALLOC_P(mem_ctx, struct share_mode_lock);
+	if (lck == NULL) {
+		DEBUG(0, ("talloc failed\n"));
+		return NULL;
+	}
+
+	lck->dev = dev;
+	lck->ino = ino;
+
+	if (!lock_share_entry(dev, ino)) {
+		DEBUG(3, ("Could not lock share entry\n"));
+		talloc_free(lck);
+		return NULL;
+	}
+
+	talloc_set_destructor(lck, share_mode_lock_destructor);
+	return lck;
+}
+
 /*******************************************************************
  Print out a share mode.
 ********************************************************************/
@@ -900,12 +937,12 @@
  Return False on fail, True on success.
 ********************************************************************/
 
-BOOL modify_delete_flag( SMB_DEV_T dev, SMB_INO_T inode, BOOL delete_on_close)
+BOOL modify_delete_flag(struct share_mode_lock *lck, BOOL delete_on_close)
 {
 	TDB_DATA dbuf;
 	struct locking_data *data;
 	BOOL res;
-	TDB_DATA key = locking_key(dev, inode);
+	TDB_DATA key = locking_key(lck->dev, lck->ino);
 
 	/* read in the existing share modes */
 	dbuf = tdb_fetch(tdb, key);

Modified: trunk/source/smbd/trans2.c
===================================================================
--- trunk/source/smbd/trans2.c	2005-07-17 12:57:14 UTC (rev 8527)
+++ trunk/source/smbd/trans2.c	2005-07-17 13:20:26 UTC (rev 8528)
@@ -3515,6 +3515,9 @@
 
 NTSTATUS set_delete_on_close(files_struct *fsp, BOOL delete_on_close)
 {
+	struct share_mode_lock *lck;
+	NTSTATUS result = NT_STATUS_OK;
+
 	DEBUG(10,("set_delete_on_close: %s delete on close flag for "
 		  "fnum = %d, file %s\n",
 		  delete_on_close ? "Adding" : "Removing", fsp->fnum,
@@ -3523,19 +3526,20 @@
 	if (fsp->is_directory || fsp->is_stat)
 		return NT_STATUS_OK;
 
-	if (lock_share_entry_fsp(fsp) == False)
+	lck = get_share_mode_lock(NULL, fsp->dev, fsp->inode);
+	if (lck == NULL) {
 		return NT_STATUS_ACCESS_DENIED;
+	}
 
-	if (!modify_delete_flag(fsp->dev, fsp->inode, delete_on_close)) {
+	if (!modify_delete_flag(lck, delete_on_close)) {
 		DEBUG(0,("set_delete_on_close: failed to change delete "
 			 "on close flag for file %s\n",
 			 fsp->fsp_name ));
-		unlock_share_entry_fsp(fsp);
-		return NT_STATUS_ACCESS_DENIED;
+		result = NT_STATUS_ACCESS_DENIED;
 	}
 
-	unlock_share_entry_fsp(fsp);
-	return NT_STATUS_OK;
+	talloc_free(lck);
+	return result;
 }
 
 /****************************************************************************



More information about the samba-cvs mailing list