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