smbd: Add share_mode_forall_entries()
authorVolker Lendecke <vl@samba.org>
Tue, 13 Aug 2019 13:09:51 +0000 (15:09 +0200)
committerJeremy Allison <jra@samba.org>
Tue, 17 Sep 2019 22:49:36 +0000 (22:49 +0000)
Abstract away the fact that we store the share modes as an array inside
"struct share_mode_data".

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/locking/locking.c
source3/locking/proto.h

index 547741ecbc7e7250436b438406087d4d73960a7e..e8820ee03567effa13fa66f5ff993ad5ab793ff7 100644 (file)
@@ -1261,6 +1261,53 @@ bool file_has_open_streams(files_struct *fsp)
        return false;
 }
 
+bool share_mode_forall_entries(
+       struct share_mode_lock *lck,
+       bool (*fn)(struct share_mode_entry *e,
+                  bool *modified,
+                  void *private_data),
+       void *private_data)
+{
+       struct share_mode_data *d = lck->data;
+       uint32_t i;
+
+       for (i=0; i<d->num_share_modes; i++) {
+               struct share_mode_entry *e = &d->share_modes[i];
+               struct server_id pid = e->pid;
+               uint64_t share_file_id = e->share_file_id;
+               bool ok, stop;
+               bool modified = false;
+
+               ok = is_valid_share_mode_entry(e);
+               if (!ok) {
+                       continue;
+               }
+
+               stop = fn(e, &modified, private_data);
+
+               if (modified || e->stale) {
+                       d->modified = true;
+               }
+
+               if (modified) {
+                       /*
+                        * In a later commit we will sort the share
+                        * mode array keyed by pid and
+                        * share_file_id. Make sure that from within
+                        * this routine those values don't change.
+                        */
+                       SMB_ASSERT(server_id_equal(&pid, &e->pid));
+                       SMB_ASSERT(share_file_id == e->share_file_id);
+               }
+
+               if (stop) {
+                       return true;
+               }
+       }
+
+       return true;
+}
+
 /*
  * Walk share mode entries, looking at every lease only once
  */
index f60655eb590878918b98e62bb114ea207f4a4800..ae8768e68e91be96c9b6cd7db2a93bb2ca45e933 100644 (file)
@@ -223,6 +223,13 @@ bool share_mode_forall_leases(
                   void *private_data),
        void *private_data);
 
+bool share_mode_forall_entries(
+       struct share_mode_lock *lck,
+       bool (*fn)(struct share_mode_entry *e,
+                  bool *modified,
+                  void *private_data),
+       void *private_data);
+
 
 /* The following definitions come from locking/posix.c  */