From eb99635d0f2a8dbd52d4a5143efe5a9716401b08 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 13 Aug 2019 15:09:51 +0200 Subject: [PATCH] smbd: Add share_mode_forall_entries() Abstract away the fact that we store the share modes as an array inside "struct share_mode_data". Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- source3/locking/locking.c | 47 +++++++++++++++++++++++++++++++++++++++ source3/locking/proto.h | 7 ++++++ 2 files changed, 54 insertions(+) diff --git a/source3/locking/locking.c b/source3/locking/locking.c index 547741ecbc7..e8820ee0356 100644 --- a/source3/locking/locking.c +++ b/source3/locking/locking.c @@ -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; inum_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 */ diff --git a/source3/locking/proto.h b/source3/locking/proto.h index f60655eb590..ae8768e68e9 100644 --- a/source3/locking/proto.h +++ b/source3/locking/proto.h @@ -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 */ -- 2.34.1