The branch, v4-15-stable has been updated via 9f5b76a42d7 VERSION: Disable GIT_SNAPSHOT for the 4.15.0rc7 release. via 54d6868e169 WHATSNEW: Add release notes for Samba 4.15.0rc7. via 8d4c482410c ctdb-daemon: Don't mark a node as unhealthy when connecting to it via 7c353e6e383 ctdb-daemon: Ignore flag changes for disconnected nodes via 665b380d249 ctdb-daemon: Simplify ctdb_control_modflags() via f340dcbc675 ctdb-recoverd: Mark CTDB_SRVID_SET_NODE_FLAGS obsolete via c8a9f9147c2 ctdb-daemon: Don't bother sending CTDB_SRVID_SET_NODE_FLAGS via 17e0a052da0 ctdb-daemon: Modernise remaining debug macro in this function via 05d2f5e41c7 ctdb-daemon: Update logging for flag changes via e634ddde5e6 ctdb-daemon: Correct the condition for logging unchanged flags via 9f06ec8b108 ctdb-tools: Use disable and enable controls in tool via 772126bd68b ctdb-client: Add client code for disable/enable controls via 8ed5910b847 ctdb_daemon: Implement controls DISABLE_NODE/ENABLE_NODE via b5f8913f359 ctdb-daemon: Start as disabled means PERMANENTLY_DISABLED via c61b5e7b489 ctdb-daemon: Factor out a function to get node structure from PNN via 65d64194b6d ctdb-daemon: Add a helper variable via 675d68caabc ctdb-protocol: Add marshalling for controls DISABLE_NODE/ENABLE_NODE via 84a285851d7 ctdb-protocol: Add new controls to disable and enable nodes via c01d48d7a54 ctdb-recoverd: Push flags for a node if any remote node disagrees via 2cc4b917f78 ctdb-recoverd: Update the local node map before pushing out flags via f8fa33ac320 ctdb-recoverd: Add a helper variable via bddd7db7b2f WHATSNEW: The New VFS via bd730209109 Don't use sysconf(_SC_NGROUPS_MAX) on macOS for getgroups() via 92251109fa2 smbd: fix "ea support = no" via 13ba74a67a3 WHATSNEW: unknown options now trigger an error in all tools via cc39fca1f5a WHATSNEW: clarify the -e and -s handling for ldb tools via b52fdad21fb s4/torture/masktest: don't ignore unknown options via 1eaab01e178 s4/torture/locktest: don't ignore unknown options via 047274d1278 s4/torture/gentest: don't ignore unknown options via 79f231a5484 s4/regtree: don't ignore unknown options via b87f953efb9 s4/regshell: don't ignore unknown options via f377070e75b s4/regpatch: don't ignore unknown options via 9e0b596ab76 s4/regdiff: don't ignore unknown options via c4dc60a7992 s4/cifsdd: don't ignore unknown options via c94c2bb7503 testparm: don't ignore unknown options via 7c0725daaf3 split_tokens: don't ignore unknown options via ece1e503d84 smbtree: don't ignore unknown options via 3e5d5713a10 smbget: don't ignore unknown options via 647e2865eb3 smbcquotas: don't ignore unknown options via 2270e098c02 smbcacls: don't ignore unknown options via eeebabe4067 sharesec: don't ignore unknown options via 9af6e536edd regedit: don't ignore unknown options via 02144f364e6 profiles: don't ignore unknown options via 362c9f28a36 pdbedit: don't ignore unknown options via 609509f8ed1 ntlm_auth: don't ignore unknown options via 84579c965b1 nmblookup: don't ignore unknown options via 99eca1a3329 mvxattr: don't ignore unknown options via df0e4a6b67d log2pcaphex: don't ignore unknown options via 2f8aabd1761 s3/async-tracker: don't ignore unknown options via e5f6c2e25c5 vfstest: don't ignore unknown options via 7bee957378e pdbtest: don't ignore unknown options via 66dd6cc6286 rpcclient: don't ignore unknown options via 424135b1796 s3/param: don't ignore unknown options via 4af952f4ccd source3/lib/smbconf: don't ignore unknown options via a0e860c2360 nmblookup: don't ignore unknown options via 6e320e7f767 s4/smbclient: don't ignore unknown options via 43f57091f7f smbstatus: don't ignore unknown options via 26ccc96a41d texpect: don't ignore unknown options via be8c65fb748 smbclient: don't ignore unknown options via 223ac583cfa selftest: remove unsupported smbcacls option --get via 619baa2390f lib/cmdline: restore s3 option name --max-protocol for MAXPROTOCOL from 4.14 via ec937b7035d manpages: remove duplicate options from smbclient via 4ccc9a4c391 selftest: fix ---configfile option via b2934e2a726 lib/cmdline: fix --configfile handling of POPT_COMMON_CONFIG_ONLY used by ntlm_auth via 35d474c3030 vfs_btrfs: fix btrfs_fget_compression() via a7b9904c90b docs: Avoid duplicate information on USER and PASSWD, reference the common section via 4ad10cf8e82 docs: Document all the other ways to send a password to smbclient et al via 8416bcce6a7 docs: Ensure to rebuild manpages if samba.entities or samba.version changes via 33f06d10a03 docs-xml: use upper case for "{client,server} smb3 {signing,encryption} algorithms" values via 2baaa891bb3 VERSION: Bump version up to Samba 4.15.0rc7... from 30c5a0e60e8 VERSION: Disable GIT_SNAPSHOT for the 4.15.0rc6 release.
https://git.samba.org/?p=samba.git;a=shortlog;h=v4-15-stable - Log ----------------------------------------------------------------- ----------------------------------------------------------------------- Summary of changes: VERSION | 2 +- WHATSNEW.txt | 47 +++++++- buildtools/wafsamba/wafsamba.py | 6 +- buildtools/wafsamba/wscript | 5 +- ctdb/client/client_control_sync.c | 68 ++++++++++++ ctdb/client/client_sync.h | 12 +++ ctdb/include/ctdb_private.h | 2 + ctdb/protocol/protocol.h | 4 +- ctdb/protocol/protocol_api.h | 6 ++ ctdb/protocol/protocol_client.c | 36 +++++++ ctdb/protocol/protocol_control.c | 12 +++ ctdb/protocol/protocol_debug.c | 2 + ctdb/server/ctdb_control.c | 42 ++++++++ ctdb/server/ctdb_daemon.c | 35 ++++-- ctdb/server/ctdb_monitor.c | 67 ++++++------ ctdb/server/ctdb_recoverd.c | 120 +++++++++++---------- ctdb/server/ctdb_server.c | 1 - ctdb/tests/UNIT/cunit/protocol_test_101.sh | 2 +- ctdb/tests/src/fake_ctdbd.c | 54 ++++++++++ ctdb/tests/src/protocol_common_ctdb.c | 24 +++++ ctdb/tests/src/protocol_ctdb_test.c | 2 +- ctdb/tools/ctdb.c | 57 +++------- docs-xml/build/DTD/samba.entities | 58 +++++++--- docs-xml/manpages/mdsearch.1.xml | 2 +- docs-xml/manpages/net.8.xml | 2 +- docs-xml/manpages/nmblookup.1.xml | 2 +- docs-xml/manpages/rpcclient.1.xml | 2 +- docs-xml/manpages/samba-regedit.8.xml | 2 +- docs-xml/manpages/smbcacls.1.xml | 2 +- docs-xml/manpages/smbclient.1.xml | 63 +---------- docs-xml/manpages/smbcquotas.1.xml | 2 +- docs-xml/manpages/winexe.1.xml | 2 +- .../security/clientsmbencryptionalgos.xml | 8 +- .../smbdotconf/security/clientsmbsigningalgos.xml | 10 +- .../security/serversmbencryptionalgos.xml | 8 +- .../smbdotconf/security/serversmbsigningalgos.xml | 10 +- lib/cmdline/cmdline.c | 5 +- lib/param/loadparm.h | 4 +- lib/texpect/texpect.c | 8 +- libcli/nbt/tools/nmblookup.c | 5 + libcli/smb/util.c | 14 +-- python/samba/tests/blackbox/smbcacls.py | 2 +- .../blackbox/smbcacls_propagate_inhertance.py | 2 +- source3/client/client.c | 6 +- source3/include/proto.h | 3 +- source3/lib/smbconf/testsuite.c | 11 +- source3/lib/system.c | 24 ++++- source3/lib/system_smbd.c | 2 +- source3/modules/vfs_btrfs.c | 7 +- source3/param/test_lp_load.c | 11 +- source3/rpcclient/rpcclient.c | 6 ++ source3/smbd/sec_ctx.c | 2 +- source3/smbd/trans2.c | 3 +- source3/torture/pdbtest.c | 11 +- source3/torture/vfstest.c | 12 ++- source3/utils/async-tracker.c | 5 + source3/utils/log2pcaphex.c | 5 + source3/utils/mvxattr.c | 5 + source3/utils/net_help_common.c | 2 +- source3/utils/nmblookup.c | 5 + source3/utils/ntlm_auth.c | 6 ++ source3/utils/pdbedit.c | 5 + source3/utils/profiles.c | 5 + source3/utils/regedit.c | 8 +- source3/utils/sharesec.c | 5 + source3/utils/smbcacls.c | 5 + source3/utils/smbcquotas.c | 5 + source3/utils/smbget.c | 5 + source3/utils/smbtree.c | 12 ++- source3/utils/split_tokens.c | 11 +- source3/utils/status.c | 5 + source3/utils/testparm.c | 11 +- source4/client/cifsdd.c | 8 +- source4/client/client.c | 5 + source4/lib/registry/tools/regdiff.c | 5 + source4/lib/registry/tools/regpatch.c | 7 ++ source4/lib/registry/tools/regshell.c | 7 ++ source4/lib/registry/tools/regtree.c | 7 ++ source4/torture/gentest.c | 5 + source4/torture/locktest.c | 5 + source4/torture/masktest.c | 5 + testprogs/blackbox/test_client_kerberos.sh | 2 +- testsuite/smbd/sec_ctx_utils.c | 2 +- 83 files changed, 789 insertions(+), 291 deletions(-) Changeset truncated at 500 lines: diff --git a/VERSION b/VERSION index 31a0c312220..f57bed5d2a2 100644 --- a/VERSION +++ b/VERSION @@ -87,7 +87,7 @@ SAMBA_VERSION_PRE_RELEASE= # e.g. SAMBA_VERSION_RC_RELEASE=1 # # -> "3.0.0rc1" # ######################################################## -SAMBA_VERSION_RC_RELEASE=6 +SAMBA_VERSION_RC_RELEASE=7 ######################################################## # To mark SVN snapshots this should be set to 'yes' # diff --git a/WHATSNEW.txt b/WHATSNEW.txt index 739a0b319ca..bf63cf2b908 100644 --- a/WHATSNEW.txt +++ b/WHATSNEW.txt @@ -1,7 +1,7 @@ Release Announcements ===================== -This is the sixth release candidate of Samba 4.15. This is *not* +This is the seventh release candidate of Samba 4.15. This is *not* intended for production environments and is designed for testing purposes only. Please report any defects via the Samba bug reporting system at https://bugzilla.samba.org/. @@ -64,6 +64,16 @@ bugs CVE-2021-37750 and CVE-2021-36222 NEW FEATURES/CHANGES ==================== +VFS +--- + +The effort to modernize Samba's VFS interface is complete and Samba 4.15.0 ships +with a modernized VFS designed for the post SMB1 world. + +For details please refer to the documentation at source3/modules/The_New_VFS.txt +or visit the <https://wiki.samba.org/index.php/The_New_VFS>. + + Bind DLZ: add the ability to set allow/deny lists for zone transfer clients --------------------------------------------------------------------------- @@ -104,6 +114,9 @@ These should be stories of the past now. A new command line parser has been implemented with sanity checking. Also the command line interface has been simplified and provides better control for encryption, signing and kerberos. +Previously many tools silently ignored unknown options. To prevent unexpected +behaviour all tools will now consistently reject unknown options. + Also several command line options have a smb.conf variable to control the default now. @@ -131,9 +144,11 @@ Options removed: ### Duplicates in command line utils -ldbadd/ldbsearch/ldbdel/ldbmodify/ldbrename: --e is not available for --editor anymore --s is not used for --configfile anymore +ldbadd/ldbdel/ldbedit/ldbmodify/ldbrename/ldbsearch: +-e is still available as an alias for --editor, + as it used to be. +-s is no longer reported as an alias for --configfile, + it never worked that way as it was shadowed by '-s' for '--scope'. ndrdump: -l is not available for --load-dso anymore @@ -341,6 +356,30 @@ smb.conf changes winbind scan trusted domains Changed No +CHANGES SINCE 4.15.0rc6 +======================= + +o Andrew Bartlett <abart...@samba.org> + * BUG 14791: All the ways to specify a password are not documented. + +o Ralph Boehme <s...@samba.org> + * BUG 14790: vfs_btrfs compression support broken. + * BUG 14828: Problems with commandline parsing. + * BUG 14829: smbd crashes when "ea support" is set to no. + +o Stefan Metzmacher <me...@samba.org> + * BUG 14825: "{client,server} smb3 {signing,encryption} algorithms" should + use the same strings as smbstatus output. + * BUG 14828: Problems with commandline parsing. + +o Alex Richardson <alexander.richard...@cl.cam.ac.uk> + * BUG 8773: smbd fails to run as root because it belongs to more than 16 + groups on MacOS X. + +o Martin Schwenke <mar...@meltin.net> + * BUG 14784: Fix CTDB flag/status update race conditions. + + CHANGES SINCE 4.15.0rc5 ======================= diff --git a/buildtools/wafsamba/wafsamba.py b/buildtools/wafsamba/wafsamba.py index 4fe9daf160e..0427c90ca80 100644 --- a/buildtools/wafsamba/wafsamba.py +++ b/buildtools/wafsamba/wafsamba.py @@ -946,9 +946,13 @@ def SAMBAMANPAGES(bld, manpages, extra_source=None): bld.env.SAMBA_CATALOGS = 'file:///etc/xml/catalog file:///usr/local/share/xml/catalog file://' + bld.env.SAMBA_CATALOG for m in manpages.split(): - source = m + '.xml' + source = [m + '.xml'] if extra_source is not None: source = [source, extra_source] + # ${SRC[1]} and ${SRC[2]} are not referenced in the + # SAMBA_GENERATOR but trigger the dependency calculation so + # ensures that manpages are rebuilt when these change. + source += ['build/DTD/samba.entities', 'build/DTD/samba.build.version'] bld.SAMBA_GENERATOR(m, source=source, target=m, diff --git a/buildtools/wafsamba/wscript b/buildtools/wafsamba/wscript index 1aadb9570e1..def13f71c93 100644 --- a/buildtools/wafsamba/wscript +++ b/buildtools/wafsamba/wscript @@ -542,7 +542,10 @@ struct foo bar = { .y = 'X', .x = 1 }; conf.CHECK_HEADERS('strings.h inttypes.h stdint.h unistd.h minix/config.h', add_headers=True) conf.CHECK_HEADERS('ctype.h', add_headers=True) - if sys.platform != 'darwin': + if sys.platform == 'darwin': + conf.DEFINE('_DARWIN_C_SOURCE', 1, add_to_cflags=True) + conf.DEFINE('_DARWIN_UNLIMITED_GETGROUPS', 1, add_to_cflags=True) + else: conf.CHECK_HEADERS('standards.h', add_headers=True) conf.CHECK_HEADERS('stdbool.h stdint.h stdarg.h vararg.h', add_headers=True) diff --git a/ctdb/client/client_control_sync.c b/ctdb/client/client_control_sync.c index b9a25ce2b2c..e9f97dd0f30 100644 --- a/ctdb/client/client_control_sync.c +++ b/ctdb/client/client_control_sync.c @@ -2660,3 +2660,71 @@ int ctdb_ctrl_tunnel_deregister(TALLOC_CTX *mem_ctx, struct tevent_context *ev, return 0; } + +int ctdb_ctrl_disable_node(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct ctdb_client_context *client, + int destnode, + struct timeval timeout) +{ + struct ctdb_req_control request; + struct ctdb_reply_control *reply; + int ret; + + ctdb_req_control_disable_node(&request); + ret = ctdb_client_control(mem_ctx, + ev, + client, + destnode, + timeout, + &request, + &reply); + if (ret != 0) { + D_ERR("Control DISABLE_NODE failed to node %u, ret=%d\n", + destnode, + ret); + return ret; + } + + ret = ctdb_reply_control_disable_node(reply); + if (ret != 0) { + D_ERR("Control DISABLE_NODE failed, ret=%d\n", ret); + return ret; + } + + return 0; +} + +int ctdb_ctrl_enable_node(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct ctdb_client_context *client, + int destnode, + struct timeval timeout) +{ + struct ctdb_req_control request; + struct ctdb_reply_control *reply; + int ret; + + ctdb_req_control_enable_node(&request); + ret = ctdb_client_control(mem_ctx, + ev, + client, + destnode, + timeout, + &request, + &reply); + if (ret != 0) { + D_ERR("Control ENABLE_NODE failed to node %u, ret=%d\n", + destnode, + ret); + return ret; + } + + ret = ctdb_reply_control_enable_node(reply); + if (ret != 0) { + D_ERR("Control ENABLE_NODE failed, ret=%d\n", ret); + return ret; + } + + return 0; +} diff --git a/ctdb/client/client_sync.h b/ctdb/client/client_sync.h index dc8b67395e3..b8f5d905857 100644 --- a/ctdb/client/client_sync.h +++ b/ctdb/client/client_sync.h @@ -482,6 +482,18 @@ int ctdb_ctrl_tunnel_deregister(TALLOC_CTX *mem_ctx, struct tevent_context *ev, int destnode, struct timeval timeout, uint64_t tunnel_id); +int ctdb_ctrl_disable_node(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct ctdb_client_context *client, + int destnode, + struct timeval timeout); + +int ctdb_ctrl_enable_node(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct ctdb_client_context *client, + int destnode, + struct timeval timeout); + /* from client/client_message_sync.c */ int ctdb_message_recd_update_ip(TALLOC_CTX *mem_ctx, struct tevent_context *ev, diff --git a/ctdb/include/ctdb_private.h b/ctdb/include/ctdb_private.h index 8eb6686f953..f5e647f08a5 100644 --- a/ctdb/include/ctdb_private.h +++ b/ctdb/include/ctdb_private.h @@ -565,6 +565,8 @@ int daemon_deregister_message_handler(struct ctdb_context *ctdb, void daemon_tunnel_handler(uint64_t tunnel_id, TDB_DATA data, void *private_data); +struct ctdb_node *ctdb_find_node(struct ctdb_context *ctdb, uint32_t pnn); + int ctdb_start_daemon(struct ctdb_context *ctdb, bool interactive, bool test_mode_enabled); diff --git a/ctdb/protocol/protocol.h b/ctdb/protocol/protocol.h index e4b76c6b986..5f788f6f2a8 100644 --- a/ctdb/protocol/protocol.h +++ b/ctdb/protocol/protocol.h @@ -137,7 +137,7 @@ struct ctdb_call { /* SRVID to inform clients that an IP address has been taken over */ #define CTDB_SRVID_TAKE_IP 0xF301000000000000LL -/* SRVID to inform recovery daemon of the node flags */ +/* SRVID to inform recovery daemon of the node flags - OBSOLETE */ #define CTDB_SRVID_SET_NODE_FLAGS 0xF400000000000000LL /* SRVID to inform recovery daemon to update public ip assignment */ @@ -376,6 +376,8 @@ enum ctdb_controls {CTDB_CONTROL_PROCESS_EXISTS = 0, CTDB_CONTROL_VACUUM_FETCH = 154, CTDB_CONTROL_DB_VACUUM = 155, CTDB_CONTROL_ECHO_DATA = 156, + CTDB_CONTROL_DISABLE_NODE = 157, + CTDB_CONTROL_ENABLE_NODE = 158, }; #define MAX_COUNT_BUCKETS 16 diff --git a/ctdb/protocol/protocol_api.h b/ctdb/protocol/protocol_api.h index 7bbe33b22fe..499d9329c54 100644 --- a/ctdb/protocol/protocol_api.h +++ b/ctdb/protocol/protocol_api.h @@ -605,6 +605,12 @@ void ctdb_req_control_echo_data(struct ctdb_req_control *request, struct ctdb_echo_data *echo_data); int ctdb_reply_control_echo_data(struct ctdb_reply_control *reply); +void ctdb_req_control_disable_node(struct ctdb_req_control *request); +int ctdb_reply_control_disable_node(struct ctdb_reply_control *reply); + +void ctdb_req_control_enable_node(struct ctdb_req_control *request); +int ctdb_reply_control_enable_node(struct ctdb_reply_control *reply); + /* From protocol/protocol_debug.c */ void ctdb_packet_print(uint8_t *buf, size_t buflen, FILE *fp); diff --git a/ctdb/protocol/protocol_client.c b/ctdb/protocol/protocol_client.c index 6d850be86df..dcce83f02a1 100644 --- a/ctdb/protocol/protocol_client.c +++ b/ctdb/protocol/protocol_client.c @@ -2360,3 +2360,39 @@ int ctdb_reply_control_echo_data(struct ctdb_reply_control *reply) return reply->status; } + +/* CTDB_CONTROL_DISABLE_NODE */ + +void ctdb_req_control_disable_node(struct ctdb_req_control *request) +{ + request->opcode = CTDB_CONTROL_DISABLE_NODE; + request->pad = 0; + request->srvid = 0; + request->client_id = 0; + request->flags = 0; + + request->rdata.opcode = CTDB_CONTROL_DISABLE_NODE; +} + +int ctdb_reply_control_disable_node(struct ctdb_reply_control *reply) +{ + return ctdb_reply_control_generic(reply, CTDB_CONTROL_DISABLE_NODE); +} + +/* CTDB_CONTROL_ENABLE_NODE */ + +void ctdb_req_control_enable_node(struct ctdb_req_control *request) +{ + request->opcode = CTDB_CONTROL_ENABLE_NODE; + request->pad = 0; + request->srvid = 0; + request->client_id = 0; + request->flags = 0; + + request->rdata.opcode = CTDB_CONTROL_ENABLE_NODE; +} + +int ctdb_reply_control_enable_node(struct ctdb_reply_control *reply) +{ + return ctdb_reply_control_generic(reply, CTDB_CONTROL_ENABLE_NODE); +} diff --git a/ctdb/protocol/protocol_control.c b/ctdb/protocol/protocol_control.c index fb6b0219ef7..f64a1a90e10 100644 --- a/ctdb/protocol/protocol_control.c +++ b/ctdb/protocol/protocol_control.c @@ -411,6 +411,12 @@ static size_t ctdb_req_control_data_len(struct ctdb_req_control_data *cd) case CTDB_CONTROL_ECHO_DATA: len = ctdb_echo_data_len(cd->data.echo_data); break; + + case CTDB_CONTROL_DISABLE_NODE: + break; + + case CTDB_CONTROL_ENABLE_NODE: + break; } return len; @@ -1385,6 +1391,12 @@ static size_t ctdb_reply_control_data_len(struct ctdb_reply_control_data *cd) case CTDB_CONTROL_ECHO_DATA: len = ctdb_echo_data_len(cd->data.echo_data); break; + + case CTDB_CONTROL_DISABLE_NODE: + break; + + case CTDB_CONTROL_ENABLE_NODE: + break; } return len; diff --git a/ctdb/protocol/protocol_debug.c b/ctdb/protocol/protocol_debug.c index 694285515e1..d94cb548d68 100644 --- a/ctdb/protocol/protocol_debug.c +++ b/ctdb/protocol/protocol_debug.c @@ -243,6 +243,8 @@ static void ctdb_opcode_print(uint32_t opcode, FILE *fp) { CTDB_CONTROL_VACUUM_FETCH, "VACUUM_FETCH" }, { CTDB_CONTROL_DB_VACUUM, "DB_VACUUM" }, { CTDB_CONTROL_ECHO_DATA, "ECHO_DATA" }, + { CTDB_CONTROL_DISABLE_NODE, "DISABLE_NODE" }, + { CTDB_CONTROL_ENABLE_NODE, "ENABLE_NODE" }, { MAP_END, "" }, }; diff --git a/ctdb/server/ctdb_control.c b/ctdb/server/ctdb_control.c index 206ea149693..131ebd43afc 100644 --- a/ctdb/server/ctdb_control.c +++ b/ctdb/server/ctdb_control.c @@ -173,6 +173,40 @@ done: TALLOC_FREE(state); } +static int ctdb_control_disable_node(struct ctdb_context *ctdb) +{ + struct ctdb_node *node; + + node = ctdb_find_node(ctdb, CTDB_CURRENT_NODE); + if (node == NULL) { + /* Can't happen */ + DBG_ERR("Unable to find current node\n"); + return -1; + } + + D_ERR("Disable node\n"); + node->flags |= NODE_FLAGS_PERMANENTLY_DISABLED; + + return 0; +} + +static int ctdb_control_enable_node(struct ctdb_context *ctdb) +{ + struct ctdb_node *node; + + node = ctdb_find_node(ctdb, CTDB_CURRENT_NODE); + if (node == NULL) { + /* Can't happen */ + DBG_ERR("Unable to find current node\n"); + return -1; + } + + D_ERR("Enable node\n"); + node->flags &= ~NODE_FLAGS_PERMANENTLY_DISABLED; + + return 0; +} + /* process a control request */ @@ -827,6 +861,14 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb, return ctdb_control_echo_data(ctdb, c, indata, async_reply); } + case CTDB_CONTROL_DISABLE_NODE: + CHECK_CONTROL_DATA_SIZE(0); + return ctdb_control_disable_node(ctdb); + + case CTDB_CONTROL_ENABLE_NODE: + CHECK_CONTROL_DATA_SIZE(0); + return ctdb_control_enable_node(ctdb); + default: DEBUG(DEBUG_CRIT,(__location__ " Unknown CTDB control opcode %u\n", opcode)); return -1; diff --git a/ctdb/server/ctdb_daemon.c b/ctdb/server/ctdb_daemon.c index 57f80235e7c..0896ba08f90 100644 --- a/ctdb/server/ctdb_daemon.c +++ b/ctdb/server/ctdb_daemon.c @@ -1235,28 +1235,51 @@ failed: return -1; } -static void initialise_node_flags (struct ctdb_context *ctdb) +struct ctdb_node *ctdb_find_node(struct ctdb_context *ctdb, uint32_t pnn) { + struct ctdb_node *node = NULL; unsigned int i; + if (pnn == CTDB_CURRENT_NODE) { + pnn = ctdb->pnn; + } + /* Always found: PNN correctly set just before this is called */ for (i = 0; i < ctdb->num_nodes; i++) { - if (ctdb->pnn == ctdb->nodes[i]->pnn) { - break; + node = ctdb->nodes[i]; + if (pnn == node->pnn) { + return node; } } - ctdb->nodes[i]->flags &= ~NODE_FLAGS_DISCONNECTED; + return NULL; +} + +static void initialise_node_flags (struct ctdb_context *ctdb) +{ + struct ctdb_node *node = NULL; + + node = ctdb_find_node(ctdb, CTDB_CURRENT_NODE); + /* + * PNN correctly set just before this is called so always + * found but keep static analysers happy... + */ + if (node == NULL) { + DBG_ERR("Unable to find current node\n"); + return; + } + + node->flags &= ~NODE_FLAGS_DISCONNECTED; /* do we start out in DISABLED mode? */ if (ctdb->start_as_disabled != 0) { D_ERR("This node is configured to start in DISABLED state\n"); - ctdb->nodes[i]->flags |= NODE_FLAGS_DISABLED; + node->flags |= NODE_FLAGS_PERMANENTLY_DISABLED; } /* do we start out in STOPPED mode? */ if (ctdb->start_as_stopped != 0) { D_ERR("This node is configured to start in STOPPED state\n"); - ctdb->nodes[i]->flags |= NODE_FLAGS_STOPPED; + node->flags |= NODE_FLAGS_STOPPED; } } diff --git a/ctdb/server/ctdb_monitor.c b/ctdb/server/ctdb_monitor.c index 5c694bde969..ab58ec485fe 100644 --- a/ctdb/server/ctdb_monitor.c +++ b/ctdb/server/ctdb_monitor.c @@ -455,52 +455,55 @@ int32_t ctdb_control_modflags(struct ctdb_context *ctdb, TDB_DATA indata) struct ctdb_node *node; -- Samba Shared Repository