diff options
author | Volker Lendecke <vl@samba.org> | 2019-09-12 13:03:53 +0200 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2019-09-17 22:49:38 +0000 |
commit | e4a5a017c5d8c4aac14e3440f498374700dd7fbd (patch) | |
tree | 3c14a5a8a5fd94f1fb2d68e2121b41584089efd7 /source3/locking | |
parent | 6a58f29c6205d6a4cc7f98ad0f5c6ebf1dadd385 (diff) | |
download | samba-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.c | 38 |
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; } /******************************************************************* |