Author: jra
Date: 2006-04-12 23:00:58 +0000 (Wed, 12 Apr 2006)
New Revision: 15060

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

Log:
The brlock code gets called a lot. Ensure we keep the
key around while we're using it - saves many calls to
locking_key() (now deleted).
Jeremy.

Modified:
   branches/SAMBA_3_0/source/include/smb.h
   branches/SAMBA_3_0/source/locking/brlock.c


Changeset:
Modified: branches/SAMBA_3_0/source/include/smb.h
===================================================================
--- branches/SAMBA_3_0/source/include/smb.h     2006-04-12 23:00:55 UTC (rev 
15059)
+++ branches/SAMBA_3_0/source/include/smb.h     2006-04-12 23:00:58 UTC (rev 
15060)
@@ -836,10 +836,18 @@
 enum brl_type {READ_LOCK, WRITE_LOCK, PENDING_LOCK, UNLOCK_LOCK};
 enum brl_flavour {WINDOWS_LOCK = 0, POSIX_LOCK = 1};
 
+/* The key used in the brlock database. */
+
+struct lock_key {
+       SMB_DEV_T device;
+       SMB_INO_T inode;
+};
+
 struct byte_range_lock {
        files_struct *fsp;
        unsigned int num_locks;
        BOOL modified;
+       struct lock_key key;
        void *lock_data;
 };
 

Modified: branches/SAMBA_3_0/source/locking/brlock.c
===================================================================
--- branches/SAMBA_3_0/source/locking/brlock.c  2006-04-12 23:00:55 UTC (rev 
15059)
+++ branches/SAMBA_3_0/source/locking/brlock.c  2006-04-12 23:00:58 UTC (rev 
15060)
@@ -55,13 +55,6 @@
        enum brl_flavour lock_flav;
 };
 
-/* The key used in the brlock database. */
-
-struct lock_key {
-       SMB_DEV_T device;
-       SMB_INO_T inode;
-};
-
 /* The open brlock.tdb database. */
 
 static TDB_CONTEXT *tdb;
@@ -87,23 +80,6 @@
 }
 
 /****************************************************************************
- Create a locking key - ensuring zero filled for pad purposes.
-****************************************************************************/
-
-static TDB_DATA locking_key(SMB_DEV_T dev, SMB_INO_T inode)
-{
-        static struct lock_key key;
-        TDB_DATA kbuf;
-
-        memset(&key, '\0', sizeof(key));
-        key.device = dev;
-        key.inode = inode;
-        kbuf.dptr = (char *)&key;
-        kbuf.dsize = sizeof(key);
-        return kbuf;
-}
-
-/****************************************************************************
  See if two locking contexts are equal.
 ****************************************************************************/
 
@@ -1332,8 +1308,11 @@
 {
        struct byte_range_lock *br_lck =
                talloc_get_type_abort(p, struct byte_range_lock);
-       TDB_DATA key = locking_key(br_lck->fsp->dev, br_lck->fsp->inode);
+       TDB_DATA key;
 
+       key.dptr = (char *)&br_lck->key;
+       key.dsize = sizeof(struct lock_key);
+
        if (!br_lck->modified) {
                goto done;
        }
@@ -1355,8 +1334,8 @@
 
  done:
 
-       SAFE_FREE(br_lck->lock_data);
        tdb_chainunlock(tdb, key);
+       SAFE_FREE(br_lck->lock_data);
        return 0;
 }
 
@@ -1368,11 +1347,10 @@
 struct byte_range_lock *brl_get_locks(TALLOC_CTX *mem_ctx,
                                        files_struct *fsp)
 {
-       TDB_DATA key = locking_key(fsp->dev, fsp->inode);
+       TDB_DATA key;
        TDB_DATA data;
-       struct byte_range_lock *br_lck;
+       struct byte_range_lock *br_lck = TALLOC_P(mem_ctx, struct 
byte_range_lock);
 
-       br_lck = TALLOC_P(mem_ctx, struct byte_range_lock);
        if (br_lck == NULL) {
                return NULL;
        }
@@ -1380,7 +1358,13 @@
        br_lck->fsp = fsp;
        br_lck->num_locks = 0;
        br_lck->modified = False;
+       memset(&br_lck->key, '\0', sizeof(struct lock_key));
+       br_lck->key.device = fsp->dev;
+       br_lck->key.inode = fsp->inode;
 
+       key.dptr = (char *)&br_lck->key;
+       key.dsize = sizeof(struct lock_key);
+
        if (tdb_chainlock(tdb, key) != 0) {
                DEBUG(3, ("Could not lock byte range lock entry\n"));
                TALLOC_FREE(br_lck);

Reply via email to