The branch, master has been updated via e3f5e47 smbd: Remove an optimization that became unnecessary via 07ae7e2 smbd: We don't collect our own vnn anymore via ebb027b smbd: Slightly simplify notify_trigger via eb885d1 smbd: Slightly simplify notify_trigger via 032da72 smbd: Avoid some talloc_realloc in notify_internal via c2b26a4 dbwrap-ctdb: Avoid a talloc_stackframe() via d147194 ctdb-conn: remove ctdbd_fetch via 1409895 dbwrap-ctdb: Use ctdbd_parse in db_ctdb_parse_record via abe4046 ctdb-conn: Add ctdbd_parse via c8c0bf7 tdb: Fix blank line endings via a92c08e tdb: Little format change via d4ebeeb smbd: Avoid sending 0-sized keys to dbwrap from bbb4068 dbwrap: Use tdb_null in db_ctdb_delete
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit e3f5e474c826940ebaf43256cb06a50309ba3ef5 Author: Volker Lendecke <v...@samba.org> Date: Wed Oct 31 13:13:50 2012 +0100 smbd: Remove an optimization that became unnecessary After we only collect nonlocal vnns in idx_state.vnns now, at this point we *know* we have something to send to a remote node. The previous code avoided the call to notify_push_remote_blob with an if-statement that has now become unnecessary. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> Autobuild-User(master): Stefan Metzmacher <me...@samba.org> Autobuild-Date(master): Tue Mar 26 13:16:39 CET 2013 on sn-devel-104 commit 07ae7e22f789a67bbd5e9536e1227a1c394990f9 Author: Volker Lendecke <v...@samba.org> Date: Wed Oct 31 13:11:19 2012 +0100 smbd: We don't collect our own vnn anymore notify_trigger_index_parser will not anymore add ourselves into the vnn list that it collects. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit ebb027b738d0addd3ee5c205c5370b01859aee71 Author: Volker Lendecke <v...@samba.org> Date: Wed Oct 31 13:10:12 2012 +0100 smbd: Slightly simplify notify_trigger We have a good chance that we did not collect any remote vnns. This avoids trying to walk the remote vnns altogether. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit eb885d1fdd6a2be603061aeef63790c92ca9ba56 Author: Volker Lendecke <v...@samba.org> Date: Wed Oct 31 13:08:18 2012 +0100 smbd: Slightly simplify notify_trigger This straightens the for-loop walking the path components slightly Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit 032da72e2b81685f292622cfd2ced14af257849d Author: Volker Lendecke <v...@samba.org> Date: Wed Oct 31 13:02:19 2012 +0100 smbd: Avoid some talloc_realloc in notify_internal For the nonclustered case we will only ever have one vnn in notify_index.tdb. For this case, without this patch we did talloc_realloc when collecting vnns to be able to do the memcpy instead of explicit copy with a for-loop. This new code will partition the new vnns we see when parsing a notify_index.tdb record into ourselves and all foreign vnns, only really collecting the foreign ones in an array. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit c2b26a43ffae22c9dff7929c48531fec9e6ed922 Author: Volker Lendecke <v...@samba.org> Date: Sat Nov 24 14:42:06 2012 +0000 dbwrap-ctdb: Avoid a talloc_stackframe() We have only a single allocation in this routine, so I think we can live without a stackframe. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit d147194466560488cda9f6e5e993c985cea02289 Author: Volker Lendecke <v...@samba.org> Date: Sat Nov 24 14:15:38 2012 +0000 ctdb-conn: remove ctdbd_fetch Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit 1409895d9e271744060d3f1ef2c71da5b5151f6a Author: Volker Lendecke <v...@samba.org> Date: Sat Nov 24 14:14:37 2012 +0000 dbwrap-ctdb: Use ctdbd_parse in db_ctdb_parse_record Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit abe4046643735cf0bc5bcdfe330dd946ab221808 Author: Volker Lendecke <v...@samba.org> Date: Fri Nov 23 17:54:57 2012 +0100 ctdb-conn: Add ctdbd_parse Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit c8c0bf74805c61b1379dab1d4529df0004872bb4 Author: Volker Lendecke <v...@samba.org> Date: Mon Mar 18 14:39:04 2013 +0100 tdb: Fix blank line endings Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit a92c08e18bca2f1db671dc5e2d0db4adbf39752d Author: Volker Lendecke <v...@samba.org> Date: Mon Mar 18 10:53:49 2013 +0100 tdb: Little format change Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit d4ebeeb78865c6a20a85437b82a1302921f3d1fe Author: Volker Lendecke <v...@samba.org> Date: Mon Mar 25 14:52:24 2013 +0100 smbd: Avoid sending 0-sized keys to dbwrap Start the notification one level below /. Sharing and notifying / for changes is broken at this moment anyway. When sharing / and someone wants to get notified for changes under /usr, we store "//usr" as the notify_index key. So this patch does not break anything that is not broken today, and it avoids a bogus call to dbwrap_parse_records. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> ----------------------------------------------------------------------- Summary of changes: lib/tdb/common/io.c | 2 +- lib/tdb/tools/tdbbackup.c | 27 ++++++++-------- lib/tdb/tools/tdbdump.c | 8 ++-- lib/tdb/tools/tdbtest.c | 12 ++++---- lib/tdb/tools/tdbtool.c | 40 ++++++++++++------------ lib/tdb/tools/tdbtorture.c | 4 +- source3/include/ctdbd_conn.h | 8 +++-- source3/lib/ctdbd_conn.c | 26 +++++----------- source3/lib/dbwrap/dbwrap_ctdb.c | 17 ++-------- source3/smbd/notify_internal.c | 62 ++++++++++++++++++++++++-------------- 10 files changed, 102 insertions(+), 104 deletions(-) Changeset truncated at 500 lines: diff --git a/lib/tdb/common/io.c b/lib/tdb/common/io.c index b9caffb..7e29c38 100644 --- a/lib/tdb/common/io.c +++ b/lib/tdb/common/io.c @@ -84,7 +84,7 @@ static int tdb_oob(struct tdb_context *tdb, tdb_off_t off, tdb_len_t len, } tdb->map_size = st.st_size; if (tdb_mmap(tdb) != 0) { - return - 1; + return -1; } if (st.st_size < (size_t)off + len) { diff --git a/lib/tdb/tools/tdbbackup.c b/lib/tdb/tools/tdbbackup.c index 11ecaa0..276a281 100644 --- a/lib/tdb/tools/tdbbackup.c +++ b/lib/tdb/tools/tdbbackup.c @@ -1,4 +1,4 @@ -/* +/* Unix SMB/CIFS implementation. low level tdb backup and restore utility Copyright (C) Andrew Tridgell 2002 @@ -7,12 +7,12 @@ it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ @@ -61,7 +61,7 @@ static void tdb_log(struct tdb_context *tdb, enum tdb_debug_level level, const c static void tdb_log(struct tdb_context *tdb, enum tdb_debug_level level, const char *format, ...) { va_list ap; - + va_start(ap, format); vfprintf(stdout, format, ap); va_end(ap); @@ -122,7 +122,7 @@ static int backup_tdb(const char *old_name, const char *new_name, int hash_size) } /* open the old tdb */ - tdb = tdb_open_ex(old_name, 0, 0, + tdb = tdb_open_ex(old_name, 0, 0, O_RDWR, 0, &log_ctx, NULL); if (!tdb) { printf("Failed to open %s\n", old_name); @@ -132,10 +132,10 @@ static int backup_tdb(const char *old_name, const char *new_name, int hash_size) /* create the new tdb */ unlink(tmp_name); - tdb_new = tdb_open_ex(tmp_name, - hash_size ? hash_size : tdb_hash_size(tdb), - TDB_DEFAULT, - O_RDWR|O_CREAT|O_EXCL, st.st_mode & 0777, + tdb_new = tdb_open_ex(tmp_name, + hash_size ? hash_size : tdb_hash_size(tdb), + TDB_DEFAULT, + O_RDWR|O_CREAT|O_EXCL, st.st_mode & 0777, &log_ctx, NULL); if (!tdb_new) { perror(tmp_name); @@ -192,9 +192,9 @@ static int backup_tdb(const char *old_name, const char *new_name, int hash_size) /* close the new tdb and re-open read-only */ tdb_close(tdb_new); - tdb_new = tdb_open_ex(tmp_name, + tdb_new = tdb_open_ex(tmp_name, 0, - TDB_DEFAULT, + TDB_DEFAULT, O_RDONLY, 0, &log_ctx, NULL); if (!tdb_new) { @@ -204,7 +204,7 @@ static int backup_tdb(const char *old_name, const char *new_name, int hash_size) free(tmp_name); return 1; } - + /* traverse the new tdb to confirm */ count2 = tdb_traverse(tdb_new, test_fn, NULL); if (count2 != count1) { @@ -237,7 +237,7 @@ static int verify_tdb(const char *fname, const char *bak_name) int count = -1; /* open the tdb */ - tdb = tdb_open_ex(fname, 0, 0, + tdb = tdb_open_ex(fname, 0, 0, O_RDONLY, 0, &log_ctx, NULL); /* traverse the tdb, then close it */ @@ -280,7 +280,6 @@ static void usage(void) printf(" -v verify mode (restore if corrupt)\n"); printf(" -n hashsize set the new hash size for the backup\n"); } - int main(int argc, char *argv[]) { diff --git a/lib/tdb/tools/tdbdump.c b/lib/tdb/tools/tdbdump.c index 47a84d2..e66ea56 100644 --- a/lib/tdb/tools/tdbdump.c +++ b/lib/tdb/tools/tdbdump.c @@ -1,4 +1,4 @@ -/* +/* Unix SMB/CIFS implementation. simple tdb dump util Copyright (C) Andrew Tridgell 2001 @@ -7,12 +7,12 @@ it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ @@ -99,7 +99,7 @@ static int dump_tdb(const char *fname, const char *keyname, bool emergency) TDB_CONTEXT *tdb; TDB_DATA key, value; struct tdb_logging_context logfn = { log_stderr }; - + tdb = tdb_open_ex(fname, 0, 0, O_RDONLY, 0, &logfn, NULL); if (!tdb) { printf("Failed to open %s\n", fname); diff --git a/lib/tdb/tools/tdbtest.c b/lib/tdb/tools/tdbtest.c index 44c78ef..0be35dc 100644 --- a/lib/tdb/tools/tdbtest.c +++ b/lib/tdb/tools/tdbtest.c @@ -24,7 +24,7 @@ static void _start_timer(void) static double _end_timer(void) { gettimeofday(&tp2,NULL); - return((tp2.tv_sec - tp1.tv_sec) + + return((tp2.tv_sec - tp1.tv_sec) + (tp2.tv_usec - tp1.tv_usec)*1.0e-6); } @@ -40,7 +40,7 @@ static void tdb_log(struct tdb_context *tdb, int level, const char *format, ...) static void tdb_log(struct tdb_context *tdb, int level, const char *format, ...) { va_list ap; - + va_start(ap, format); vfprintf(stdout, format, ap); va_end(ap); @@ -189,15 +189,15 @@ static void merge_test(void) char keys[5][2]; char tdata[] = "test"; TDB_DATA key, data; - + for (i = 0; i < 5; i++) { snprintf(keys[i],2, "%d", i); key.dptr = keys[i]; key.dsize = 2; - + data.dptr = tdata; data.dsize = 4; - + if (tdb_store(db, key, data, TDB_REPLACE) != 0) { fatal("tdb_store failed"); } @@ -248,7 +248,7 @@ static char *test_path(const char *filename) db = tdb_open(test_tdb, 0, TDB_CLEAR_IF_FIRST, O_RDWR | O_CREAT | O_TRUNC, 0600); - gdbm = gdbm_open(test_gdbm, 512, GDBM_WRITER|GDBM_NEWDB|GDBM_FAST, + gdbm = gdbm_open(test_gdbm, 512, GDBM_WRITER|GDBM_NEWDB|GDBM_FAST, 0600, NULL); if (!db || !gdbm) { diff --git a/lib/tdb/tools/tdbtool.c b/lib/tdb/tools/tdbtool.c index dc5747f..d007796 100644 --- a/lib/tdb/tools/tdbtool.c +++ b/lib/tdb/tools/tdbtool.c @@ -1,4 +1,4 @@ -/* +/* Unix SMB/CIFS implementation. Samba database functions Copyright (C) Andrew Tridgell 1999-2000 @@ -10,12 +10,12 @@ it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ @@ -113,7 +113,7 @@ static void _start_timer(void) static double _end_timer(void) { gettimeofday(&tp2,NULL); - return((tp2.tv_sec - tp1.tv_sec) + + return((tp2.tv_sec - tp1.tv_sec) + (tp2.tv_usec - tp1.tv_usec)*1.0e-6); } @@ -160,7 +160,7 @@ static void print_data(const char *buf,int len) printf("%02X ",(int)((unsigned char)buf[i])); i++; if (i%8 == 0) printf(" "); - if (i%16 == 0) { + if (i%16 == 0) { print_asc(&buf[i-16],8); printf(" "); print_asc(&buf[i-8],8); printf("\n"); if (i<len) printf("[%03X] ",i); @@ -168,18 +168,18 @@ static void print_data(const char *buf,int len) } if (i%16) { int n; - + n = 16 - (i%16); printf(" "); if (n>8) printf(" "); while (n--) printf(" "); - + n = i%16; if (n > 8) n = 8; print_asc(&buf[i-(i%16)],n); printf(" "); n = (i%16) - n; - if (n>0) print_asc(&buf[i-n],n); - printf("\n"); + if (n>0) print_asc(&buf[i-n],n); + printf("\n"); } } @@ -309,11 +309,11 @@ static void show_tdb(char *keyname, size_t keylen) terror("fetch failed"); return; } - + print_rec(tdb, key, dbuf, NULL); - + free( dbuf.dptr ); - + return; } @@ -357,23 +357,23 @@ static void move_rec(char *keyname, size_t keylen, char* tdbname) terror("fetch failed"); return; } - + print_rec(tdb, key, dbuf, NULL); - + dst_tdb = tdb_open(tdbname, 0, 0, O_RDWR, 0600); if ( !dst_tdb ) { terror("unable to open destination tdb"); return; } - + if (tdb_store( dst_tdb, key, dbuf, TDB_REPLACE ) != 0) { terror("failed to move record"); } else printf("record moved\n"); - + tdb_close( dst_tdb ); - + return; } @@ -520,7 +520,7 @@ static void first_record(TDB_CONTEXT *the_tdb, TDB_DATA *pkey) { TDB_DATA dbuf; *pkey = tdb_firstkey(the_tdb); - + dbuf = tdb_fetch(the_tdb, *pkey); if (!dbuf.dptr) terror("fetch failed"); else { @@ -532,9 +532,9 @@ static void next_record(TDB_CONTEXT *the_tdb, TDB_DATA *pkey) { TDB_DATA dbuf; *pkey = tdb_nextkey(the_tdb, *pkey); - + dbuf = tdb_fetch(the_tdb, *pkey); - if (!dbuf.dptr) + if (!dbuf.dptr) terror("fetch failed"); else print_rec(the_tdb, *pkey, dbuf, NULL); diff --git a/lib/tdb/tools/tdbtorture.c b/lib/tdb/tools/tdbtorture.c index 760ad59..a23d154 100644 --- a/lib/tdb/tools/tdbtorture.c +++ b/lib/tdb/tools/tdbtorture.c @@ -1,5 +1,5 @@ /* this tests tdb by doing lots of ops from several simultaneous - writers - that stresses the locking code. + writers - that stresses the locking code. */ #include "replace.h" @@ -59,7 +59,7 @@ static void tdb_log(struct tdb_context *tdb, enum tdb_debug_level level, const c system(ptr); free(ptr); } -#endif +#endif } static void fatal(const char *why) diff --git a/source3/include/ctdbd_conn.h b/source3/include/ctdbd_conn.h index 5778a92..64cb1d5 100644 --- a/source3/include/ctdbd_conn.h +++ b/source3/include/ctdbd_conn.h @@ -62,9 +62,11 @@ NTSTATUS ctdbd_db_attach(struct ctdbd_connection *conn, const char *name, NTSTATUS ctdbd_migrate(struct ctdbd_connection *conn, uint32_t db_id, TDB_DATA key); -NTSTATUS ctdbd_fetch(struct ctdbd_connection *conn, uint32_t db_id, - TDB_DATA key, TALLOC_CTX *mem_ctx, TDB_DATA *data, - bool local_copy); +NTSTATUS ctdbd_parse(struct ctdbd_connection *conn, uint32_t db_id, + TDB_DATA key, bool local_copy, + void (*parser)(TDB_DATA key, TDB_DATA data, + void *private_data), + void *private_data); NTSTATUS ctdbd_traverse(uint32_t db_id, void (*fn)(TDB_DATA key, TDB_DATA data, diff --git a/source3/lib/ctdbd_conn.c b/source3/lib/ctdbd_conn.c index 2cf5e47..1481a9c 100644 --- a/source3/lib/ctdbd_conn.c +++ b/source3/lib/ctdbd_conn.c @@ -1414,11 +1414,13 @@ NTSTATUS ctdbd_migrate(struct ctdbd_connection *conn, uint32_t db_id, } /* - * remotely fetch a record (read-only) + * Fetch a record and parse it */ -NTSTATUS ctdbd_fetch(struct ctdbd_connection *conn, uint32_t db_id, - TDB_DATA key, TALLOC_CTX *mem_ctx, TDB_DATA *data, - bool local_copy) +NTSTATUS ctdbd_parse(struct ctdbd_connection *conn, uint32_t db_id, + TDB_DATA key, bool local_copy, + void (*parser)(TDB_DATA key, TDB_DATA data, + void *private_data), + void *private_data) { struct ctdb_req_call req; struct ctdb_reply_call *reply; @@ -1473,21 +1475,9 @@ NTSTATUS ctdbd_fetch(struct ctdbd_connection *conn, uint32_t db_id, goto fail; } - data->dsize = reply->datalen; - if (data->dsize == 0) { - data->dptr = NULL; - goto done; - } + parser(key, make_tdb_data(&reply->data[0], reply->datalen), + private_data); - data->dptr = (uint8 *)talloc_memdup(mem_ctx, &reply->data[0], - reply->datalen); - if (data->dptr == NULL) { - DEBUG(0, ("talloc failed\n")); - status = NT_STATUS_NO_MEMORY; - goto fail; - } - - done: status = NT_STATUS_OK; fail: TALLOC_FREE(reply); diff --git a/source3/lib/dbwrap/dbwrap_ctdb.c b/source3/lib/dbwrap/dbwrap_ctdb.c index 399c850..e55689c 100644 --- a/source3/lib/dbwrap/dbwrap_ctdb.c +++ b/source3/lib/dbwrap/dbwrap_ctdb.c @@ -140,15 +140,13 @@ static NTSTATUS db_ctdb_ltdb_store(struct db_ctdb_ctx *db, struct ctdb_ltdb_header *header, TDB_DATA data) { - TALLOC_CTX *tmp_ctx = talloc_stackframe(); TDB_DATA rec; int ret; rec.dsize = data.dsize + sizeof(struct ctdb_ltdb_header); - rec.dptr = (uint8_t *)talloc_size(tmp_ctx, rec.dsize); + rec.dptr = (uint8_t *)talloc_size(talloc_tos(), rec.dsize); if (rec.dptr == NULL) { - talloc_free(tmp_ctx); return NT_STATUS_NO_MEMORY; } @@ -157,7 +155,7 @@ static NTSTATUS db_ctdb_ltdb_store(struct db_ctdb_ctx *db, ret = tdb_store(db->wtdb->tdb, key, rec, TDB_REPLACE); - talloc_free(tmp_ctx); + talloc_free(rec.dptr); return (ret == 0) ? NT_STATUS_OK : tdb_error_to_ntstatus(db->wtdb->tdb); @@ -1211,7 +1209,6 @@ static NTSTATUS db_ctdb_parse_record(struct db_context *db, TDB_DATA key, db->private_data, struct db_ctdb_ctx); struct db_ctdb_parse_record_state state; NTSTATUS status; - TDB_DATA data; state.parser = parser; state.private_data = private_data; @@ -1249,14 +1246,8 @@ static NTSTATUS db_ctdb_parse_record(struct db_context *db, TDB_DATA key, return NT_STATUS_OK; } - status = ctdbd_fetch(messaging_ctdbd_connection(), ctx->db_id, key, - talloc_tos(), &data, state.ask_for_readonly_copy); - if (!NT_STATUS_IS_OK(status)) { - return status; - } - parser(key, data, private_data); - TALLOC_FREE(data.dptr); - return NT_STATUS_OK; + return ctdbd_parse(messaging_ctdbd_connection(), ctx->db_id, key, + state.ask_for_readonly_copy, parser, private_data); } struct traverse_state { diff --git a/source3/smbd/notify_internal.c b/source3/smbd/notify_internal.c index eaf51e7..2dc8674 100644 --- a/source3/smbd/notify_internal.c +++ b/source3/smbd/notify_internal.c @@ -484,7 +484,7 @@ static void notify_trigger_index_parser(TDB_DATA key, TDB_DATA data, struct notify_trigger_index_state *state = (struct notify_trigger_index_state *)private_data; uint32_t *new_vnns; - size_t i, num_vnns, num_new_vnns; + size_t i, num_vnns, num_new_vnns, num_remote_vnns; if ((data.dsize % sizeof(uint32_t)) != 0) { DEBUG(1, ("Invalid record size in notify index db: %u\n", @@ -493,22 +493,32 @@ static void notify_trigger_index_parser(TDB_DATA key, TDB_DATA data, } new_vnns = (uint32_t *)data.dptr; num_new_vnns = data.dsize / sizeof(uint32_t); - - num_vnns = talloc_array_length(state->vnns); + num_remote_vnns = num_new_vnns; for (i=0; i<num_new_vnns; i++) { if (new_vnns[i] == state->my_vnn) { state->found_my_vnn = true; + num_remote_vnns -= 1; } } + if (num_remote_vnns == 0) { + return; + } + num_vnns = talloc_array_length(state->vnns); state->vnns = talloc_realloc(state->mem_ctx, state->vnns, uint32_t, - num_vnns + num_new_vnns); - if ((num_vnns + num_new_vnns != 0) && (state->vnns == NULL)) { + num_vnns + num_remote_vnns); -- Samba Shared Repository