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;
 }
 
 /****************************************************************************

Reply via email to