From fecc3bd4e2042e3b0cd701b3b2a6b3bce21acad6 Mon Sep 17 00:00:00 2001 From: Sebastien Buisson Date: Wed, 20 Mar 2024 09:05:41 +0100 Subject: [PATCH] LU-17431 utils: add 'dynamic' parameter to nodemap_cmd Adding a 'dynamic' parameter to nodemap_cmd() will enable 'lctl nodemap_*' commands to handle dynamic nodemaps, i.e. nodemaps created directly on MDS/OSS side, and stored in memory. If both MDT and OST are running on the same node, the MDS device is used for the ioctl. It doesn't matter which one is actually used, since it gets to the same place in ptlrpc anyway, it just needs to find a valid OBD device to run the ioctl. Test-Parameters: trivial Signed-off-by: Sebastien Buisson Change-Id: Id58199e1ad6622aad896737604c0a8e1287ba34e Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/54503 Reviewed-by: Oleg Drokin Reviewed-by: Andreas Dilger Reviewed-by: James Simmons Tested-by: jenkins Tested-by: Maloo --- lustre/utils/obd.c | 103 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 87 insertions(+), 16 deletions(-) diff --git a/lustre/utils/obd.c b/lustre/utils/obd.c index 89e6ec8..d78c424 100644 --- a/lustre/utils/obd.c +++ b/lustre/utils/obd.c @@ -796,6 +796,62 @@ int jt_opt_net(int argc, char **argv) #define OBD_IOC_NO_TRANSNO _IOW('f', 140, OBD_IOC_DATA_TYPE) #endif +static bool is_mds(void) +{ + glob_t path; + int rc; + + rc = cfs_get_param_paths(&path, "mdt/*-MDT0000"); + if (!rc) { + cfs_free_param_data(&path); + return true; + } + + return false; +} + +static bool is_oss(void) +{ + glob_t path; + int rc; + + rc = cfs_get_param_paths(&path, "obdfilter/*-OST0000"); + if (!rc) { + cfs_free_param_data(&path); + return true; + } + + return false; +} + +static int get_mds_device(void) +{ + char mds[] = "$MDS"; + int rc; + + do_disconnect(NULL, 1); + rc = do_device("mdsioc", mds); + if (rc) { + errno = ENODEV; + return -errno; + } + return cur_device; +} + +static int get_oss_device(void) +{ + char oss[] = "$OSS"; + int rc; + + do_disconnect(NULL, 1); + rc = do_device("ossioc", oss); + if (rc) { + errno = ENODEV; + return -errno; + } + return cur_device; +} + int jt_obd_no_transno(int argc, char **argv) { struct obd_ioctl_data data; @@ -3807,8 +3863,8 @@ out: * * \retval 0 on success */ -static int nodemap_cmd(enum lcfg_command_type cmd, void *ret_data, - unsigned int ret_size, ...) +static int nodemap_cmd(enum lcfg_command_type cmd, bool dynamic, + void *ret_data, unsigned int ret_size, ...) { va_list ap; char *arg; @@ -3837,7 +3893,18 @@ static int nodemap_cmd(enum lcfg_command_type cmd, void *ret_data, lustre_cfg_init(lcfg, cmd, &bufs); memset(&data, 0, sizeof(data)); - rc = data.ioc_dev = get_mgs_device(); + if (dynamic) { + if (is_mds()) { + rc = data.ioc_dev = get_mds_device(); + } else if (is_oss()) { + rc = data.ioc_dev = get_oss_device(); + } else { + errno = EINVAL; + rc = -errno; + } + } else { + rc = data.ioc_dev = get_mgs_device(); + } if (rc < 0) goto out; @@ -3893,8 +3960,8 @@ int jt_nodemap_activate(int argc, char **argv) { int rc; - rc = nodemap_cmd(LCFG_NODEMAP_ACTIVATE, NULL, 0, argv[0], argv[1], - NULL); + rc = nodemap_cmd(LCFG_NODEMAP_ACTIVATE, false, NULL, 0, + argv[0], argv[1], NULL); if (rc != 0) { errno = -rc; @@ -3924,7 +3991,8 @@ int jt_nodemap_add(int argc, char **argv) return 1; } - rc = nodemap_cmd(LCFG_NODEMAP_ADD, NULL, 0, argv[0], argv[1], NULL); + rc = nodemap_cmd(LCFG_NODEMAP_ADD, false, NULL, 0, argv[0], + argv[1], NULL); if (rc != 0) { errno = -rc; @@ -3954,7 +4022,8 @@ int jt_nodemap_del(int argc, char **argv) argv[1]); return rc; } - rc = nodemap_cmd(LCFG_NODEMAP_DEL, NULL, 0, argv[0], argv[1], NULL); + rc = nodemap_cmd(LCFG_NODEMAP_DEL, false, NULL, 0, argv[0], + argv[1], NULL); if (rc != 0) { errno = -rc; @@ -3979,7 +4048,7 @@ int jt_nodemap_test_nid(int argc, char **argv) char rawbuf[MAX_IOC_BUFLEN]; int rc; - rc = nodemap_cmd(LCFG_NODEMAP_TEST_NID, &rawbuf, sizeof(rawbuf), + rc = nodemap_cmd(LCFG_NODEMAP_TEST_NID, false, &rawbuf, sizeof(rawbuf), argv[0], argv[1], NULL); if (rc == 0) printf("%s\n", (char *)rawbuf); @@ -4036,7 +4105,7 @@ int jt_nodemap_test_id(int argc, char **argv) return -1; } - rc = nodemap_cmd(LCFG_NODEMAP_TEST_ID, &rawbuf, sizeof(rawbuf), + rc = nodemap_cmd(LCFG_NODEMAP_TEST_ID, false, &rawbuf, sizeof(rawbuf), argv[0], nidstr, typestr, idstr, NULL); if (rc == 0) printf("%s\n", (char *)rawbuf); @@ -4152,7 +4221,7 @@ int jt_nodemap_add_range(int argc, char **argv) if (rc) { return rc; } - rc = nodemap_cmd(LCFG_NODEMAP_ADD_RANGE, NULL, 0, argv[0], + rc = nodemap_cmd(LCFG_NODEMAP_ADD_RANGE, false, NULL, 0, argv[0], nodemap_name, nid_range, NULL); if (rc) { fprintf(stderr, @@ -4211,7 +4280,7 @@ int jt_nodemap_del_range(int argc, char **argv) errno = -rc; return rc; } - rc = nodemap_cmd(LCFG_NODEMAP_DEL_RANGE, NULL, 0, argv[0], + rc = nodemap_cmd(LCFG_NODEMAP_DEL_RANGE, false, NULL, 0, argv[0], nodemap_name, nid_range, NULL); if (rc != 0) { errno = -rc; @@ -4264,7 +4333,7 @@ int jt_nodemap_set_fileset(int argc, char **argv) return -1; } - rc = nodemap_cmd(LCFG_NODEMAP_SET_FILESET, NULL, 0, argv[0], + rc = nodemap_cmd(LCFG_NODEMAP_SET_FILESET, false, NULL, 0, argv[0], nodemap_name, fileset_name, NULL); if (rc != 0) { errno = -rc; @@ -4328,7 +4397,7 @@ int jt_nodemap_set_sepol(int argc, char **argv) return -1; } - rc = nodemap_cmd(LCFG_NODEMAP_SET_SEPOL, NULL, 0, argv[0], + rc = nodemap_cmd(LCFG_NODEMAP_SET_SEPOL, false, NULL, 0, argv[0], nodemap_name, sepol, NULL); if (rc != 0) { errno = -rc; @@ -4420,7 +4489,7 @@ int jt_nodemap_modify(int argc, char **argv) return -1; } - rc = nodemap_cmd(cmd, NULL, 0, argv[0], nodemap_name, param, + rc = nodemap_cmd(cmd, false, NULL, 0, argv[0], nodemap_name, param, value, NULL); if (rc != 0) { errno = -rc; @@ -4482,7 +4551,8 @@ int jt_nodemap_add_idmap(int argc, char **argv) return -1; } - rc = nodemap_cmd(cmd, NULL, 0, argv[0], nodemap_name, idmap, NULL); + rc = nodemap_cmd(cmd, false, NULL, 0, + argv[0], nodemap_name, idmap, NULL); if (rc != 0) { errno = -rc; fprintf(stderr, @@ -4543,7 +4613,8 @@ int jt_nodemap_del_idmap(int argc, char **argv) return -1; } - rc = nodemap_cmd(cmd, NULL, 0, argv[0], nodemap_name, idmap, NULL); + rc = nodemap_cmd(cmd, false, NULL, 0, + argv[0], nodemap_name, idmap, NULL); if (rc != 0) { errno = -rc; fprintf(stderr, -- 1.8.3.1