The branch, master has been updated via 4676e7f dbwrap: don't ignore the result of dbwrap_parse_record in dbwrap_fetch_int32() via 0f25bd7 dbwrap: intialize state.status in dbwrap_fetch_int32() via d7b9e0d dbwrap: Convert fetch_int32 to dbwrap_parse_record via 770d9af s3: Remove reduce_windows_lock_ref_count, used only once via 89b2eb1 s3: Make reduce_windows_lock_ref_count static via 6658a2f s3: Use dbwrap_util for windows_lock_ref_count via e0abd19 dbwrap: Add dbwrap_fetch_int32 via ce7b0b9 dbwrap: Add dbwrap_change_int32_atomic via 688cda1 script/autobuild: fix path to random-sleep.sh from ea74131 selftest/knownfail: mark ^samba4.raw.session.expire1 as knownfail
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 4676e7f65df5e6743ed2319e64d787429c23faf0 Author: Stefan Metzmacher <me...@samba.org> Date: Fri Jun 22 15:10:00 2012 +0200 dbwrap: don't ignore the result of dbwrap_parse_record in dbwrap_fetch_int32() metze Autobuild-User(master): Stefan Metzmacher <me...@samba.org> Autobuild-Date(master): Fri Jun 22 17:10:52 CEST 2012 on sn-devel-104 commit 0f25bd78ca0ddbeff971d72791687ab25d6b33e4 Author: Stefan Metzmacher <me...@samba.org> Date: Fri Jun 22 15:08:22 2012 +0200 dbwrap: intialize state.status in dbwrap_fetch_int32() This might not be needed, but it makes it more clear that we won't use uninitialized memory, it the callback was not triggered. metze commit d7b9e0d19a72783b45610dcf006571817338b50f Author: Volker Lendecke <v...@samba.org> Date: Tue Jun 12 12:58:47 2012 +0200 dbwrap: Convert fetch_int32 to dbwrap_parse_record Now dbwrap_fetch_int32 is used in smbd/locking/posix.c is used a lot more often than before. Signed-off-by: Stefan Metzmacher <me...@samba.org> commit 770d9affd721f05c4729d26dbc674cac491fba7c Author: Volker Lendecke <v...@samba.org> Date: Tue Jun 12 12:14:59 2012 +0200 s3: Remove reduce_windows_lock_ref_count, used only once Signed-off-by: Stefan Metzmacher <me...@samba.org> commit 89b2eb1d06f543388fce9239bcd209fc367d0cad Author: Volker Lendecke <v...@samba.org> Date: Tue Jun 12 12:13:15 2012 +0200 s3: Make reduce_windows_lock_ref_count static Signed-off-by: Stefan Metzmacher <me...@samba.org> commit 6658a2f6ef0e1bd10aa0b4913bb51636fa968586 Author: Volker Lendecke <v...@samba.org> Date: Tue Jun 12 12:11:40 2012 +0200 s3: Use dbwrap_util for windows_lock_ref_count Signed-off-by: Stefan Metzmacher <me...@samba.org> commit e0abd1938a05185f09ee99e000783320647a744a Author: Volker Lendecke <v...@samba.org> Date: Fri Jun 15 10:52:07 2012 +0200 dbwrap: Add dbwrap_fetch_int32 Signed-off-by: Stefan Metzmacher <me...@samba.org> commit ce7b0b9906685740e18c599cb3b453f58c8565d1 Author: Volker Lendecke <v...@samba.org> Date: Fri Jun 15 10:50:00 2012 +0200 dbwrap: Add dbwrap_change_int32_atomic Signed-off-by: Stefan Metzmacher <me...@samba.org> commit 688cda19ba68db8a7557ffe8cbf6e3c79eae74f9 Author: Stefan Metzmacher <me...@samba.org> Date: Fri Jun 22 14:58:25 2012 +0200 script/autobuild: fix path to random-sleep.sh metze ----------------------------------------------------------------------- Summary of changes: lib/dbwrap/dbwrap.h | 6 ++ lib/dbwrap/dbwrap_util.c | 69 +++++++++++++++++++------- script/autobuild.py | 16 +++--- source3/locking/posix.c | 122 ++++++++------------------------------------- source3/locking/proto.h | 1 - 5 files changed, 86 insertions(+), 128 deletions(-) Changeset truncated at 500 lines: diff --git a/lib/dbwrap/dbwrap.h b/lib/dbwrap/dbwrap.h index 30c24fe..5244ff2 100644 --- a/lib/dbwrap/dbwrap.h +++ b/lib/dbwrap/dbwrap.h @@ -93,6 +93,8 @@ NTSTATUS dbwrap_store_bystring(struct db_context *db, const char *key, NTSTATUS dbwrap_fetch_bystring(struct db_context *db, TALLOC_CTX *mem_ctx, const char *key, TDB_DATA *value); +NTSTATUS dbwrap_fetch_int32(struct db_context *db, TDB_DATA key, + int32_t *result); NTSTATUS dbwrap_fetch_int32_bystring(struct db_context *db, const char *keystr, int32_t *result); NTSTATUS dbwrap_store_int32_bystring(struct db_context *db, const char *keystr, @@ -109,6 +111,10 @@ NTSTATUS dbwrap_trans_change_uint32_atomic_bystring(struct db_context *db, const char *keystr, uint32_t *oldval, uint32_t change_val); +NTSTATUS dbwrap_change_int32_atomic(struct db_context *db, + TDB_DATA key, + int32_t *oldval, + int32_t change_val); NTSTATUS dbwrap_change_int32_atomic_bystring(struct db_context *db, const char *keystr, int32_t *oldval, diff --git a/lib/dbwrap/dbwrap_util.c b/lib/dbwrap/dbwrap_util.c index 8e6498d..119c7e1 100644 --- a/lib/dbwrap/dbwrap_util.c +++ b/lib/dbwrap/dbwrap_util.c @@ -26,29 +26,52 @@ #include "dbwrap.h" #include "lib/util/util_tdb.h" -NTSTATUS dbwrap_fetch_int32_bystring(struct db_context *db, const char *keystr, - int32_t *result) +struct dbwrap_fetch_int32_state { + NTSTATUS status; + int32_t result; +}; + +static void dbwrap_fetch_int32_parser(TDB_DATA key, TDB_DATA data, + void *private_data) { - TDB_DATA dbuf; + struct dbwrap_fetch_int32_state *state = + (struct dbwrap_fetch_int32_state *)private_data; + + if (data.dsize != sizeof(state->result)) { + state->status = NT_STATUS_INTERNAL_DB_CORRUPTION; + return; + } + state->result = IVAL(data.dptr, 0); + state->status = NT_STATUS_OK; +} + +NTSTATUS dbwrap_fetch_int32(struct db_context *db, TDB_DATA key, + int32_t *result) +{ + struct dbwrap_fetch_int32_state state; NTSTATUS status; if (result == NULL) { return NT_STATUS_INVALID_PARAMETER; } - status = dbwrap_fetch_bystring(db, talloc_tos(), keystr, &dbuf); + state.status = NT_STATUS_INTERNAL_ERROR; + + status = dbwrap_parse_record(db, key, dbwrap_fetch_int32_parser, &state); if (!NT_STATUS_IS_OK(status)) { return status; } - if ((dbuf.dptr == NULL) || (dbuf.dsize != sizeof(int32_t))) { - TALLOC_FREE(dbuf.dptr); - return NT_STATUS_NOT_FOUND; + if (NT_STATUS_IS_OK(state.status)) { + *result = state.result; } + return state.status; +} - *result = IVAL(dbuf.dptr, 0); - TALLOC_FREE(dbuf.dptr); - return NT_STATUS_OK; +NTSTATUS dbwrap_fetch_int32_bystring(struct db_context *db, const char *keystr, + int32_t *result) +{ + return dbwrap_fetch_int32(db, string_term_tdb_data(keystr), result); } NTSTATUS dbwrap_store_int32_bystring(struct db_context *db, const char *keystr, @@ -223,7 +246,7 @@ NTSTATUS dbwrap_trans_change_uint32_atomic_bystring(struct db_context *db, */ struct dbwrap_change_int32_atomic_context { - const char *keystr; + TDB_DATA key; int32_t *oldval; int32_t change_val; }; @@ -240,8 +263,7 @@ static NTSTATUS dbwrap_change_int32_atomic_action(struct db_context *db, state = (struct dbwrap_change_int32_atomic_context *)private_data; - rec = dbwrap_fetch_locked(db, talloc_tos(), - string_term_tdb_data(state->keystr)); + rec = dbwrap_fetch_locked(db, talloc_tos(), state->key); if (!rec) { return NT_STATUS_UNSUCCESSFUL; } @@ -272,15 +294,15 @@ done: return ret; } -NTSTATUS dbwrap_change_int32_atomic_bystring(struct db_context *db, - const char *keystr, - int32_t *oldval, - int32_t change_val) +NTSTATUS dbwrap_change_int32_atomic(struct db_context *db, + TDB_DATA key, + int32_t *oldval, + int32_t change_val) { NTSTATUS ret; struct dbwrap_change_int32_atomic_context state; - state.keystr = keystr; + state.key = key; state.oldval = oldval; state.change_val = change_val; @@ -289,6 +311,15 @@ NTSTATUS dbwrap_change_int32_atomic_bystring(struct db_context *db, return ret; } +NTSTATUS dbwrap_change_int32_atomic_bystring(struct db_context *db, + const char *keystr, + int32_t *oldval, + int32_t change_val) +{ + return dbwrap_change_int32_atomic(db, string_term_tdb_data(keystr), + oldval, change_val); +} + NTSTATUS dbwrap_trans_change_int32_atomic_bystring(struct db_context *db, const char *keystr, int32_t *oldval, @@ -297,7 +328,7 @@ NTSTATUS dbwrap_trans_change_int32_atomic_bystring(struct db_context *db, NTSTATUS ret; struct dbwrap_change_int32_atomic_context state; - state.keystr = keystr; + state.key = string_term_tdb_data(keystr); state.oldval = oldval; state.change_val = change_val; diff --git a/script/autobuild.py b/script/autobuild.py index 92fa413..ae58fcd 100755 --- a/script/autobuild.py +++ b/script/autobuild.py @@ -52,7 +52,7 @@ tasks = { ("check-clean-tree", "../script/clean-source-tree.sh", "text/plain"), ("clean", "make clean", "text/plain") ], - "samba3-ctdb" : [ ("random-sleep", "script/random-sleep.sh 60 600", "text/plain"), + "samba3-ctdb" : [ ("random-sleep", "../script/random-sleep.sh 60 600", "text/plain"), ("autogen", "./autogen.sh", "text/plain"), ("configure", "./configure.developer ${PREFIX} --with-cluster-support --with-ctdb=../ctdb", "text/plain"), ("make basics", "make basics", "text/plain"), @@ -110,7 +110,7 @@ tasks = { ("install", "make install", "text/plain")], "ldb" : [ - ("random-sleep", "script/random-sleep.sh 60 600", "text/plain"), + ("random-sleep", "../../script/random-sleep.sh 60 600", "text/plain"), ("configure", "./configure --enable-developer -C ${PREFIX}", "text/plain"), ("make", "make", "text/plain"), ("install", "make install", "text/plain"), @@ -120,7 +120,7 @@ tasks = { ("clean", "make clean", "text/plain") ], "tdb" : [ - ("random-sleep", "script/random-sleep.sh 60 600", "text/plain"), + ("random-sleep", "../../script/random-sleep.sh 60 600", "text/plain"), ("configure", "./configure --enable-developer -C ${PREFIX}", "text/plain"), ("make", "make", "text/plain"), ("install", "make install", "text/plain"), @@ -130,7 +130,7 @@ tasks = { ("clean", "make clean", "text/plain") ], "ntdb" : [ - ("random-sleep", "script/random-sleep.sh 60 600", "text/plain"), + ("random-sleep", "../../script/random-sleep.sh 60 600", "text/plain"), ("configure", "./configure --enable-developer -C ${PREFIX}", "text/plain"), ("make", "make", "text/plain"), ("install", "make install", "text/plain"), @@ -140,7 +140,7 @@ tasks = { ("clean", "make clean", "text/plain") ], "talloc" : [ - ("random-sleep", "script/random-sleep.sh 60 600", "text/plain"), + ("random-sleep", "../../script/random-sleep.sh 60 600", "text/plain"), ("configure", "./configure --enable-developer -C ${PREFIX}", "text/plain"), ("make", "make", "text/plain"), ("install", "make install", "text/plain"), @@ -150,7 +150,7 @@ tasks = { ("clean", "make clean", "text/plain") ], "replace" : [ - ("random-sleep", "script/random-sleep.sh 60 600", "text/plain"), + ("random-sleep", "../../script/random-sleep.sh 60 600", "text/plain"), ("configure", "./configure --enable-developer -C ${PREFIX}", "text/plain"), ("make", "make", "text/plain"), ("install", "make install", "text/plain"), @@ -160,7 +160,7 @@ tasks = { ("clean", "make clean", "text/plain") ], "tevent" : [ - ("random-sleep", "script/random-sleep.sh 60 600", "text/plain"), + ("random-sleep", "../../script/random-sleep.sh 60 600", "text/plain"), ("configure", "./configure --enable-developer -C ${PREFIX}", "text/plain"), ("make", "make", "text/plain"), ("install", "make install", "text/plain"), @@ -170,7 +170,7 @@ tasks = { ("clean", "make clean", "text/plain") ], "pidl" : [ - ("random-sleep", "script/random-sleep.sh 60 600", "text/plain"), + ("random-sleep", "../script/random-sleep.sh 60 600", "text/plain"), ("configure", "perl Makefile.PL PREFIX=${PREFIX_DIR}", "text/plain"), ("touch", "touch *.yp", "text/plain"), ("make", "make", "text/plain"), diff --git a/source3/locking/posix.c b/source3/locking/posix.c index e5320f8..2d89110 100644 --- a/source3/locking/posix.c +++ b/source3/locking/posix.c @@ -406,132 +406,61 @@ bool posix_locking_end(void) static void increment_windows_lock_ref_count(files_struct *fsp) { struct lock_ref_count_key tmp; - struct db_record *rec; - int lock_ref_count = 0; + int32_t lock_ref_count = 0; NTSTATUS status; - TDB_DATA value; - - rec = dbwrap_fetch_locked( - posix_pending_close_db, talloc_tos(), - locking_ref_count_key_fsp(fsp, &tmp)); - - SMB_ASSERT(rec != NULL); - value = dbwrap_record_get_value(rec); - - if (value.dptr != NULL) { - SMB_ASSERT(value.dsize == sizeof(lock_ref_count)); - memcpy(&lock_ref_count, value.dptr, - sizeof(lock_ref_count)); - } - - lock_ref_count++; - - status = dbwrap_record_store(rec, - make_tdb_data((uint8 *)&lock_ref_count, - sizeof(lock_ref_count)), 0); + status = dbwrap_change_int32_atomic( + posix_pending_close_db, locking_ref_count_key_fsp(fsp, &tmp), + &lock_ref_count, 1); SMB_ASSERT(NT_STATUS_IS_OK(status)); - - TALLOC_FREE(rec); + SMB_ASSERT(lock_ref_count < INT32_MAX); DEBUG(10,("increment_windows_lock_ref_count for file now %s = %d\n", - fsp_str_dbg(fsp), lock_ref_count)); + fsp_str_dbg(fsp), (int)lock_ref_count)); } /**************************************************************************** Bulk delete - subtract as many locks as we've just deleted. ****************************************************************************/ -void reduce_windows_lock_ref_count(files_struct *fsp, unsigned int dcount) +static void decrement_windows_lock_ref_count(files_struct *fsp) { struct lock_ref_count_key tmp; - struct db_record *rec; - int lock_ref_count = 0; + int32_t lock_ref_count = 0; NTSTATUS status; - TDB_DATA value; - - rec = dbwrap_fetch_locked( - posix_pending_close_db, talloc_tos(), - locking_ref_count_key_fsp(fsp, &tmp)); - - if (rec == NULL) { - DEBUG(0, ("reduce_windows_lock_ref_count: rec not found\n")); - return; - } - - value = dbwrap_record_get_value(rec); - - if ((value.dptr == NULL) || (value.dsize != sizeof(lock_ref_count))) { - DEBUG(0, ("reduce_windows_lock_ref_count: wrong value\n")); - TALLOC_FREE(rec); - return; - } - - memcpy(&lock_ref_count, value.dptr, sizeof(lock_ref_count)); - SMB_ASSERT(lock_ref_count > 0); - - lock_ref_count -= dcount; - - status = dbwrap_record_store(rec, - make_tdb_data((uint8 *)&lock_ref_count, - sizeof(lock_ref_count)), 0); + status = dbwrap_change_int32_atomic( + posix_pending_close_db, locking_ref_count_key_fsp(fsp, &tmp), + &lock_ref_count, -1); SMB_ASSERT(NT_STATUS_IS_OK(status)); - - TALLOC_FREE(rec); + SMB_ASSERT(lock_ref_count >= 0); DEBUG(10,("reduce_windows_lock_ref_count for file now %s = %d\n", - fsp_str_dbg(fsp), lock_ref_count)); -} - -static void decrement_windows_lock_ref_count(files_struct *fsp) -{ - reduce_windows_lock_ref_count(fsp, 1); + fsp_str_dbg(fsp), (int)lock_ref_count)); } /**************************************************************************** Fetch the lock ref count. ****************************************************************************/ -static int get_windows_lock_ref_count(files_struct *fsp) +static int32_t get_windows_lock_ref_count(files_struct *fsp) { struct lock_ref_count_key tmp; - TDB_DATA dbuf; NTSTATUS status; - int lock_ref_count = 0; + int32_t lock_ref_count = 0; - status = dbwrap_fetch( - posix_pending_close_db, talloc_tos(), - locking_ref_count_key_fsp(fsp, &tmp), &dbuf); - - if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND)) { - goto done; - } + status = dbwrap_fetch_int32( + posix_pending_close_db, locking_ref_count_key_fsp(fsp, &tmp), + &lock_ref_count); - if (!NT_STATUS_IS_OK(status)) { + if (!NT_STATUS_IS_OK(status) && + !NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND)) { DEBUG(0, ("get_windows_lock_ref_count: Error fetching " "lock ref count for file %s: %s\n", fsp_str_dbg(fsp), nt_errstr(status))); - goto done; } - - if (dbuf.dsize != sizeof(lock_ref_count)) { - DEBUG(0, ("get_windows_lock_ref_count: invalid entry " - "in lock ref count record for file %s: " - "(invalid data size %u)\n", - fsp_str_dbg(fsp), (unsigned int)dbuf.dsize)); - goto done; - } - - memcpy(&lock_ref_count, dbuf.dptr, sizeof(lock_ref_count)); - TALLOC_FREE(dbuf.dptr); - -done: - DEBUG(10,("get_windows_lock_count for file %s = %d\n", - fsp_str_dbg(fsp), lock_ref_count)); - return lock_ref_count; } @@ -542,18 +471,11 @@ done: static void delete_windows_lock_ref_count(files_struct *fsp) { struct lock_ref_count_key tmp; - struct db_record *rec; - - rec = dbwrap_fetch_locked( - posix_pending_close_db, talloc_tos(), - locking_ref_count_key_fsp(fsp, &tmp)); - - SMB_ASSERT(rec != NULL); /* Not a bug if it doesn't exist - no locks were ever granted. */ - dbwrap_record_delete(rec); - TALLOC_FREE(rec); + dbwrap_delete(posix_pending_close_db, + locking_ref_count_key_fsp(fsp, &tmp)); DEBUG(10,("delete_windows_lock_ref_count for file %s\n", fsp_str_dbg(fsp))); diff --git a/source3/locking/proto.h b/source3/locking/proto.h index f6a6f2e..74cf323 100644 --- a/source3/locking/proto.h +++ b/source3/locking/proto.h @@ -207,7 +207,6 @@ bool is_posix_locked(files_struct *fsp, enum brl_flavour lock_flav); bool posix_locking_init(bool read_only); bool posix_locking_end(void); -void reduce_windows_lock_ref_count(files_struct *fsp, unsigned int dcount); int fd_close_posix(struct files_struct *fsp); bool set_posix_lock_windows_flavour(files_struct *fsp, uint64_t u_offset, -- Samba Shared Repository