From: Ralph Boehme Date: Tue, 17 Sep 2019 18:43:08 +0000 (-0700) Subject: s3/brlock: add brl_get_locks_for_cleanup() X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9aba1278302aead970f6f1e26eeaaf6a98ca1732;p=thirdparty%2Fsamba.git s3/brlock: add brl_get_locks_for_cleanup() Takes the file_id to locate the brl record instead of an fsp. Prepares for being called from the scavenger where we don't have fsps. Signed-off-by: Ralph Boehme Reviewed-by: Anoop C S --- diff --git a/source3/locking/brlock.c b/source3/locking/brlock.c index 3d99941d4f3..f0268968081 100644 --- a/source3/locking/brlock.c +++ b/source3/locking/brlock.c @@ -1727,7 +1727,8 @@ static bool brl_parse_data(struct byte_range_lock *br_lck, TDB_DATA data) TALLOC_FREE(brl) will release the lock in the destructor. ********************************************************************/ -struct byte_range_lock *brl_get_locks(TALLOC_CTX *mem_ctx, files_struct *fsp) +static struct byte_range_lock *brl_get_locks_internal(TALLOC_CTX *mem_ctx, + struct file_id *file_id) { TDB_DATA key, data; struct byte_range_lock *br_lck; @@ -1737,9 +1738,7 @@ struct byte_range_lock *brl_get_locks(TALLOC_CTX *mem_ctx, files_struct *fsp) return NULL; } - br_lck->fsp = fsp; - - key.dptr = (uint8_t *)&fsp->file_id; + key.dptr = (uint8_t *)file_id; key.dsize = sizeof(struct file_id); br_lck->record = dbwrap_fetch_locked(brlock_db, br_lck, key); @@ -1765,7 +1764,7 @@ struct byte_range_lock *brl_get_locks(TALLOC_CTX *mem_ctx, files_struct *fsp) struct lock_struct *locks = br_lck->lock_data; DBG_DEBUG("%u current locks on file_id %s\n", br_lck->num_locks, - file_id_str_buf(fsp->file_id, &buf)); + file_id_str_buf(*file_id, &buf)); for( i = 0; i < br_lck->num_locks; i++) { print_lock_struct(i, &locks[i]); } @@ -1774,6 +1773,25 @@ struct byte_range_lock *brl_get_locks(TALLOC_CTX *mem_ctx, files_struct *fsp) return br_lck; } +struct byte_range_lock *brl_get_locks(TALLOC_CTX *mem_ctx, + files_struct *fsp) +{ + struct byte_range_lock *brl = NULL; + + brl = brl_get_locks_internal(mem_ctx, &fsp->file_id); + if (brl == NULL) { + return NULL; + } + brl->fsp = fsp; + return brl; +} + +struct byte_range_lock *brl_get_locks_for_cleanup(TALLOC_CTX *mem_ctx, + struct file_id *file_id) +{ + return brl_get_locks_internal(mem_ctx, file_id); +} + struct brl_get_locks_readonly_state { TALLOC_CTX *mem_ctx; struct byte_range_lock **br_lock; diff --git a/source3/locking/proto.h b/source3/locking/proto.h index 0cb19a25a56..8c151a42090 100644 --- a/source3/locking/proto.h +++ b/source3/locking/proto.h @@ -103,6 +103,8 @@ NTSTATUS share_mode_do_locked_brl(files_struct *fsp, void *private_data); struct byte_range_lock *brl_get_locks(TALLOC_CTX *mem_ctx, files_struct *fsp); +struct byte_range_lock *brl_get_locks_for_cleanup(TALLOC_CTX *mem_ctx, + struct file_id *file_id); struct byte_range_lock *brl_get_locks_readonly(files_struct *fsp); bool brl_cleanup_disconnected(struct file_id fid, uint64_t open_persistent_id); void brl_set_modified(struct byte_range_lock *br_lck, bool modified);