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