summaryrefslogtreecommitdiff
path: root/source3/locking
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2019-09-12 13:03:53 +0200
committerJeremy Allison <jra@samba.org>2019-09-17 22:49:38 +0000
commite4a5a017c5d8c4aac14e3440f498374700dd7fbd (patch)
tree3c14a5a8a5fd94f1fb2d68e2121b41584089efd7 /source3/locking
parent6a58f29c6205d6a4cc7f98ad0f5c6ebf1dadd385 (diff)
downloadsamba-e4a5a017c5d8c4aac14e3440f498374700dd7fbd.tar.gz
smbd: Use share_mode_forall_entries() in share_entry_forall()
Signed-off-by: Volker Lendecke <vl@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'source3/locking')
-rw-r--r--source3/locking/share_mode_lock.c38
1 files changed, 27 insertions, 11 deletions
diff --git a/source3/locking/share_mode_lock.c b/source3/locking/share_mode_lock.c
index 04698f20e39..92ba3fe046e 100644
--- a/source3/locking/share_mode_lock.c
+++ b/source3/locking/share_mode_lock.c
@@ -1027,33 +1027,49 @@ int share_mode_forall(int (*fn)(struct file_id fid,
}
struct share_entry_forall_state {
+ struct file_id fid;
+ const struct share_mode_data *data;
int (*fn)(struct file_id fid,
const struct share_mode_data *data,
const struct share_mode_entry *entry,
void *private_data);
void *private_data;
+ int ret;
};
+static bool share_entry_traverse_walker(
+ struct share_mode_entry *e,
+ bool *modified,
+ void *private_data)
+{
+ struct share_entry_forall_state *state = private_data;
+
+ state->ret = state->fn(
+ state->fid, state->data, e, state->private_data);
+ return (state->ret != 0);
+}
+
static int share_entry_traverse_fn(struct file_id fid,
const struct share_mode_data *data,
void *private_data)
{
struct share_entry_forall_state *state = private_data;
- uint32_t i;
+ struct share_mode_lock lck = {
+ .data = discard_const_p(struct share_mode_data, data)
+ };
+ bool ok;
- for (i=0; i<data->num_share_modes; i++) {
- int ret;
+ state->fid = fid;
+ state->data = data;
- ret = state->fn(fid,
- data,
- &data->share_modes[i],
- state->private_data);
- if (ret != 0) {
- return ret;
- }
+ ok = share_mode_forall_entries(
+ &lck, share_entry_traverse_walker, state);
+ if (!ok) {
+ DBG_DEBUG("share_mode_forall_entries failed\n");
+ return false;
}
- return 0;
+ return state->ret;
}
/*******************************************************************