X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Futils%2Fobd.c;h=dc5e151a2e6e09dcc6b3e0144de20eb86c065112;hp=f6a93487b92a3814290b1da535136aa52e5c1fb0;hb=e83f6e4fc7c3e2681bee744563d80cd45db95a4d;hpb=fc55dd29cfaccbe925839ff665591c85313e3359 diff --git a/lustre/utils/obd.c b/lustre/utils/obd.c index f6a9348..dc5e151 100644 --- a/lustre/utils/obd.c +++ b/lustre/utils/obd.c @@ -23,7 +23,7 @@ * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2016, Intel Corporation. + * Copyright (c) 2011, 2017, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -67,16 +67,16 @@ #include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include -#include #include -#include -#include #define MAX_STRING_SIZE 128 @@ -134,7 +134,7 @@ int lcfg_ioctl(char * func, int dev_id, struct lustre_cfg *lcfg) lcfg->lcfg_buflens); data.ioc_pbuf1 = (void *)lcfg; memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(func)); @@ -184,7 +184,7 @@ int lcfg_mgs_ioctl(char *func, int dev_id, struct lustre_cfg *lcfg) lcfg->lcfg_buflens); data.ioc_pbuf1 = (void *)lcfg; memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(func)); @@ -235,7 +235,7 @@ static int do_name2dev(char *func, char *name) data.ioc_inlbuf1 = name; memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc < 0) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(func)); @@ -244,7 +244,7 @@ static int do_name2dev(char *func, char *name) rc = l2_ioctl(OBD_DEV_ID, OBD_IOC_NAME2DEV, buf); if (rc < 0) return errno; - rc = obd_ioctl_unpack(&data, buf, sizeof(rawbuf)); + rc = llapi_ioctl_unpack(&data, buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid reply\n", jt_cmdname(func)); @@ -260,25 +260,27 @@ static int do_name2dev(char *func, char *name) */ int parse_devname(char *func, char *name) { - int rc; - int ret = -1; + int rc; + int ret = -1; + int try_digit; + + if (!name) + return ret; + + try_digit = isdigit(name[0]); - if (!name) - return ret; - if (isdigit(name[0])) { + if (name[0] == '$' || name[0] == '%') + name++; + + rc = do_name2dev(func, name); + if (rc >= N2D_OFF) + return rc - N2D_OFF; + + if (try_digit) ret = strtoul(name, NULL, 0); - } else { - if (name[0] == '$' || name[0] == '%') - name++; - rc = do_name2dev(func, name); - if (rc >= N2D_OFF) { - ret = rc - N2D_OFF; - // printf("Name %s is device %d\n", name, ret); - } else { - fprintf(stderr, "No device found for name %s: %s\n", + else + fprintf(stderr, "No device found for name %s: %s\n", name, strerror(rc)); - } - } return ret; } @@ -856,7 +858,7 @@ int jt_obd_no_transno(int argc, char **argv) return CMD_HELP; memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); @@ -883,7 +885,7 @@ int jt_obd_set_readonly(int argc, char **argv) return CMD_HELP; memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); @@ -910,7 +912,7 @@ int jt_obd_abort_recovery(int argc, char **argv) return CMD_HELP; memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); @@ -1008,8 +1010,8 @@ int jt_obd_list_ioctl(int argc, char **argv) memset(buf, 0, sizeof(rawbuf)); data->ioc_version = OBD_IOCTL_VERSION; data->ioc_inllen1 = - sizeof(rawbuf) - cfs_size_round(sizeof(*data)); - data->ioc_inlbuf1 = buf + cfs_size_round(sizeof(*data)); + sizeof(rawbuf) - __ALIGN_KERNEL(sizeof(*data), 8); + data->ioc_inlbuf1 = buf + __ALIGN_KERNEL(sizeof(*data), 8); data->ioc_len = obd_ioctl_packlen(data); data->ioc_count = index; @@ -1095,7 +1097,7 @@ int jt_obd_alloc_fids(struct jt_fid_space *space, struct lu_fid *fid, data.ioc_plen2 = sizeof(max_count); memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: invalid ioctl rc = %d\n", rc); return rc; @@ -1376,7 +1378,7 @@ int jt_obd_md_common(int argc, char **argv, int cmd) count += data.ioc_count; memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl %d\n", jt_cmdname(argv[0]), rc); @@ -1512,14 +1514,14 @@ int jt_obd_create(int argc, char **argv) OBD_MD_FLPROJID; memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); return rc; } rc = l2_ioctl(OBD_DEV_ID, OBD_IOC_CREATE, buf); - obd_ioctl_unpack(&data, buf, sizeof(rawbuf)); + llapi_ioctl_unpack(&data, buf, sizeof(rawbuf)); shmem_bump(1); if (rc < 0) { fprintf(stderr, "error: %s: #%d - %s\n", @@ -1582,7 +1584,7 @@ int jt_obd_setattr(int argc, char **argv) data.ioc_obdo1.o_valid = OBD_MD_FLID | OBD_MD_FLTYPE | OBD_MD_FLMODE; memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); @@ -1659,7 +1661,7 @@ int jt_obd_test_setattr(int argc, char **argv) data.ioc_obdo1.o_mode = S_IFREG; data.ioc_obdo1.o_valid = OBD_MD_FLID | OBD_MD_FLTYPE | OBD_MD_FLMODE; memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); @@ -1713,6 +1715,7 @@ int jt_obd_destroy(int argc, char **argv) if (argc < 2 || argc > 4) return CMD_HELP; + errno = 0; id = strtoull(argv[1], &end, 0); if (*end || id == 0 || errno != 0) { fprintf(stderr, "error: %s: invalid objid '%s'\n", @@ -1752,14 +1755,14 @@ int jt_obd_destroy(int argc, char **argv) data.ioc_obdo1.o_valid = OBD_MD_FLID | OBD_MD_FLMODE; memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); return rc; } rc = l2_ioctl(OBD_DEV_ID, OBD_IOC_DESTROY, buf); - obd_ioctl_unpack(&data, buf, sizeof(rawbuf)); + llapi_ioctl_unpack(&data, buf, sizeof(rawbuf)); shmem_bump(1); if (rc < 0) { fprintf(stderr, "error: %s: objid %#jx: %s\n", @@ -1811,14 +1814,14 @@ int jt_obd_getattr(int argc, char **argv) (uintmax_t)ostid_id(&data.ioc_obdo1.o_oi)); memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); return rc; } rc = l2_ioctl(OBD_DEV_ID, OBD_IOC_GETATTR, buf); - obd_ioctl_unpack(&data, buf, sizeof(rawbuf)); + llapi_ioctl_unpack(&data, buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]), strerror(rc = errno)); @@ -1893,7 +1896,7 @@ int jt_obd_test_getattr(int argc, char **argv) data.ioc_obdo1.o_mode = S_IFREG; data.ioc_obdo1.o_valid = 0xffffffff; memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); @@ -2124,7 +2127,7 @@ int jt_obd_test_brw(int argc, char **argv) for (i = 1, next_count = verbose; i <= count && shmem_running(); i++) { data.ioc_obdo1.o_valid &= ~(OBD_MD_FLBLOCKS|OBD_MD_FLGRANT); memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); @@ -2219,7 +2222,7 @@ int jt_obd_lov_getconfig(int argc, char **argv) memset(&desc, 0, sizeof(desc)); obd_str2uuid(&desc.ld_uuid, argv[1]); - desc.ld_tgt_count = ((OBD_MAX_IOCTL_BUFFER-sizeof(data)-sizeof(desc)) / + desc.ld_tgt_count = ((MAX_IOC_BUFLEN-sizeof(data)-sizeof(desc)) / (sizeof(*uuidarray) + sizeof(*obdgens))); repeat: @@ -2246,7 +2249,7 @@ repeat: data.ioc_inllen3 = desc.ld_tgt_count * sizeof(*obdgens); data.ioc_inlbuf3 = (char *)obdgens; - if (obd_ioctl_pack(&data, &buf, sizeof(rawbuf))) { + if (llapi_ioctl_pack(&data, &buf, sizeof(rawbuf))) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); rc = -EINVAL; @@ -2265,7 +2268,7 @@ repeat: __u32 *genp; int i; - if (obd_ioctl_unpack(&data, buf, sizeof(rawbuf))) { + if (llapi_ioctl_unpack(&data, buf, sizeof(rawbuf))) { fprintf(stderr, "error: %s: invalid reply\n", jt_cmdname(argv[0])); rc = -EINVAL; @@ -2312,7 +2315,7 @@ static int do_activate(int argc, char **argv, int flag) data.ioc_offset = flag; memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); @@ -2340,8 +2343,8 @@ static int do_activate(int argc, char **argv, int flag) * are skipped and recorded with new nids and uuid. * * \see mgs_replace_nids - * \see mgs_replace_nids_log - * \see mgs_replace_handler + * \see mgs_replace_log + * \see mgs_replace_nids_handler */ int jt_replace_nids(int argc, char **argv) { @@ -2360,7 +2363,7 @@ int jt_replace_nids(int argc, char **argv) data.ioc_inllen2 = strlen(argv[2]) + 1; data.ioc_inlbuf2 = argv[2]; memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); @@ -2376,6 +2379,52 @@ int jt_replace_nids(int argc, char **argv) return rc; } +/** + * Clear config logs for given device or filesystem. + * lctl clear_conf + * Command has to be run on MGS node having MGS device mounted with -o + * nosvc. + * + * Configuration logs for filesystem or one particular log is + * processed. New log is created, original log is read, its records + * marked SKIP do not get copied to new log. Others are copied as-is. + * Original file is renamed to log.${time}.bak. + * + * \see mgs_clear_configs + * \see mgs_replace_log + * \see mgs_clear_config_handler + **/ +int jt_lcfg_clear(int argc, char **argv) +{ + int rc; + char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf; + struct obd_ioctl_data data; + + memset(&data, 0, sizeof(data)); + data.ioc_dev = get_mgs_device(); + if (argc != 2) + return CMD_HELP; + + data.ioc_inllen1 = strlen(argv[1]) + 1; + data.ioc_inlbuf1 = argv[1]; + + memset(buf, 0, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); + if (rc) { + fprintf(stderr, "error: %s: invalid ioctl\n", + jt_cmdname(argv[0])); + return rc; + } + + rc = l2_ioctl(OBD_DEV_ID, OBD_IOC_CLEAR_CONFIGS, buf); + if (rc < 0) { + fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]), + strerror(rc = errno)); + } + + return rc; +} + int jt_obd_deactivate(int argc, char **argv) { return do_activate(argc, argv, 0); @@ -2403,7 +2452,7 @@ int jt_obd_recover(int argc, char **argv) } memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); @@ -2440,7 +2489,7 @@ int jt_obd_mdc_lookup(int argc, char **argv) data.ioc_inlbuf1 = child; memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); @@ -2462,7 +2511,7 @@ int jt_obd_mdc_lookup(int argc, char **argv) close(fd); if (verbose) { - rc = obd_ioctl_unpack(&data, buf, sizeof(rawbuf)); + rc = llapi_ioctl_unpack(&data, buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid reply\n", jt_cmdname(argv[0])); @@ -2493,7 +2542,7 @@ int jt_lcfg_fork(int argc, char **argv) data.ioc_inlbuf2 = argv[2]; memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); @@ -2528,7 +2577,7 @@ int jt_lcfg_erase(int argc, char **argv) data.ioc_inlbuf1 = argv[1]; memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); @@ -2554,9 +2603,9 @@ int jt_llog_catlist(int argc, char **argv) memset(&data, 0, sizeof(data)); data.ioc_dev = cur_device; - data.ioc_inllen1 = sizeof(rawbuf) - cfs_size_round(sizeof(data)); + data.ioc_inllen1 = sizeof(rawbuf) - __ALIGN_KERNEL(sizeof(data), 8); memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); @@ -2585,10 +2634,10 @@ int jt_llog_info(int argc, char **argv) data.ioc_dev = cur_device; data.ioc_inllen1 = strlen(argv[1]) + 1; data.ioc_inlbuf1 = argv[1]; - data.ioc_inllen2 = sizeof(rawbuf) - cfs_size_round(sizeof(data)) - - cfs_size_round(data.ioc_inllen1); + data.ioc_inllen2 = sizeof(rawbuf) - __ALIGN_KERNEL(sizeof(data), 8) - + __ALIGN_KERNEL(data.ioc_inllen1, 8); memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); @@ -2630,12 +2679,12 @@ int jt_llog_print(int argc, char **argv) data.ioc_inllen3 = strlen(to) + 1; data.ioc_inlbuf3 = to; } - data.ioc_inllen4 = sizeof(rawbuf) - cfs_size_round(sizeof(data)) - - cfs_size_round(data.ioc_inllen1) - - cfs_size_round(data.ioc_inllen2) - - cfs_size_round(data.ioc_inllen3); + data.ioc_inllen4 = sizeof(rawbuf) - __ALIGN_KERNEL(sizeof(data), 8) - + __ALIGN_KERNEL(data.ioc_inllen1, 8) - + __ALIGN_KERNEL(data.ioc_inllen2, 8) - + __ALIGN_KERNEL(data.ioc_inllen3, 8); memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); @@ -2745,7 +2794,7 @@ int jt_llog_cancel(int argc, char **argv) } memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); @@ -2788,12 +2837,12 @@ int jt_llog_check(int argc, char **argv) data.ioc_inllen3 = strlen(to) + 1; data.ioc_inlbuf3 = to; } - data.ioc_inllen4 = sizeof(rawbuf) - cfs_size_round(sizeof(data)) - - cfs_size_round(data.ioc_inllen1) - - cfs_size_round(data.ioc_inllen2) - - cfs_size_round(data.ioc_inllen3); + data.ioc_inllen4 = sizeof(rawbuf) - __ALIGN_KERNEL(sizeof(data), 8) - + __ALIGN_KERNEL(data.ioc_inllen1, 8) - + __ALIGN_KERNEL(data.ioc_inllen2, 8) - + __ALIGN_KERNEL(data.ioc_inllen3, 8); memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); @@ -2827,7 +2876,7 @@ int jt_llog_remove(int argc, char **argv) data.ioc_inlbuf2 = argv[2]; } memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); @@ -2862,8 +2911,7 @@ int obd_initialize(int argc, char **argv) if (shmem_setup() != 0) return -1; - register_ioc_dev(OBD_DEV_ID, OBD_DEV_PATH, - OBD_DEV_MAJOR, OBD_DEV_MINOR); + register_ioc_dev(OBD_DEV_ID, OBD_DEV_PATH); return 0; } @@ -3136,7 +3184,7 @@ static int pool_cmd(enum lcfg_command_type cmd, data.ioc_pbuf1 = (void *)lcfg; memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(cmdname)); @@ -3147,8 +3195,24 @@ static int pool_cmd(enum lcfg_command_type cmd, out: if (rc) rc = -errno; + switch (rc) { + case -ENAMETOOLONG: + fprintf(stderr, "error: %s: either the pool or file " + "system name is too long (max pool name len " + "is %d and file system name is %d)\n", + jt_cmdname(cmdname), LOV_MAXPOOLNAME, + LUSTRE_MAXFSNAME); + break; + case -EINVAL: + fprintf(stderr, "error: %s can contain only " + "alphanumeric characters, underscores, and " + "dashes besides the required '.'\n", + jt_cmdname(cmdname)); + default: + break; + } free(lcfg); - return rc; + return rc; } /** @@ -3203,7 +3267,7 @@ static int nodemap_cmd(enum lcfg_command_type cmd, void *ret_data, data.ioc_pbuf1 = (void *)lcfg; memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc != 0) { fprintf(stderr, "error: invalid ioctl: %08x errno: %d with " "rc=%d\n", cmd, errno, rc); @@ -3218,7 +3282,7 @@ static int nodemap_cmd(enum lcfg_command_type cmd, void *ret_data, } if (ret_data != NULL) { - rc = obd_ioctl_unpack(&data, buf, sizeof(rawbuf)); + rc = llapi_ioctl_unpack(&data, buf, sizeof(rawbuf)); if (rc != 0) goto out; @@ -3363,32 +3427,15 @@ int jt_nodemap_test_id(int argc, char **argv) int rc = 0; int c; - static struct option long_options[] = { - { - .name = "nid", - .has_arg = required_argument, - .flag = 0, - .val = 'n', - }, - { - .name = "idtype", - .has_arg = required_argument, - .flag = 0, - .val = 't', - }, - { - .name = "id", - .has_arg = required_argument, - .flag = 0, - .val = 'i', - }, - { - NULL - } - }; + static struct option long_opts[] = { + { .val = 'i', .name = "id", .has_arg = required_argument }, + { .val = 'n', .name = "nid", .has_arg = required_argument }, + { .val = 't', .name = "idtype", + .has_arg = required_argument }, + { .name = NULL } }; while ((c = getopt_long(argc, argv, "n:t:i:", - long_options, NULL)) != -1) { + long_opts, NULL)) != -1) { switch (c) { case 'n': nidstr = optarg; @@ -3470,14 +3517,21 @@ int jt_nodemap_add_range(int argc, char **argv) return -1; } - if (!cfs_nidrange_is_contiguous(&nidlist)) { - fprintf(stderr, "error: %s: nodemap ranges must be " - "contiguous\n", jt_cmdname(argv[0])); - return -1; + rc = cfs_nidrange_find_min_max(&nidlist, &min_nid[0], &max_nid[0], + LNET_NIDSTR_SIZE); + if (rc < 0) { + errno = -rc; + if (rc == -EINVAL) + fprintf(stderr, "error: %s: nid range uses " + "currently unsupported features\n", + jt_cmdname(argv[0])); + else if (rc == -ERANGE) + fprintf(stderr, "error: %s: nodemap ranges must be " + "contiguous\n", jt_cmdname(argv[0])); + + return rc; } - cfs_nidrange_find_min_max(&nidlist, &min_nid[0], &max_nid[0], - LNET_NIDSTR_SIZE); snprintf(nid_range, sizeof(nid_range), "%s:%s", min_nid, max_nid); rc = nodemap_cmd(LCFG_NODEMAP_ADD_RANGE, NULL, 0, argv[0], @@ -3514,28 +3568,15 @@ int jt_nodemap_del_range(int argc, char **argv) int rc = 0; int c; - static struct option long_options[] = { - { - .name = "name", - .has_arg = required_argument, - .flag = 0, - .val = 'n', - }, - { - .name = "range", - .has_arg = required_argument, - .flag = 0, - .val = 'r', - }, - { - NULL - } - }; + static struct option long_opts[] = { + { .val = 'n', .name = "name", .has_arg = required_argument }, + { .val = 'r', .name = "range", .has_arg = required_argument }, + { .name = NULL } }; INIT_LIST_HEAD(&nidlist); while ((c = getopt_long(argc, argv, "n:r:", - long_options, NULL)) != -1) { + long_opts, NULL)) != -1) { switch (c) { case 'n': nodemap_name = optarg; @@ -3559,14 +3600,21 @@ int jt_nodemap_del_range(int argc, char **argv) return -1; } - if (!cfs_nidrange_is_contiguous(&nidlist)) { - fprintf(stderr, "error: %s: nodemap ranges must be " - "contiguous\n", jt_cmdname(argv[0])); - return -1; + rc = cfs_nidrange_find_min_max(&nidlist, &min_nid[0], &max_nid[0], + LNET_NIDSTR_SIZE); + if (rc < 0) { + errno = -rc; + if (rc == -EINVAL) + fprintf(stderr, "error: %s: nid range uses " + "currently unsupported features\n", + jt_cmdname(argv[0])); + else if (rc == -ERANGE) + fprintf(stderr, "error: %s: nodemap ranges must be " + "contiguous\n", jt_cmdname(argv[0])); + + return rc; } - cfs_nidrange_find_min_max(&nidlist, &min_nid[0], &max_nid[0], - LNET_NIDSTR_SIZE); snprintf(nid_range, sizeof(nid_range), "%s:%s", min_nid, max_nid); rc = nodemap_cmd(LCFG_NODEMAP_DEL_RANGE, NULL, 0, argv[0], @@ -3681,7 +3729,7 @@ int jt_nodemap_modify(int argc, char **argv) fprintf(stderr, "usage: nodemap_modify --name " "--property --value \n"); fprintf(stderr, "valid properties: admin trusted map_mode " - "squash_uid squash_gid deny_unknown\n"); + "squash_uid squash_gid deny_unknown audit_mode\n"); return -1; } @@ -3697,6 +3745,8 @@ int jt_nodemap_modify(int argc, char **argv) cmd = LCFG_NODEMAP_SQUASH_GID; } else if (strcmp("map_mode", param) == 0) { cmd = LCFG_NODEMAP_MAP_MODE; + } else if (strcmp("audit_mode", param) == 0) { + cmd = LCFG_NODEMAP_AUDIT_MODE; } else { fprintf(stderr, "error: %s: nodemap_modify invalid " "subcommand: %s\n", @@ -3781,32 +3831,14 @@ int jt_nodemap_del_idmap(int argc, char **argv) char *idtype = NULL; int rc = 0; - static struct option long_options[] = { - { - .name = "name", - .has_arg = required_argument, - .flag = 0, - .val = 'n', - }, - { - .name = "idmap", - .has_arg = required_argument, - .flag = 0, - .val = 'm', - }, - { - .name = "idtype", - .has_arg = required_argument, - .flag = 0, - .val = 'i', - }, - { - NULL - } - }; + static struct option long_opts[] = { + { .val = 'i', .name = "idtype", .has_arg = required_argument }, + { .val = 'm', .name = "idmap", .has_arg = required_argument }, + { .val = 'n', .name = "name", .has_arg = required_argument }, + { .name = NULL } }; while ((c = getopt_long(argc, argv, "n:m:i:", - long_options, NULL)) != -1) { + long_opts, NULL)) != -1) { switch (c) { case 'n': nodemap_name = optarg; @@ -3937,7 +3969,7 @@ static int extract_fsname_poolname(const char *arg, char *fsname, char *ptr; int rc; - strlcpy(fsname, arg, PATH_MAX + 1); + snprintf(fsname, PATH_MAX + 1, "%s", arg); ptr = strchr(fsname, '.'); if (ptr == NULL) { fprintf(stderr, ". is missing in %s\n", fsname); @@ -3962,6 +3994,11 @@ static int extract_fsname_poolname(const char *arg, char *fsname, strncpy(poolname, ptr, LOV_MAXPOOLNAME); poolname[LOV_MAXPOOLNAME] = '\0'; + + if (strncmp(poolname, "none", LOV_MAXPOOLNAME) == 0) { + fprintf(stderr, "poolname cannot be 'none'\n"); + return -EINVAL; + } return 0; err: @@ -4104,6 +4141,7 @@ out: return rc; } +#ifdef HAVE_SERVER_SUPPORT static const char *barrier_status2name(enum barrier_status status) { switch (status) { @@ -4163,7 +4201,7 @@ int jt_barrier_freeze(int argc, char **argv) data.ioc_inlbuf1 = (char *)&bc; data.ioc_inllen1 = sizeof(bc); memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "Fail to pack ioctl data: rc = %d.\n", rc); return rc; @@ -4206,7 +4244,7 @@ int jt_barrier_thaw(int argc, char **argv) data.ioc_inlbuf1 = (char *)&bc; data.ioc_inllen1 = sizeof(bc); memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "Fail to pack ioctl data: rc = %d.\n", rc); return rc; @@ -4220,7 +4258,7 @@ int jt_barrier_thaw(int argc, char **argv) return rc; } -int __jt_barrier_stat(int argc, char **argv, struct barrier_ctl *bc) +int __jt_barrier_stat(const char *fsname, struct barrier_ctl *bc) { struct obd_ioctl_data data; char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf; @@ -4234,11 +4272,11 @@ int __jt_barrier_stat(int argc, char **argv, struct barrier_ctl *bc) memset(bc, 0, sizeof(*bc)); bc->bc_version = BARRIER_VERSION_V1; bc->bc_cmd = BC_STAT; - strncpy(bc->bc_name, argv[1], sizeof(bc->bc_name)); + strncpy(bc->bc_name, fsname, sizeof(bc->bc_name)); data.ioc_inlbuf1 = (char *)bc; data.ioc_inllen1 = sizeof(*bc); memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "Fail to pack ioctl data: rc = %d.\n", rc); return rc; @@ -4247,9 +4285,9 @@ int __jt_barrier_stat(int argc, char **argv, struct barrier_ctl *bc) rc = l_ioctl(OBD_DEV_ID, OBD_IOC_BARRIER, buf); if (rc < 0) fprintf(stderr, "Fail to query barrier for %s: %s\n", - argv[1], strerror(errno)); + fsname, strerror(errno)); else - obd_ioctl_unpack(&data, buf, sizeof(rawbuf)); + llapi_ioctl_unpack(&data, buf, sizeof(rawbuf)); return rc; } @@ -4257,26 +4295,68 @@ int __jt_barrier_stat(int argc, char **argv, struct barrier_ctl *bc) int jt_barrier_stat(int argc, char **argv) { struct barrier_ctl bc; + static struct option long_opt_barrier_stat[] = { + { + .val = 's', + .name = "state", + .has_arg = no_argument, + }, + { .val = 't', + .name = "timeout", + .has_arg = no_argument, + }, + { + NULL + } + }; + const char *name; + int index; + int opt; int rc; + bool state = false; + bool timeout = false; + + while ((opt = getopt_long(argc, argv, "st", long_opt_barrier_stat, + &index)) != EOF) { + switch (opt) { + case 's': + state = true; + break; + case 't': + timeout = true; + break; + default: + return CMD_HELP; + } + } - if (argc != 2) + if (optind >= argc) return CMD_HELP; - if (strlen(argv[1]) > 8) { + name = argv[optind]; + if (strlen(name) > 8) { fprintf(stderr, "fsname name %s is too long. " - "It should not exceed 8.\n", argv[1]); + "It should not exceed 8.\n", name); return -EINVAL; } - rc = __jt_barrier_stat(argc, argv, &bc); + rc = __jt_barrier_stat(name, &bc); if (!rc) { - printf("The barrier for %s is in '%s'\n", - argv[1], barrier_status2name(bc.bc_status)); - if (bc.bc_status == BS_FREEZING_P1 || - bc.bc_status == BS_FREEZING_P2 || - bc.bc_status == BS_FROZEN) - printf("The barrier will be expired after %d " - "seconds\n", bc.bc_timeout); + if (state && !timeout) + printf("%s\n", barrier_status2name(bc.bc_status)); + else if (timeout && !state) + printf("%d\n", + (bc.bc_status == BS_FREEZING_P1 || + bc.bc_status == BS_FREEZING_P2 || + bc.bc_status == BS_FROZEN) ? + bc.bc_timeout : 0); + else + printf("state: %s\ntimeout: %d seconds\n", + barrier_status2name(bc.bc_status), + (bc.bc_status == BS_FREEZING_P1 || + bc.bc_status == BS_FREEZING_P2 || + bc.bc_status == BS_FROZEN) ? + bc.bc_timeout : 0); } return rc; @@ -4315,7 +4395,7 @@ int jt_barrier_rescan(int argc, char **argv) data.ioc_inlbuf1 = (char *)&bc; data.ioc_inllen1 = sizeof(bc); memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { fprintf(stderr, "Fail to pack ioctl data: rc = %d.\n", rc); return rc; @@ -4326,13 +4406,14 @@ int jt_barrier_rescan(int argc, char **argv) fprintf(stderr, "Fail to rescan barrier bitmap for %s: %s\n", argv[1], strerror(errno)); } else { - obd_ioctl_unpack(&data, buf, sizeof(rawbuf)); + llapi_ioctl_unpack(&data, buf, sizeof(rawbuf)); printf("%u of %u MDT(s) in the filesystem %s are inactive\n", bc.bc_absence, bc.bc_total, argv[1]); } return rc; } +#endif /* HAVE_SERVER_SUPPORT */ int jt_get_obj_version(int argc, char **argv) { @@ -4382,7 +4463,7 @@ int jt_get_obj_version(int argc, char **argv) data.ioc_inllen2 = sizeof version; memset(buf, 0, sizeof *buf); - rc = obd_ioctl_pack(&data, &buf, sizeof rawbuf); + rc = llapi_ioctl_pack(&data, &buf, sizeof rawbuf); if (rc) { fprintf(stderr, "error: %s: packing ioctl arguments: %s\n", jt_cmdname(argv[0]), strerror(-rc)); @@ -4396,7 +4477,7 @@ int jt_get_obj_version(int argc, char **argv) return -errno; } - obd_ioctl_unpack(&data, buf, sizeof rawbuf); + llapi_ioctl_unpack(&data, buf, sizeof rawbuf); printf("%#jx\n", (uintmax_t)version); return 0; } @@ -4430,7 +4511,7 @@ int jt_changelog_register(int argc, char **argv) data.ioc_dev = cur_device; - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc < 0) { fprintf(stderr, "error: %s: cannot pack ioctl: %s\n", jt_cmdname(argv[0]), strerror(-rc)); @@ -4445,7 +4526,7 @@ int jt_changelog_register(int argc, char **argv) return rc; } - obd_ioctl_unpack(&data, buf, sizeof(rawbuf)); + llapi_ioctl_unpack(&data, buf, sizeof(rawbuf)); if (data.ioc_u32_1 == 0) { fprintf(stderr, "received invalid userid!\n"); @@ -4484,7 +4565,7 @@ int jt_changelog_deregister(int argc, char **argv) data.ioc_dev = cur_device; data.ioc_u32_1 = id; - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc < 0) { fprintf(stderr, "error: %s: invalid ioctl\n", jt_cmdname(argv[0])); @@ -4498,7 +4579,7 @@ int jt_changelog_deregister(int argc, char **argv) return rc; } - obd_ioctl_unpack(&data, buf, sizeof(rawbuf)); + llapi_ioctl_unpack(&data, buf, sizeof(rawbuf)); printf("%s: Deregistered changelog user '%s%u'\n", device, CHANGELOG_USER_PREFIX, data.ioc_u32_1);