The branch, master has been updated via bdda10875ed s3:smbd: skip write-time fetching for directories. via 436be09cfc1 smbd: Do boolean short-circuiting via 5427f73af58 smbd: Use dbwrap_do_locked() in fd_close_posix() via 4204ed2b82f smbd: Use dbwrap_do_locked() in add_fd_to_close_entry() via 92c2a723b27 dbwrap: Initialize state in dbwrap_delete() via b86df6d0591 lib: Remove an obsolete comment via a9d09d4bddb smbd: Fix DBG typo in find_delete_on_close_token() via 2448060072e smbd: Use file_id_str_buf() in close_remove_share_mode() via c88cb0a13bf smbd: Use file_id_str_buf() in setup_poll_open() via fd691fbc94c smbd: Use file_id_str_buf() in defer_open() via bf2bf5b1448 smbstatus: Use file_id_str_buf() in print_brl() via feccf9bb4f5 smbd: Use file_id_str_buf() in set_sticky_write_time() via d9263473b07 smbd: Use file_id_str_buf() in share_mode_str() via de8b93b4799 smbd: Use file_id_str_buf() in brl_cleanup_disconnected() via 49d18bbf29d smbd: Use file_id_str_buf() in brl_get_locks() via 7e70701ab0f vfs: Use file_id_str_buf() in xattr_tdb_setattr() via 5ca021bd85d vfs: Use file_id_str_buf() in xattr_tdb_getattr() via b09c216f5ae lib: Use file_id_str_buf() in file_id_string() via 049b8833ae8 lib: Add file_id_str_buf() via ba72d8231f8 lib: Properly #ifdef __LIB_FILE_ID_H__ from 95655fe683d vfs: restore stat fields in vfs_stat_fsp()
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit bdda10875ed1a21a66829206c77a1ffd998c9569 Author: Ralph Boehme <s...@samba.org> Date: Mon Sep 2 12:21:56 2019 +0200 s3:smbd: skip write-time fetching for directories. The whole logic only applies to files. Signed-off-by: Ralph Boehme <s...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Wed Sep 11 00:33:26 UTC 2019 on sn-devel-184 commit 436be09cfc17bcd26ae438608749a1d47acc1954 Author: Volker Lendecke <v...@samba.org> Date: Mon Sep 9 10:42:59 2019 +0200 smbd: Do boolean short-circuiting &= does bitwise AND, and does not do boolean short-circuiting if the variable is already 0. As has_other_nonposix_opens() might have its cost, this speeds up closing a handle. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 5427f73af58252f6aabb044dac267c799ec26eb6 Author: Volker Lendecke <v...@samba.org> Date: Mon Aug 26 16:22:23 2019 +0200 smbd: Use dbwrap_do_locked() in fd_close_posix() We don't need to make a copy of the fd array Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 4204ed2b82fd8e9f6faf6e05a009d0ad7742c649 Author: Volker Lendecke <v...@samba.org> Date: Fri Aug 23 18:11:57 2019 +0200 smbd: Use dbwrap_do_locked() in add_fd_to_close_entry() Less explicit talloc. Right now dbwrap_rbt behind the scenes does a dbwrap_fetch_locked(), but that will eventually change. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 92c2a723b278fb0338248bfb1fd1c1f4b90dce2b Author: Volker Lendecke <v...@samba.org> Date: Fri Aug 23 17:47:47 2019 +0200 dbwrap: Initialize state in dbwrap_delete() Probably not required, but looks safer and gives static checkers less reason to complain about potentially uninitialized variable reads Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit b86df6d0591d7d8f3c08d0fe0975839ba00c342c Author: Volker Lendecke <v...@samba.org> Date: Thu Sep 5 17:25:07 2019 +0200 lib: Remove an obsolete comment At least as of 2ac9d0afa66 ctdb does not care about db prios anymore Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit a9d09d4bddb2a66e146f8e157fda4d7dd160a8a4 Author: Volker Lendecke <v...@samba.org> Date: Tue Sep 3 16:40:00 2019 +0200 smbd: Fix DBG typo in find_delete_on_close_token() The routine isn't called find__delete_on_close_token. Also avoid casts. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 2448060072e9f82fc6b0d48109d70e4e491650ca Author: Volker Lendecke <v...@samba.org> Date: Mon Sep 9 16:34:10 2019 +0200 smbd: Use file_id_str_buf() in close_remove_share_mode() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit c88cb0a13bf2bd6ec8d144c60991643b225746d3 Author: Volker Lendecke <v...@samba.org> Date: Mon Sep 9 16:32:21 2019 +0200 smbd: Use file_id_str_buf() in setup_poll_open() While there, remove a pointless empty line Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit fd691fbc94cf8da744e70bca0165e6a8356cffc5 Author: Volker Lendecke <v...@samba.org> Date: Mon Sep 9 16:30:57 2019 +0200 smbd: Use file_id_str_buf() in defer_open() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit bf2bf5b1448be3c4c8c6492a036b46a5ccd55890 Author: Volker Lendecke <v...@samba.org> Date: Mon Sep 9 16:28:57 2019 +0200 smbstatus: Use file_id_str_buf() in print_brl() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit feccf9bb4f50bd777b0ff64700272a3496c68576 Author: Volker Lendecke <v...@samba.org> Date: Fri Sep 6 07:31:22 2019 +0200 smbd: Use file_id_str_buf() in set_sticky_write_time() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit d9263473b07abe106f79edda8f880183881b4cff Author: Volker Lendecke <v...@samba.org> Date: Fri Sep 6 07:29:10 2019 +0200 smbd: Use file_id_str_buf() in share_mode_str() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit de8b93b47992dc37821aa2bd83b34ba374ff0139 Author: Volker Lendecke <v...@samba.org> Date: Tue Sep 3 16:26:09 2019 +0200 smbd: Use file_id_str_buf() in brl_cleanup_disconnected() Also avoid some casts and use DBG_ instead of DEBUG() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 49d18bbf29dd00414fcd52ddeed72809ba4e9002 Author: Volker Lendecke <v...@samba.org> Date: Tue Sep 3 16:18:00 2019 +0200 smbd: Use file_id_str_buf() in brl_get_locks() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 7e70701ab0fd7fa03e79fad62a1903d4037e9852 Author: Volker Lendecke <v...@samba.org> Date: Tue Sep 3 16:15:40 2019 +0200 vfs: Use file_id_str_buf() in xattr_tdb_setattr() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 5ca021bd85db7f645b963bbeb89cf6d09ed398f4 Author: Volker Lendecke <v...@samba.org> Date: Tue Sep 3 16:14:28 2019 +0200 vfs: Use file_id_str_buf() in xattr_tdb_getattr() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit b09c216f5aeea3c41722b938213572012290a543 Author: Volker Lendecke <v...@samba.org> Date: Tue Sep 3 16:12:35 2019 +0200 lib: Use file_id_str_buf() in file_id_string() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 049b8833ae885412db3ce2d41c9e26134b4e7e7e Author: Volker Lendecke <v...@samba.org> Date: Mon Sep 2 19:04:25 2019 +0200 lib: Add file_id_str_buf() file_id_string() without talloc Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit ba72d8231f836e364304996467f088e1ea8ca448 Author: Volker Lendecke <v...@samba.org> Date: Mon Sep 2 19:04:42 2019 +0200 lib: Properly #ifdef __LIB_FILE_ID_H__ Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> ----------------------------------------------------------------------- Summary of changes: lib/dbwrap/dbwrap.c | 2 +- lib/dbwrap/dbwrap.h | 4 - source3/lib/file_id.c | 17 ++++- source3/lib/file_id.h | 12 +++ source3/lib/xattr_tdb.c | 10 ++- source3/locking/brlock.c | 54 +++++++------- source3/locking/locking.c | 15 ++-- source3/locking/posix.c | 141 ++++++++++++------------------------ source3/smbd/close.c | 17 ++--- source3/smbd/dir.c | 2 +- source3/smbd/open.c | 7 +- source3/smbd/smb2_query_directory.c | 4 +- source3/utils/status.c | 4 +- 13 files changed, 134 insertions(+), 155 deletions(-) Changeset truncated at 500 lines: diff --git a/lib/dbwrap/dbwrap.c b/lib/dbwrap/dbwrap.c index f8eefcca02d..3d8d2ae78d7 100644 --- a/lib/dbwrap/dbwrap.c +++ b/lib/dbwrap/dbwrap.c @@ -339,7 +339,7 @@ static void dbwrap_delete_fn(struct db_record *rec, void *private_data) NTSTATUS dbwrap_delete(struct db_context *db, TDB_DATA key) { - struct dbwrap_delete_state state; + struct dbwrap_delete_state state = { .status = NT_STATUS_NOT_FOUND }; NTSTATUS status; status = dbwrap_do_locked(db, key, dbwrap_delete_fn, &state); diff --git a/lib/dbwrap/dbwrap.h b/lib/dbwrap/dbwrap.h index 6a0f7b1ee2e..42998b78139 100644 --- a/lib/dbwrap/dbwrap.h +++ b/lib/dbwrap/dbwrap.h @@ -31,10 +31,6 @@ struct db_context; enum dbwrap_lock_order { DBWRAP_LOCK_ORDER_NONE = 0, /* Don't check lock orders for this db. */ - /* - * We only allow orders 1, 2, 3: - * These are the orders that CTDB currently supports. - */ DBWRAP_LOCK_ORDER_1 = 1, DBWRAP_LOCK_ORDER_2 = 2, DBWRAP_LOCK_ORDER_3 = 3 diff --git a/source3/lib/file_id.c b/source3/lib/file_id.c index 21f22ffbf3b..49e5c50385f 100644 --- a/source3/lib/file_id.c +++ b/source3/lib/file_id.c @@ -39,15 +39,24 @@ const char *file_id_string_tos(const struct file_id *id) return file_id_string(talloc_tos(), id); } +char *file_id_str_buf(struct file_id fid, struct file_id_buf *dst) +{ + snprintf(dst->buf, + sizeof(dst->buf), + "%"PRIu64":%"PRIu64":%"PRIu64, + fid.devid, + fid.inode, + fid.extid); + return dst->buf; +} + /* an allocated string for a file_id structure */ const char *file_id_string(TALLOC_CTX *mem_ctx, const struct file_id *id) { - char *result = talloc_asprintf(mem_ctx, "%llx:%llx:%llx", - (unsigned long long)id->devid, - (unsigned long long)id->inode, - (unsigned long long)id->extid); + struct file_id_buf buf; + char *result = talloc_strdup(mem_ctx, file_id_str_buf(*id, &buf)); SMB_ASSERT(result != NULL); return result; } diff --git a/source3/lib/file_id.h b/source3/lib/file_id.h index 509e924c1fe..c001199a35b 100644 --- a/source3/lib/file_id.h +++ b/source3/lib/file_id.h @@ -19,11 +19,21 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#ifndef __LIB_FILE_ID_H__ +#define __LIB_FILE_ID_H__ + #include "librpc/gen_ndr/file_id.h" /* The following definitions come from lib/file_id.c */ bool file_id_equal(const struct file_id *id1, const struct file_id *id2); + +/* + * strlen("18446744073709551615")=20 times 3 plus 2 colons plus trailing 0 + */ +struct file_id_buf { char buf[63]; }; +char *file_id_str_buf(struct file_id fid, struct file_id_buf *dst); + /* a static-like (on talloc_tos()) string for a file_id structure */ @@ -40,3 +50,5 @@ void pull_file_id_24(const char *buf, struct file_id *id); * Make a SMB File-ID from itime */ uint64_t make_file_id_from_itime(SMB_STRUCT_STAT *st); + +#endif diff --git a/source3/lib/xattr_tdb.c b/source3/lib/xattr_tdb.c index f3a2e19bf5d..564cdd80965 100644 --- a/source3/lib/xattr_tdb.c +++ b/source3/lib/xattr_tdb.c @@ -181,9 +181,10 @@ ssize_t xattr_tdb_getattr(struct db_context *db_ctx, ssize_t result = -1; NTSTATUS status; TALLOC_CTX *frame = talloc_stackframe(); + struct file_id_buf buf; - DEBUG(10, ("xattr_tdb_getattr called for file %s, name %s\n", - file_id_string(frame, id), name)); + DBG_DEBUG("xattr_tdb_getattr called for file %s, name %s\n", + file_id_str_buf(*id, &buf), name); status = xattr_tdb_load_attrs(frame, db_ctx, id, &attribs); @@ -229,9 +230,10 @@ int xattr_tdb_setattr(struct db_context *db_ctx, uint32_t i; TDB_DATA data; TALLOC_CTX *frame = talloc_stackframe(); + struct file_id_buf buf; - DEBUG(10, ("xattr_tdb_setattr called for file %s, name %s\n", - file_id_string(frame, id), name)); + DBG_DEBUG("xattr_tdb_setattr called for file %s, name %s\n", + file_id_str_buf(*id, &buf), name); rec = xattr_tdb_lock_attrs(frame, db_ctx, id); diff --git a/source3/locking/brlock.c b/source3/locking/brlock.c index f22580164f9..f3fb75ef136 100644 --- a/source3/locking/brlock.c +++ b/source3/locking/brlock.c @@ -1832,10 +1832,11 @@ struct byte_range_lock *brl_get_locks(TALLOC_CTX *mem_ctx, files_struct *fsp) if (DEBUGLEVEL >= 10) { unsigned int i; + struct file_id_buf buf; struct lock_struct *locks = br_lck->lock_data; - DEBUG(10,("brl_get_locks_internal: %u current locks on file_id %s\n", - br_lck->num_locks, - file_id_string_tos(&fsp->file_id))); + DBG_DEBUG("%u current locks on file_id %s\n", + br_lck->num_locks, + file_id_str_buf(fsp->file_id, &buf)); for( i = 0; i < br_lck->num_locks; i++) { print_lock_struct(i, &locks[i]); } @@ -1961,14 +1962,15 @@ bool brl_cleanup_disconnected(struct file_id fid, uint64_t open_persistent_id) struct db_record *rec; struct lock_struct *lock; unsigned n, num; + struct file_id_buf buf; NTSTATUS status; key = make_tdb_data((void*)&fid, sizeof(fid)); rec = dbwrap_fetch_locked(brlock_db, frame, key); if (rec == NULL) { - DEBUG(5, ("brl_cleanup_disconnected: failed to fetch record " - "for file %s\n", file_id_string(frame, &fid))); + DBG_INFO("failed to fetch record for file %s\n", + file_id_str_buf(fid, &buf)); goto done; } @@ -1976,8 +1978,8 @@ bool brl_cleanup_disconnected(struct file_id fid, uint64_t open_persistent_id) lock = (struct lock_struct*)val.dptr; num = val.dsize / sizeof(struct lock_struct); if (lock == NULL) { - DEBUG(10, ("brl_cleanup_disconnected: no byte range locks for " - "file %s\n", file_id_string(frame, &fid))); + DBG_DEBUG("no byte range locks for file %s\n", + file_id_str_buf(fid, &buf)); ret = true; goto done; } @@ -1987,38 +1989,38 @@ bool brl_cleanup_disconnected(struct file_id fid, uint64_t open_persistent_id) if (!server_id_is_disconnected(&ctx->pid)) { struct server_id_buf tmp; - DEBUG(5, ("brl_cleanup_disconnected: byte range lock " - "%s used by server %s, do not cleanup\n", - file_id_string(frame, &fid), - server_id_str_buf(ctx->pid, &tmp))); + DBG_INFO("byte range lock " + "%s used by server %s, do not cleanup\n", + file_id_str_buf(fid, &buf), + server_id_str_buf(ctx->pid, &tmp)); goto done; } if (ctx->smblctx != open_persistent_id) { - DEBUG(5, ("brl_cleanup_disconnected: byte range lock " - "%s expected smblctx %llu but found %llu" - ", do not cleanup\n", - file_id_string(frame, &fid), - (unsigned long long)open_persistent_id, - (unsigned long long)ctx->smblctx)); + DBG_INFO("byte range lock %s expected smblctx %"PRIu64" " + "but found %"PRIu64", do not cleanup\n", + file_id_str_buf(fid, &buf), + open_persistent_id, + ctx->smblctx); goto done; } } status = dbwrap_record_delete(rec); if (!NT_STATUS_IS_OK(status)) { - DEBUG(5, ("brl_cleanup_disconnected: failed to delete record " - "for file %s from %s, open %llu: %s\n", - file_id_string(frame, &fid), dbwrap_name(brlock_db), - (unsigned long long)open_persistent_id, - nt_errstr(status))); + DBG_INFO("failed to delete record " + "for file %s from %s, open %"PRIu64": %s\n", + file_id_str_buf(fid, &buf), + dbwrap_name(brlock_db), + open_persistent_id, + nt_errstr(status)); goto done; } - DEBUG(10, ("brl_cleanup_disconnected: " - "file %s cleaned up %u entries from open %llu\n", - file_id_string(frame, &fid), num, - (unsigned long long)open_persistent_id)); + DBG_DEBUG("file %s cleaned up %u entries from open %"PRIu64"\n", + file_id_str_buf(fid, &buf), + num, + open_persistent_id); ret = true; done: diff --git a/source3/locking/locking.c b/source3/locking/locking.c index 3ed63cdec41..72235113fbb 100644 --- a/source3/locking/locking.c +++ b/source3/locking/locking.c @@ -442,6 +442,7 @@ char *share_mode_str(TALLOC_CTX *ctx, int num, const struct share_mode_entry *e) { struct server_id_buf tmp; + struct file_id_buf ftmp; return talloc_asprintf(ctx, "share_mode_entry[%d]: " "pid = %s, share_access = 0x%x, private_options = 0x%x, " @@ -453,7 +454,7 @@ char *share_mode_str(TALLOC_CTX *ctx, int num, e->access_mask, (unsigned long long)e->op_mid, e->op_type, (unsigned long long)e->share_file_id, (unsigned int)e->uid, (unsigned int)e->flags, - file_id_string_tos(id), + file_id_str_buf(*id, &ftmp), (unsigned int)e->name_hash); } @@ -1123,14 +1124,13 @@ static struct delete_token *find_delete_on_close_token( { uint32_t i; - DEBUG(10, ("find_delete_on_close_token: name_hash = 0x%x\n", - (unsigned int)name_hash)); + DBG_DEBUG("name_hash = 0x%"PRIx32"\n", name_hash); for (i=0; i<d->num_delete_tokens; i++) { struct delete_token *dt = &d->delete_tokens[i]; - DEBUG(10, ("find__delete_on_close_token: dt->name_hash = 0x%x\n", - (unsigned int)dt->name_hash )); + DBG_DEBUG("dt->name_hash = 0x%"PRIx32"\n", + dt->name_hash); if (dt->name_hash == name_hash) { return dt; } @@ -1167,11 +1167,12 @@ bool is_delete_on_close_set(struct share_mode_lock *lck, uint32_t name_hash) bool set_sticky_write_time(struct file_id fileid, struct timespec write_time) { struct share_mode_lock *lck; + struct file_id_buf ftmp; - DEBUG(5,("set_sticky_write_time: %s id=%s\n", + DBG_INFO("%s id=%s\n", timestring(talloc_tos(), convert_timespec_to_time_t(write_time)), - file_id_string_tos(&fileid))); + file_id_str_buf(fileid, &ftmp)); lck = get_existing_share_mode_lock(talloc_tos(), fileid); if (lck == NULL) { diff --git a/source3/locking/posix.c b/source3/locking/posix.c index a7bb5519bb4..3b75cfe481a 100644 --- a/source3/locking/posix.c +++ b/source3/locking/posix.c @@ -508,93 +508,64 @@ static void delete_lock_ref_count(const files_struct *fsp) ref count is non zero. ****************************************************************************/ -/**************************************************************************** - Add an fd to the pending close db. -****************************************************************************/ +struct add_fd_to_close_entry_state { + const struct files_struct *fsp; +}; -static void add_fd_to_close_entry(const files_struct *fsp) +static void add_fd_to_close_entry_fn( + struct db_record *rec, void *private_data) { - struct db_record *rec; - int *fds; - size_t num_fds; + struct add_fd_to_close_entry_state *state = private_data; + TDB_DATA values[] = { + dbwrap_record_get_value(rec), + { .dptr = (uint8_t *)&(state->fsp->fh->fd), + .dsize = sizeof(state->fsp->fh->fd) }, + }; NTSTATUS status; - TDB_DATA value; - - rec = dbwrap_fetch_locked( - posix_pending_close_db, talloc_tos(), - fd_array_key_fsp(fsp)); - - SMB_ASSERT(rec != NULL); - - value = dbwrap_record_get_value(rec); - SMB_ASSERT((value.dsize % sizeof(int)) == 0); - - num_fds = value.dsize / sizeof(int); - fds = talloc_array(rec, int, num_fds+1); - - SMB_ASSERT(fds != NULL); - - memcpy(fds, value.dptr, value.dsize); - fds[num_fds] = fsp->fh->fd; - status = dbwrap_record_store( - rec, make_tdb_data((uint8_t *)fds, talloc_get_size(fds)), 0); + SMB_ASSERT((values[0].dsize % sizeof(int)) == 0); + status = dbwrap_record_storev(rec, values, ARRAY_SIZE(values), 0); SMB_ASSERT(NT_STATUS_IS_OK(status)); - - TALLOC_FREE(rec); - - DEBUG(10,("add_fd_to_close_entry: added fd %d file %s\n", - fsp->fh->fd, fsp_str_dbg(fsp))); } /**************************************************************************** - Remove all fd entries for a specific dev/inode pair from the tdb. + Add an fd to the pending close db. ****************************************************************************/ -static void delete_close_entries(const files_struct *fsp) +static void add_fd_to_close_entry(const files_struct *fsp) { - struct db_record *rec; + struct add_fd_to_close_entry_state state = { .fsp = fsp }; + NTSTATUS status; - rec = dbwrap_fetch_locked( - posix_pending_close_db, talloc_tos(), - fd_array_key_fsp(fsp)); + status = dbwrap_do_locked( + posix_pending_close_db, + fd_array_key_fsp(fsp), + add_fd_to_close_entry_fn, + &state); + SMB_ASSERT(NT_STATUS_IS_OK(status)); - SMB_ASSERT(rec != NULL); - dbwrap_record_delete(rec); - TALLOC_FREE(rec); + DBG_DEBUG("added fd %d file %s\n", + fsp->fh->fd, + fsp_str_dbg(fsp)); } -/**************************************************************************** - Get the array of POSIX pending close records for an open fsp. Returns number - of entries. -****************************************************************************/ - -static size_t get_posix_pending_close_entries(TALLOC_CTX *mem_ctx, - const files_struct *fsp, - int **entries) +static void fd_close_posix_fn( + struct db_record *rec, void *private_data) { - TDB_DATA dbuf; - NTSTATUS status; + TDB_DATA data = dbwrap_record_get_value(rec); + size_t num_fds, i; - status = dbwrap_fetch( - posix_pending_close_db, mem_ctx, fd_array_key_fsp(fsp), - &dbuf); + SMB_ASSERT((data.dsize % sizeof(int)) == 0); + num_fds = data.dsize / sizeof(int); - if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND)) { - *entries = NULL; - return 0; - } - - SMB_ASSERT(NT_STATUS_IS_OK(status)); - - if (dbuf.dsize == 0) { - *entries = NULL; - return 0; + for (i=0; i<num_fds; i++) { + int fd; + memcpy(&fd, data.dptr, sizeof(int)); + close(fd); + data.dptr += sizeof(int); } - - *entries = (int *)dbuf.dptr; - return (size_t)(dbuf.dsize / sizeof(int)); + dbwrap_record_delete(rec); } /**************************************************************************** @@ -607,8 +578,7 @@ int fd_close_posix(const struct files_struct *fsp) { int saved_errno = 0; int ret; - int *fd_array = NULL; - size_t count, i; + NTSTATUS status; if (!lp_locking(fsp->conn->params) || !lp_posix_locking(fsp->conn->params) || @@ -635,33 +605,16 @@ int fd_close_posix(const struct files_struct *fsp) return 0; } - /* - * No outstanding locks. Get the pending close fd's - * from the db and close them all. - */ - - count = get_posix_pending_close_entries(talloc_tos(), fsp, &fd_array); - - if (count) { - DEBUG(10,("fd_close_posix: doing close on %u fd's.\n", - (unsigned int)count)); - - for(i = 0; i < count; i++) { - if (close(fd_array[i]) == -1) { - saved_errno = errno; - } - } - - /* - * Delete all fd's stored in the db - * for this dev/inode pair. - */ - - delete_close_entries(fsp); + status = dbwrap_do_locked( + posix_pending_close_db, + fd_array_key_fsp(fsp), + fd_close_posix_fn, + NULL); + if (!NT_STATUS_IS_OK(status)) { + DBG_WARNING("dbwrap_do_locked failed: %s\n", + nt_errstr(status)); } - TALLOC_FREE(fd_array); - /* Don't need a lock ref count on this dev/ino anymore. */ delete_lock_ref_count(fsp); diff --git a/source3/smbd/close.c b/source3/smbd/close.c index 12d7f8c9a95..9786c826439 100644 --- a/source3/smbd/close.c +++ b/source3/smbd/close.c @@ -350,9 +350,8 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp, } } - delete_file = is_delete_on_close_set(lck, fsp->name_hash); - - delete_file &= !has_other_nonposix_opens(lck, fsp); + delete_file = is_delete_on_close_set(lck, fsp->name_hash) && + !has_other_nonposix_opens(lck, fsp); /* * NT can set delete_on_close of the last open @@ -421,14 +420,15 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp, id = vfs_file_id_from_sbuf(conn, &fsp->fsp_name->st); if (!file_id_equal(&fsp->file_id, &id)) { + struct file_id_buf ftmp1, ftmp2; DEBUG(5,("close_remove_share_mode: file %s. Delete on close " "was set and dev and/or inode does not match\n", fsp_str_dbg(fsp))); DEBUG(5,("close_remove_share_mode: file %s. stored file_id %s, " "stat file_id %s\n", fsp_str_dbg(fsp), - file_id_string_tos(&fsp->file_id), - file_id_string_tos(&id))); -- Samba Shared Repository