]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
smbd: add FSCTL_SMBTORTURE_[GET_CTDB_PNN|STOP_CTDB_NODE|START_CTDB_NODE]
authorRalph Boehme <slow@samba.org>
Sun, 26 Oct 2025 08:59:28 +0000 (09:59 +0100)
committerRalph Boehme <slow@samba.org>
Fri, 17 Jul 2026 10:18:37 +0000 (10:18 +0000)
Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Anoop C S <anoopcs@samba.org>
libcli/smb/smb_constants.h
source3/smbd/smb2_ioctl_smbtorture.c

index 6d43ec1eb04028b0456b2570cb7a9a449dee5205..ccb07e1b99f37a1c2c568b346a4273873eab80e1 100644 (file)
@@ -647,6 +647,12 @@ enum csc_policy {
        (FSCTL_SMBTORTURE | FSCTL_ACCESS_WRITE | 0x0020 | FSCTL_METHOD_NEITHER)
 #define FSCTL_SMBTORTURE_FSP_ASYNC_SLEEP \
        (FSCTL_SMBTORTURE | FSCTL_ACCESS_WRITE | 0x0040 | FSCTL_METHOD_NEITHER)
+#define FSCTL_SMBTORTURE_GET_CTDB_PNN \
+       (FSCTL_SMBTORTURE | FSCTL_ACCESS_WRITE | 0x0080 | FSCTL_METHOD_NEITHER)
+#define FSCTL_SMBTORTURE_STOP_CTDB_NODE \
+       (FSCTL_SMBTORTURE | FSCTL_ACCESS_WRITE | 0x0100 | FSCTL_METHOD_NEITHER)
+#define FSCTL_SMBTORTURE_START_CTDB_NODE \
+       (FSCTL_SMBTORTURE | FSCTL_ACCESS_WRITE | 0x0200 | FSCTL_METHOD_NEITHER)
 
 /*
  * A few values from [MS-FSCC] 2.1.2.1 Reparse Tags
index 9a259fb0dbfa9d12d8c25e7adc7d04d182358fd2..439a19ac2330806fe644618616d60552d3ebd708 100644 (file)
@@ -132,6 +132,70 @@ static void smbd_fsctl_torture_async_sleep_done(struct tevent_req *subreq)
        tevent_req_done(req);
 }
 
+static NTSTATUS smbd_fsctl_torture_stop_ctdb_node(uint8_t pnn)
+{
+       const char *opt = NULL;
+       char *cmd = NULL;
+       int ret;
+
+       DBG_WARNING("Received stop node %"PRIu8" request\n", pnn);
+
+       opt = lp_parm_const_string (-1, "clusteredmember", "stop_node", NULL);
+       if (opt == NULL) {
+               return NT_STATUS_INTERNAL_ERROR;
+       }
+
+       cmd = talloc_asprintf(talloc_tos(), "%s %"PRIu8, opt, pnn);
+       if (cmd == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       DBG_WARNING("cmd: '%s'\n", cmd);
+
+       ret = smbrun(cmd, NULL, NULL);
+       if (ret != 0) {
+               DBG_WARNING("'%s' failed\n", cmd);
+               TALLOC_FREE(cmd);
+               return NT_STATUS_INTERNAL_ERROR;
+       }
+       TALLOC_FREE(cmd);
+
+       DBG_WARNING("Finished stop node %"PRIu8" request\n", pnn);
+       return NT_STATUS_OK;
+}
+
+static NTSTATUS smbd_fsctl_torture_start_ctdb_node(uint8_t pnn)
+{
+       const char *opt = NULL;
+       char *cmd = NULL;
+       int ret;
+
+       DBG_WARNING("Received start node %"PRIu8" request\n", pnn);
+
+       opt = lp_parm_const_string (-1, "clusteredmember", "start_node", NULL);
+       if (opt == NULL) {
+               return NT_STATUS_INTERNAL_ERROR;
+       }
+
+       cmd = talloc_asprintf(talloc_tos(), "%s %"PRIu8, opt, pnn);
+       if (cmd == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       DBG_WARNING("cmd: '%s'\n", cmd);
+
+       ret = smbrun(cmd, NULL, NULL);
+       if (ret != 0) {
+               DBG_WARNING("'%s' failed\n", cmd);
+               TALLOC_FREE(cmd);
+               return NT_STATUS_INTERNAL_ERROR;
+       }
+       TALLOC_FREE(cmd);
+
+       DBG_WARNING("Finished start node %"PRIu8" request\n", pnn);
+       return NT_STATUS_OK;
+}
+
 struct tevent_req *smb2_ioctl_smbtorture(uint32_t ctl_code,
                                         struct tevent_context *ev,
                                         struct tevent_req *req,
@@ -214,6 +278,53 @@ struct tevent_req *smb2_ioctl_smbtorture(uint32_t ctl_code,
                return req;
         }
 
+       case FSCTL_SMBTORTURE_GET_CTDB_PNN: {
+               uint32_t pnn = get_my_vnn();
+
+               if (state->in_input.length != 0) {
+                       tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
+                       return tevent_req_post(req, ev);
+               }
+
+               state->out_output = data_blob_talloc(state, NULL, 1);
+               if (state->out_output.data == NULL) {
+                       tevent_req_nterror(req, NT_STATUS_NO_MEMORY);
+                       return tevent_req_post(req, ev);
+               }
+
+               SCVAL(state->out_output.data, 0x00, (uint8_t)pnn);
+
+               tevent_req_done(req);
+               return tevent_req_post(req, ev);
+       }
+       case FSCTL_SMBTORTURE_STOP_CTDB_NODE:
+               if (state->in_input.length != 1) {
+                       tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
+                       return tevent_req_post(req, ev);
+               }
+
+               status = smbd_fsctl_torture_stop_ctdb_node(
+                       PULL_BE_U8(state->in_input.data, 0));
+               if (tevent_req_nterror(req, status)) {
+                       return tevent_req_post(req, ev);
+               }
+               tevent_req_done(req);
+               return tevent_req_post(req, ev);
+
+       case FSCTL_SMBTORTURE_START_CTDB_NODE:
+               if (state->in_input.length != 1) {
+                       tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
+                       return tevent_req_post(req, ev);
+               }
+
+               status = smbd_fsctl_torture_start_ctdb_node(
+                       PULL_BE_U8(state->in_input.data, 0));
+               if (tevent_req_nterror(req, status)) {
+                       return tevent_req_post(req, ev);
+               }
+               tevent_req_done(req);
+               return tevent_req_post(req, ev);
+
        default:
                goto not_supported;
        }