]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
Next try at making the vuid cache circular
authorVolker Lendecke <vl@samba.org>
Wed, 7 May 2008 13:51:42 +0000 (15:51 +0200)
committerVolker Lendecke <vl@samba.org>
Sat, 10 May 2008 09:17:00 +0000 (11:17 +0200)
Jeremy, please check!
(This used to be commit a34f73521712e3820d417f0d9ed811723b7681d6)

source3/include/smb.h
source3/smbd/conn.c
source3/smbd/uid.c

index c7a13fb3a09ba226210ac6e91d2f4e1c03edb4fe..dd8513f704cec7e0157d90b7ccbc5ddefb052846 100644 (file)
@@ -532,7 +532,7 @@ struct vuid_cache_entry {
 };
 
 struct vuid_cache {
-       unsigned int entries;
+       unsigned int next_entry;
        struct vuid_cache_entry array[VUID_CACHE_SIZE];
 };
 
index af18e905c08576ec9b81ac6ed75e9cac304051fa..3baf0cfaabb8ccaa545688eae2bc9cc24a4d707d 100644 (file)
@@ -237,9 +237,12 @@ void conn_clear_vuid_cache(uint16 vuid)
                        conn->vuid = UID_FIELD_INVALID;
                }
 
-               for (i=0;i<conn->vuid_cache.entries && i< VUID_CACHE_SIZE;i++) {
-                       if (conn->vuid_cache.array[i].vuid == vuid) {
-                               struct vuid_cache_entry *ent = &conn->vuid_cache.array[i];
+               for (i=0; i<VUID_CACHE_SIZE; i++) {
+                       struct vuid_cache_entry *ent;
+
+                       ent = &conn->vuid_cache.array[i];
+
+                       if (ent->vuid == vuid) {
                                ent->vuid = UID_FIELD_INVALID;
                                ent->read_only = False;
                                ent->admin_user = False;
index 78dff8ffeeafa4a2d7018718b73b6bcfd0212ead..ce8aaa33ea35058d08e49982668f545d57fc0fd8 100644 (file)
@@ -65,9 +65,9 @@ static bool check_user_ok(connection_struct *conn, user_struct *vuser,int snum)
        bool readonly_share;
        NT_USER_TOKEN *token;
 
-       for (i=0;i<conn->vuid_cache.entries && i< VUID_CACHE_SIZE;i++) {
-               if (conn->vuid_cache.array[i].vuid == vuser->vuid) {
-                       ent = &conn->vuid_cache.array[i];
+       for (i=0; i<VUID_CACHE_SIZE; i++) {
+               ent = &conn->vuid_cache.array[i];
+               if (ent->vuid == vuser->vuid) {
                        conn->read_only = ent->read_only;
                        conn->admin_user = ent->admin_user;
                        return(True);
@@ -102,11 +102,11 @@ static bool check_user_ok(connection_struct *conn, user_struct *vuser,int snum)
                return False;
        }
 
-       i = conn->vuid_cache.entries % VUID_CACHE_SIZE;
-       if (conn->vuid_cache.entries < VUID_CACHE_SIZE)
-               conn->vuid_cache.entries++;
+       ent = &conn->vuid_cache.array[conn->vuid_cache.next_entry];
+
+       conn->vuid_cache.next_entry =
+               (conn->vuid_cache.next_entry + 1) % VUID_CACHE_SIZE;
 
-       ent = &conn->vuid_cache.array[i];
        ent->vuid = vuser->vuid;
        ent->read_only = readonly_share;