X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Futils%2Fobd.c;h=382573019f7faae6a2405c31efee60621116f41a;hp=08047e5e048c6b4ab8d0a28bc6a87ba5c35f2756;hb=63f310a5c9f799e7ce99badf410853d3275380d2;hpb=34acfbc2bfe502d18c12ba35771bde7c4a0f7906 diff --git a/lustre/utils/obd.c b/lustre/utils/obd.c index 08047e5..3825730 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; } @@ -528,16 +530,21 @@ static void shmem_snap(int total_threads, int live_threads) } secs = difftime(&this_time, &prev_time); - if (prev_valid && secs > 1.0) /* someone screwed with the time? */ - printf("%d/%d Total: %f/second\n", non_zero, total_threads, - total / secs); + if (prev_valid && secs > 1.0) { /* someone screwed with the time? */ + printf("%d/%d Total: %f/second\n", non_zero, total_threads, + total / secs); - memcpy(counter_snapshot[1], counter_snapshot[0], - total_threads * sizeof(counter_snapshot[0][0])); - prev_time = this_time; - if (!prev_valid && - running == total_threads) - prev_valid = 1; + memcpy(counter_snapshot[1], counter_snapshot[0], + total_threads * sizeof(counter_snapshot[0][0])); + prev_time = this_time; + } + if (!prev_valid && running == total_threads) { + prev_valid = 1; + /* drop counters when all threads were started */ + memcpy(counter_snapshot[1], counter_snapshot[0], + total_threads * sizeof(counter_snapshot[0][0])); + prev_time = this_time; + } } static void shmem_stop(void) @@ -856,7 +863,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 +890,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 +917,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 +1015,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 +1102,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; @@ -1150,18 +1157,21 @@ int jt_obd_md_common(int argc, char **argv, int cmd) char *name = NULL; struct jt_fid_space fid_space = {0}; int version = 0; - struct option long_opts[] = { - {"child_base_id", required_argument, 0, 'b'}, - {"stripe_count", required_argument, 0, 'c'}, - {"parent_basedir", required_argument, 0, 'd'}, - {"parent_dircount", required_argument, 0, 'D'}, - {"stripe_index", required_argument, 0, 'i'}, - {"mode", required_argument, 0, 'm'}, - {"count", required_argument, 0, 'n'}, - {"time", required_argument, 0, 't'}, - {"version", no_argument, 0, 'v'}, - {0, 0, 0, 0} - }; + struct option long_opts[] = { + { .val = 'b', .name = "child_base_id", + .has_arg = required_argument }, + { .val = 'c', .name = "stripe_count", + .has_arg = required_argument }, + { .val = 'd', .name = "parent_basedir", + .has_arg = required_argument }, + { .val = 'D', .name = "parent_dircount", + .has_arg = required_argument }, + { .val = 'i', .name = "stripe_index", .has_arg = required_argument }, + { .val = 'm', .name = "mode", .has_arg = required_argument }, + { .val = 'n', .name = "count", .has_arg = required_argument }, + { .val = 't', .name = "time", .has_arg = required_argument }, + { .val = 'v', .name = "version", .has_arg = no_argument }, + { .name = NULL } }; while ((c = getopt_long(argc, argv, "b:c:d:D:m:n:t:v", long_opts, NULL)) >= 0) { @@ -1373,7 +1383,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); @@ -1509,14 +1519,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", @@ -1579,7 +1589,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])); @@ -1656,7 +1666,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])); @@ -1710,6 +1720,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", @@ -1749,14 +1760,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", @@ -1808,14 +1819,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)); @@ -1890,7 +1901,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])); @@ -2121,7 +2132,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])); @@ -2216,7 +2227,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: @@ -2243,7 +2254,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; @@ -2262,7 +2273,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; @@ -2275,7 +2286,7 @@ repeat: desc.ld_default_stripe_count); printf("default_stripe_size: %ju\n", (uintmax_t)desc.ld_default_stripe_size); - printf("default_stripe_offset: %ju\n", + printf("default_stripe_offset: %jd\n", (uintmax_t)desc.ld_default_stripe_offset); printf("default_stripe_pattern: %u\n", desc.ld_pattern); printf("obd_count: %u\n", desc.ld_tgt_count); @@ -2309,7 +2320,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])); @@ -2337,8 +2348,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) { @@ -2357,7 +2368,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])); @@ -2373,6 +2384,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); @@ -2400,7 +2457,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])); @@ -2437,7 +2494,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])); @@ -2459,7 +2516,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])); @@ -2490,7 +2547,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])); @@ -2525,7 +2582,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])); @@ -2551,9 +2608,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])); @@ -2571,130 +2628,353 @@ int jt_llog_catlist(int argc, char **argv) int jt_llog_info(int argc, char **argv) { - struct obd_ioctl_data data; - char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf; - int rc; + const struct option long_opts[] = { + /* Allow optional "--catalog" for compatibility with llog commands. */ + { .val = 'c', .name = "catalog", .has_arg = required_argument }, + { .val = 'h', .name = "help", .has_arg = no_argument }, + { .name = NULL } }; + struct obd_ioctl_data data = { 0 }; + char rawbuf[MAX_IOC_BUFLEN] = "", *buf = rawbuf; + char *cmd = argv[0]; + char *catalog = NULL; + int rc, c; - if (argc != 2) - return CMD_HELP; + while ((c = getopt_long(argc, argv, "c:h", long_opts, NULL)) != -1) { + switch (c) { + case 'c': + catalog = optarg; + break; + case 'h': + default: + return CMD_HELP; + } + } + argc -= optind; + argv += optind; + /* support "logname" positional parameter */ + if (argc == 1) { + if (catalog) { + fprintf(stderr, + "%s: catalog is set, unknown argument '%s'\n", + cmd, optarg); + return CMD_HELP; + } + catalog = argv[0]; + } else if (!catalog || argc > 1) { + return CMD_HELP; + } - memset(&data, 0, sizeof(data)); - 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); - memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); - if (rc) { - fprintf(stderr, "error: %s: invalid ioctl\n", - jt_cmdname(argv[0])); - return rc; - } + data.ioc_dev = cur_device; + data.ioc_inllen1 = strlen(catalog) + 1; + data.ioc_inlbuf1 = catalog; + data.ioc_inllen2 = sizeof(rawbuf) - __ALIGN_KERNEL(sizeof(data), 8) - + __ALIGN_KERNEL(data.ioc_inllen1, 8); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); + if (rc) { + fprintf(stderr, "%s: ioctl_pack failed for catalog '%s': %s\n", + jt_cmdname(cmd), catalog, strerror(-rc)); + return rc; + } - rc = l_ioctl(OBD_DEV_ID, OBD_IOC_LLOG_INFO, buf); - if (rc == 0) - fprintf(stdout, "%s", ((struct obd_ioctl_data*)buf)->ioc_bulk); - else - fprintf(stderr, "OBD_IOC_LLOG_INFO failed: %s\n", - strerror(errno)); + rc = l_ioctl(OBD_DEV_ID, OBD_IOC_LLOG_INFO, buf); + if (rc == 0) + fprintf(stdout, "%s", ((struct obd_ioctl_data *)buf)->ioc_bulk); + else + fprintf(stderr, "%s: OBD_IOC_LLOG_INFO failed: %s\n", + jt_cmdname(cmd), strerror(errno)); - return rc; + return rc; } -int jt_llog_print(int argc, char **argv) +int jt_llog_print_cb(const char *record, void *private) { - struct obd_ioctl_data data; - char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf; - int rc; + printf("%s\n", record); - if (argc != 2 && argc != 4) - return CMD_HELP; + return 0; +} - memset(&data, 0, sizeof(data)); - data.ioc_dev = cur_device; - data.ioc_inllen1 = strlen(argv[1]) + 1; - data.ioc_inlbuf1 = argv[1]; - if (argc == 4) { - data.ioc_inllen2 = strlen(argv[2]) + 1; - data.ioc_inlbuf2 = argv[2]; - data.ioc_inllen3 = strlen(argv[3]) + 1; - data.ioc_inlbuf3 = argv[3]; - } else { - char from[2] = "1", to[3] = "-1"; - data.ioc_inllen2 = strlen(from) + 1; - data.ioc_inlbuf2 = from; - 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); - memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); - if (rc) { - fprintf(stderr, "error: %s: invalid ioctl\n", - jt_cmdname(argv[0])); - return rc; - } +/** + * Iterate over llog records, typically YAML-formatted configuration logs + * + * \param logname[in] name of llog file or FID + * \param start[in] first record to process + * \param end[in] last record to process (inclusive) + * \param cb[in] callback for records. Return -ve error, or +ve abort. + * \param private[in,out] private data passed to the \a record_cb function + */ +int jt_llog_print_iter(char *logname, long start, long end, + int (record_cb)(const char *record, void *private), + void *private) +{ + struct obd_ioctl_data data = { 0 }; + char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf; + char startbuf[16], endbuf[16]; + static long inc = sizeof(rawbuf) / 128; + long rec; + int rc = 0; - rc = l_ioctl(OBD_DEV_ID, OBD_IOC_LLOG_PRINT, buf); - if (rc == 0) - fprintf(stdout, "%s", ((struct obd_ioctl_data*)buf)->ioc_bulk); - else - fprintf(stderr, "OBD_IOC_LLOG_PRINT failed: %s\n", - strerror(errno)); + if (end == -1) + end = 0x7fffffff; - return rc; + data.ioc_dev = cur_device; + data.ioc_inlbuf1 = logname; + data.ioc_inllen1 = strlen(logname) + 1; + + /* + * Estimate about 128 characters per configuration record. Not all + * records will be printed in any case, so they should easily fit. If + * not, the kernel will return -EOVERFLOW and ask for fewer records. + * + * We don't want to request records from the kernel one-at-a-time, as + * it restarts the config llog iteration from the beginning, so we + * fetch multiple records from the kernel per call and split locally. + */ + for (rec = start; rec < end; rec += inc) { + char *record = ((struct obd_ioctl_data *)buf)->ioc_bulk; + char *ptr; + +retry: + snprintf(startbuf, sizeof(startbuf), "%lu", rec); + snprintf(endbuf, sizeof(endbuf), "%lu", + end < rec + inc - 1 ? end : rec + inc - 1); + + /* start and end record numbers are passed as ASCII digits */ + data.ioc_inlbuf2 = startbuf; + data.ioc_inllen2 = strlen(startbuf) + 1; + data.ioc_inlbuf3 = endbuf; + data.ioc_inllen3 = strlen(endbuf) + 1; + + 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 = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); + if (rc) { + fprintf(stderr, "%s: invalid ioctl data\n", logname); + goto out; + } + + rc = l_ioctl(OBD_DEV_ID, OBD_IOC_LLOG_PRINT, buf); + if (rc == -EOVERFLOW && inc > 2) { + inc /= 2; + goto retry; + } + if (rc) { + fprintf(stderr, "%s: OBD_IOC_LLOG_PRINT failed: %s\n", + logname, strerror(errno)); + rc = -errno; + goto out; + } + + /* There is no "end of list" marker, record was not modified */ + if (strcmp(record, logname) == 0) + break; + + do { + ptr = strchr(record, '\n'); + if (ptr) + *ptr = '\0'; + rc = record_cb(record, private); + if (rc) { + if (rc > 0) + rc = 0; + goto out; + } + + if (ptr) + record = ptr + 1; + } while (ptr && *(ptr + 1)); + } + +out: + return rc; } -static int llog_cancel_parse_optional(int argc, char **argv, - struct obd_ioctl_data *data) +static int llog_parse_catalog_start_end(int *argc, char **argv[], + char **catalog, long *start, long *end) { - int cOpt; - const char *const short_options = "c:l:i:h"; - const struct option long_options[] = { - {"catalog", required_argument, NULL, 'c'}, - {"log_id", required_argument, NULL, 'l'}, - {"log_idx", required_argument, NULL, 'i'}, - {"help", no_argument, NULL, 'h'}, - {NULL, 0, NULL, 0} - }; + const struct option long_opts[] = { + /* the --catalog option is not required, just for consistency */ + { .val = 'c', .name = "catalog", .has_arg = required_argument }, + { .val = 'e', .name = "end", .has_arg = required_argument }, + { .val = 'h', .name = "help", .has_arg = no_argument }, + { .val = 's', .name = "start", .has_arg = required_argument }, + { .name = NULL } }; + char *cmd = (*argv)[0]; + char *endp; + int c; + + if (catalog == NULL || start == NULL || end == NULL) + return -EINVAL; + + /* now process command line arguments*/ + while ((c = getopt_long(*argc, *argv, "c:e:hs:", + long_opts, NULL)) != -1) { + switch (c) { + case 'c': + *catalog = optarg; + break; + case 'e': + *end = strtol(optarg, &endp, 0); + if (*endp != '\0') { + fprintf(stderr, "%s: bad end value '%s'\n", + cmd, optarg); + return CMD_HELP; + } + break; + case 's': + *start = strtol(optarg, &endp, 0); + if (*endp != '\0') { + fprintf(stderr, "%s: bad start value '%s'\n", + cmd, optarg); + return CMD_HELP; + } + break; + case 'h': + default: + return CMD_HELP; + } + } + *argc -= optind; + *argv += optind; + + /* support old optional positional parameters only if they were + * not already specified with named arguments: logname [start [end]] + */ + if (*argc >= 1) { + if (*catalog) { + fprintf(stderr, + "%s: catalog is set, unknown argument '%s'\n", + cmd, (*argv)[0]); + return CMD_HELP; + } + *catalog = (*argv)[0]; + (*argc)--; + (*argv)++; + } + + if (*argc >= 1) { + if (*start != 1) { + fprintf(stderr, + "%s: --start is set, unknown argument '%s'\n", + cmd, (*argv)[0]); + return CMD_HELP; + } + + *start = strtol((*argv)[0], &endp, 0); + if (*endp != '\0') { + fprintf(stderr, "%s: bad start value '%s'\n", + cmd, (*argv)[0]); + return CMD_HELP; + } + (*argc)--; + (*argv)++; + } + if (*argc >= 1) { + if (*end != -1) { + fprintf(stderr, + "%s: --end is set, unknown argument '%s'\n", + cmd, (*argv)[0]); + return CMD_HELP; + } + + *end = strtol((*argv)[0], &endp, 0); + if (*endp != '\0') { + fprintf(stderr, "%s: bad end value '%s'\n", + cmd, (*argv)[0]); + return CMD_HELP; + } + (*argc)--; + (*argv)++; + } + if (*argc > 1) { + fprintf(stderr, "%s: unknown argument '%s'\n", cmd, (*argv)[0]); + return CMD_HELP; + } + + if (*end != -1 && *end < *start) { + fprintf(stderr, "%s: end '%lu' less than than start '%lu'\n", + cmd, *end, *start); + return CMD_HELP; + } + + return 0; +} + +int jt_llog_print(int argc, char **argv) +{ + char *catalog = NULL; + long start = 1, end = -1; + int rc; + + rc = llog_parse_catalog_start_end(&argc, &argv, &catalog, &start, &end); + if (rc) + return rc; + + rc = jt_llog_print_iter(catalog, start, end, jt_llog_print_cb, NULL); + + return rc; +} + +/* Parse catalog, log ID, and optionally a log index with either optional + * arguments or positional arguments. Only the initial catalog argument + * may be positional with other optional arguments. + * + * The positional arguments option should eventually be phased out. + */ +static int llog_parse_catalog_log_idx(int *argc, char ***argv, const char *opts, + int max_args, struct obd_ioctl_data *data) +{ + const struct option long_opts[] = { + /* the --catalog option is not required, just for consistency */ + { .val = 'c', .name = "catalog", .has_arg = required_argument }, + { .val = 'h', .name = "help", .has_arg = no_argument }, + { .val = 'i', .name = "log_idx", .has_arg = required_argument }, + { .val = 'l', .name = "log_id", .has_arg = required_argument }, + { .name = NULL } }; + int c; /* sanity check */ - if (!data || argc <= 1) { + if (!data || *argc <= 1) return -1; - } - /*now process command line arguments*/ - while ((cOpt = getopt_long(argc, argv, short_options, - long_options, NULL)) != -1) { - switch (cOpt) { + data->ioc_dev = cur_device; + + /* now process command line arguments*/ + while ((c = getopt_long(*argc, *argv, opts, long_opts, NULL)) != -1) { + switch (c) { case 'c': data->ioc_inllen1 = strlen(optarg) + 1; data->ioc_inlbuf1 = optarg; break; - - case 'l': - data->ioc_inllen2 = strlen(optarg) + 1; - data->ioc_inlbuf2 = optarg; - break; - case 'i': data->ioc_inllen3 = strlen(optarg) + 1; data->ioc_inlbuf3 = optarg; break; - + case 'l': /* The log_id option isn't currently needed for + * cancel as mdt_iocontrol() handles IOC_LLOG_CANCEL, + * but we may as well keep it for now. + */ + data->ioc_inllen2 = strlen(optarg) + 1; + data->ioc_inlbuf2 = optarg; + break; case 'h': default: - return -1; + return CMD_HELP; } } - if ((data->ioc_inlbuf1 == NULL) || (data->ioc_inlbuf3 == NULL)) { - /* missing mandatory parameters */ - return -1; + *argc -= optind; + *argv += optind; + + /* Allow catalog to be specified as first option without --catalog */ + if (data->ioc_inlbuf1 == NULL && *argc > 0) { + data->ioc_inlbuf1 = (*argv)[0]; + data->ioc_inllen1 = strlen((*argv)[0]) + 1; + (*argc)--; + (*argv)++; } return 0; @@ -2702,60 +2982,44 @@ static int llog_cancel_parse_optional(int argc, char **argv, int jt_llog_cancel(int argc, char **argv) { - struct obd_ioctl_data data; - char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf; - int rc, i; + struct obd_ioctl_data data = { 0 }; + char rawbuf[MAX_IOC_BUFLEN] = "", *buf = rawbuf; + char *cmd = argv[0]; + int rc; - /* check that the arguments provided are either all - * optional or all positional. No mixing allowed - * - * if argc is 4 or 3 then check all arguments to ensure that none - * of them start with a '-'. If so then this is invalid. - * Otherwise if arg is > 4 then assume that this is optional - * arguments, and parse as such ignoring any thing that's not - * optional. The result is that user must use optional arguments - * for all mandatory parameters. Code will ignore all other args - * - * The positional arguments option should eventually be phased out. - */ - memset(&data, 0, sizeof(data)); - data.ioc_dev = cur_device; + /* Parse catalog file (in inlbuf1) and named parameters */ + rc = llog_parse_catalog_log_idx(&argc, &argv, "c:hi:l:", 3, &data); - if (argc == 3 || argc == 4) { - for (i = 1; i < argc; i++) { - if (argv[i][0] == '-') - return CMD_HELP; - } - data.ioc_inllen1 = strlen(argv[1]) + 1; - data.ioc_inlbuf1 = argv[1]; - if (argc == 4) { - data.ioc_inllen2 = strlen(argv[2]) + 1; - data.ioc_inlbuf2 = argv[2]; - data.ioc_inllen3 = strlen(argv[3]) + 1; - data.ioc_inlbuf3 = argv[3]; - } else { - data.ioc_inllen3 = strlen(argv[2]) + 1; - data.ioc_inlbuf3 = argv[2]; - } - } else { - if (llog_cancel_parse_optional(argc, argv, &data) != 0) - return CMD_HELP; + /* Handle old positional parameters if not using named parameters, + * either " " or " ". + * It was "inlbuf3 = log_idx", and "inlbuf2 = log_id" (ignored by + * config log cancel), and shows why I hate positional parameters. + */ + if (argc == 1) { + data.ioc_inllen3 = strlen(argv[0]) + 1; + data.ioc_inlbuf3 = argv[0]; + } else if (argc == 2) { + data.ioc_inllen2 = strlen(argv[0]) + 1; + data.ioc_inlbuf2 = argv[0]; + data.ioc_inllen3 = strlen(argv[1]) + 1; + data.ioc_inlbuf3 = argv[1]; } - memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + if (data.ioc_inlbuf1 == NULL || data.ioc_inlbuf3 == NULL) + /* missing mandatory parameters */ + return CMD_HELP; + + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); if (rc) { - fprintf(stderr, "error: %s: invalid ioctl\n", - jt_cmdname(argv[0])); + fprintf(stderr, "%s: ioctl_pack for catalog '%s' failed: %s\n", + jt_cmdname(cmd), data.ioc_inlbuf1, strerror(-rc)); return rc; } rc = l_ioctl(OBD_DEV_ID, OBD_IOC_LLOG_CANCEL, buf); - if (rc == 0) - fprintf(stdout, "index %s was canceled.\n", - argc == 4 ? argv[3] : argv[2]); - else - fprintf(stderr, "OBD_IOC_LLOG_CANCEL failed: %s\n", + if (rc) + fprintf(stderr, "%s: cancel catalog '%s:%s' failed: %s\n", + jt_cmdname(cmd), data.ioc_inlbuf1, data.ioc_inlbuf3, strerror(errno)); return rc; @@ -2763,87 +3027,89 @@ int jt_llog_cancel(int argc, char **argv) int jt_llog_check(int argc, char **argv) { - struct obd_ioctl_data data; - char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf; - int rc; + struct obd_ioctl_data data = { 0 }; + char rawbuf[MAX_IOC_BUFLEN] = "", *buf = rawbuf; + char *catalog = NULL; + char startbuf[16], endbuf[16]; + long start = 1, end = -1; + char *cmd = argv[0]; + int rc; - if (argc != 2 && argc != 4) - return CMD_HELP; + rc = llog_parse_catalog_start_end(&argc, &argv, &catalog, &start, &end); + if (rc) + return rc; - memset(&data, 0, sizeof(data)); - data.ioc_dev = cur_device; - data.ioc_inllen1 = strlen(argv[1]) + 1; - data.ioc_inlbuf1 = argv[1]; - if (argc == 4) { - data.ioc_inllen2 = strlen(argv[2]) + 1; - data.ioc_inlbuf2 = argv[2]; - data.ioc_inllen3 = strlen(argv[3]) + 1; - data.ioc_inlbuf3 = argv[3]; - } else { - char from[2] = "1", to[3] = "-1"; - data.ioc_inllen2 = strlen(from) + 1; - data.ioc_inlbuf2 = from; - 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); - memset(buf, 0, sizeof(rawbuf)); - rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); - if (rc) { - fprintf(stderr, "error: %s: invalid ioctl\n", - jt_cmdname(argv[0])); - return rc; - } + if (end == -1) + end = 0x7fffffff; - rc = l_ioctl(OBD_DEV_ID, OBD_IOC_LLOG_CHECK, buf); - if (rc == 0) - fprintf(stdout, "%s", ((struct obd_ioctl_data*)buf)->ioc_bulk); - else - fprintf(stderr, "OBD_IOC_LLOG_CHECK failed: %s\n", - strerror(errno)); - return rc; -} + data.ioc_dev = cur_device; + data.ioc_inllen1 = strlen(catalog) + 1; + data.ioc_inlbuf1 = catalog; + + snprintf(startbuf, sizeof(startbuf), "%lu", start); + snprintf(endbuf, sizeof(endbuf), "%lu", end); + /* start and end record numbers are passed as ASCII digits */ + data.ioc_inllen2 = strlen(startbuf) + 1; + data.ioc_inlbuf2 = startbuf; + data.ioc_inllen3 = strlen(endbuf) + 1; + data.ioc_inlbuf3 = endbuf; + + 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); + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); + if (rc) { + fprintf(stderr, "%s: ioctl_pack failed for catalog '%s': %s\n", + jt_cmdname(cmd), data.ioc_inlbuf1, strerror(-rc)); + return rc; + } + + rc = l_ioctl(OBD_DEV_ID, OBD_IOC_LLOG_CHECK, buf); + if (rc == 0) + fprintf(stdout, "%s", ((struct obd_ioctl_data *)buf)->ioc_bulk); + else + fprintf(stderr, "%s: OBD_IOC_LLOG_CHECK failed: %s\n", + jt_cmdname(cmd), strerror(errno)); + return rc; +} int jt_llog_remove(int argc, char **argv) { - struct obd_ioctl_data data; - char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf; - int rc; + struct obd_ioctl_data data = { 0 }; + char rawbuf[MAX_IOC_BUFLEN] = "", *buf = rawbuf; + char *cmd = argv[0]; + int rc; - if (argc != 3 && argc != 2) - return CMD_HELP; + rc = llog_parse_catalog_log_idx(&argc, &argv, "c:hl:", 2, &data); + if (rc) + return rc; - memset(&data, 0, sizeof(data)); - data.ioc_dev = cur_device; - data.ioc_inllen1 = strlen(argv[1]) + 1; - data.ioc_inlbuf1 = argv[1]; - if (argc == 3){ - 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)); - if (rc) { - fprintf(stderr, "error: %s: invalid ioctl\n", - jt_cmdname(argv[0])); - return rc; - } + if (argc == 1) { + if (data.ioc_inlbuf2) { + fprintf(stderr, + "%s: --log_id is set, unknown argument '%s'\n", + jt_cmdname(cmd), argv[0]); + return CMD_HELP; + } - rc = l_ioctl(OBD_DEV_ID, OBD_IOC_LLOG_REMOVE, buf); - if (rc == 0) { - if (argc == 2) - fprintf(stdout, "log %s is removed.\n", argv[1]); - else - fprintf(stdout, "the log in catalog %s is removed. \n", - argv[1]); - } else - fprintf(stderr, "OBD_IOC_LLOG_REMOVE failed: %s\n", - strerror(errno)); + data.ioc_inllen2 = strlen(argv[0]) + 1; + data.ioc_inlbuf2 = argv[0]; + } + rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); + if (rc) { + fprintf(stderr, "%s: ioctl_pack for catalog '%s' failed: %s\n", + jt_cmdname(cmd), data.ioc_inlbuf1, strerror(-rc)); + return rc; + } - return rc; + rc = l_ioctl(OBD_DEV_ID, OBD_IOC_LLOG_REMOVE, buf); + if (rc) + fprintf(stderr, "%s: cancel catalog '%s:%s' failed: %s\n", + jt_cmdname(cmd), data.ioc_inlbuf1, data.ioc_inlbuf2, + strerror(-rc)); + + return rc; } static void signal_server(int sig) @@ -2860,8 +3126,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; } @@ -3117,9 +3382,11 @@ static int pool_cmd(enum lcfg_command_type cmd, if (ostname != NULL) lustre_cfg_bufs_set_string(&bufs, 2, ostname); - lcfg = lustre_cfg_new(cmd, &bufs); + + lcfg = malloc(lustre_cfg_len(bufs.lcfg_bufcount, bufs.lcfg_buflen)); if (lcfg == NULL) return -ENOMEM; + lustre_cfg_init(lcfg, cmd, &bufs); memset(&data, 0, sizeof(data)); rc = data.ioc_dev = get_mgs_device(); @@ -3132,19 +3399,35 @@ 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)); - lustre_cfg_free(lcfg); + free(lcfg); return rc; } rc = l_ioctl(OBD_DEV_ID, OBD_IOC_POOL, buf); out: if (rc) rc = -errno; - lustre_cfg_free(lcfg); - return rc; + 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; } /** @@ -3183,9 +3466,10 @@ static int nodemap_cmd(enum lcfg_command_type cmd, void *ret_data, } va_end(ap); - lcfg = lustre_cfg_new(cmd, &bufs); + lcfg = malloc(lustre_cfg_len(bufs.lcfg_bufcount, bufs.lcfg_buflen)); if (lcfg == NULL) return -ENOMEM; + lustre_cfg_init(lcfg, cmd, &bufs); memset(&data, 0, sizeof(data)); rc = data.ioc_dev = get_mgs_device(); @@ -3198,7 +3482,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); @@ -3213,7 +3497,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; @@ -3223,7 +3507,7 @@ static int nodemap_cmd(enum lcfg_command_type cmd, void *ret_data, memcpy(ret_data, data.ioc_pbuf1, ret_size); } out: - lustre_cfg_free(lcfg); + free(lcfg); return rc; } @@ -3358,32 +3642,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; @@ -3412,6 +3679,51 @@ int jt_nodemap_test_id(int argc, char **argv) } /** + * parse nid range + * + * \param nodemap_range --range string + * \param nid_range nid range string, min_nid:max_nid + * + * \retval 0 on success + */ +static int parse_nid_range(char *nodemap_range, char *nid_range, int range_len) +{ + char min_nid[LNET_NIDSTR_SIZE + 1]; + char max_nid[LNET_NIDSTR_SIZE + 1]; + struct list_head nidlist; + int rc = 0; + + INIT_LIST_HEAD(&nidlist); + + if (cfs_parse_nidlist(nodemap_range, strlen(nodemap_range), + &nidlist) <= 0) { + fprintf(stderr, + "error: nodemap_xxx_range: can't parse nid range: %s\n", + nodemap_range); + return -1; + } + + rc = cfs_nidrange_find_min_max(&nidlist, &min_nid[0], &max_nid[0], + LNET_NIDSTR_SIZE); + if (rc < 0) { + if (rc == -EINVAL) + fprintf(stderr, + "error: nodemap_xxx_range: nid range uses " + "currently unsupported features\n"); + else if (rc == -ERANGE) + fprintf(stderr, + "error: nodemap_xxx_range: nodemap ranges must " + "be contiguous\n"); + + return rc; + } + + snprintf(nid_range, range_len, "%s:%s", min_nid, max_nid); + + return rc; +} + +/** * add an nid range to a nodemap * * \param argc number of args @@ -3426,35 +3738,17 @@ int jt_nodemap_add_range(int argc, char **argv) { char *nodemap_name = NULL; char *nodemap_range = NULL; - struct list_head nidlist; - char min_nid[LNET_NIDSTR_SIZE + 1]; - char max_nid[LNET_NIDSTR_SIZE + 1]; char nid_range[2 * LNET_NIDSTR_SIZE + 2]; 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 - } - }; - - INIT_LIST_HEAD(&nidlist); + static struct option long_opts[] = { + { .val = 'n', .name = "name", .has_arg = required_argument }, + { .val = 'r', .name = "range", .has_arg = required_argument }, + { .name = NULL } }; while ((c = getopt_long(argc, argv, "n:r:", - long_options, NULL)) != -1) { + long_opts, NULL)) != -1) { switch (c) { case 'n': nodemap_name = optarg; @@ -3471,23 +3765,11 @@ int jt_nodemap_add_range(int argc, char **argv) return -1; } - if (cfs_parse_nidlist(nodemap_range, strlen(nodemap_range), - &nidlist) <= 0) { - fprintf(stderr, "error: %s: can't parse nid range: %s\n", - jt_cmdname(argv[0]), nodemap_range); - 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 = parse_nid_range(nodemap_range, nid_range, sizeof(nid_range)); + if (rc) { + errno = -rc; + 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], nodemap_name, nid_range, NULL); if (rc != 0) { @@ -3515,35 +3797,17 @@ int jt_nodemap_del_range(int argc, char **argv) { char *nodemap_name = NULL; char *nodemap_range = NULL; - struct list_head nidlist; - char min_nid[LNET_NIDSTR_SIZE + 1]; - char max_nid[LNET_NIDSTR_SIZE + 1]; char nid_range[2 * LNET_NIDSTR_SIZE + 2]; 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 - } - }; - - INIT_LIST_HEAD(&nidlist); + static struct option long_opts[] = { + { .val = 'n', .name = "name", .has_arg = required_argument }, + { .val = 'r', .name = "range", .has_arg = required_argument }, + { .name = NULL } }; while ((c = getopt_long(argc, argv, "n:r:", - long_options, NULL)) != -1) { + long_opts, NULL)) != -1) { switch (c) { case 'n': nodemap_name = optarg; @@ -3560,23 +3824,11 @@ int jt_nodemap_del_range(int argc, char **argv) return -1; } - if (cfs_parse_nidlist(nodemap_range, strlen(nodemap_range), - &nidlist) <= 0) { - fprintf(stderr, "error: %s: can't parse nid range: %s\n", - jt_cmdname(argv[0]), nodemap_range); - 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 = parse_nid_range(nodemap_range, nid_range, sizeof(nid_range)); + if (rc) { + errno = -rc; + 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], nodemap_name, nid_range, NULL); if (rc != 0) { @@ -3607,49 +3859,100 @@ int jt_nodemap_set_fileset(int argc, char **argv) int rc = 0; int c; + static struct option long_opts[] = { + { .val = 'f', .name = "fileset", .has_arg = required_argument }, + { .val = 'n', .name = "name", .has_arg = required_argument }, + { .name = NULL } }; + + while ((c = getopt_long(argc, argv, "n:f:", + long_opts, NULL)) != -1) { + switch (c) { + case 'n': + nodemap_name = optarg; + break; + case 'f': + fileset_name = optarg; + break; + } + } + + if (nodemap_name == NULL || fileset_name == NULL) { + fprintf(stderr, "usage: nodemap_set_fileset --name " + "--fileset \n"); + return -1; + } + + rc = nodemap_cmd(LCFG_NODEMAP_SET_FILESET, NULL, 0, argv[0], + nodemap_name, fileset_name, NULL); + if (rc != 0) { + errno = -rc; + fprintf(stderr, "error: %s: cannot set fileset '%s' on nodemap " + "'%s': rc = %d\n", + jt_cmdname(argv[0]), fileset_name, nodemap_name, rc); + } + + return rc; +} + +/** + * set SELinux policy info on a nodemap + * + * \param argc number of args + * \param argv[] variable string arguments + * + * --name nodemap name + * --sepol SELinux policy info + * + * \retval 0 on success + */ +int jt_nodemap_set_sepol(int argc, char **argv) +{ + char *nodemap_name = NULL; + char *sepol = NULL; + int rc = 0; + int c; + static struct option long_options[] = { { .name = "name", .has_arg = required_argument, - .flag = 0, .val = 'n', }, { - .name = "fileset", + .name = "sepol", .has_arg = required_argument, - .flag = 0, - .val = 'f', + .val = 's', }, { - NULL + .name = NULL, } }; - while ((c = getopt_long(argc, argv, "n:f:", + while ((c = getopt_long(argc, argv, "n:s:", long_options, NULL)) != -1) { switch (c) { case 'n': nodemap_name = optarg; break; - case 'f': - fileset_name = optarg; + case 's': + sepol = optarg; break; } } - if (nodemap_name == NULL || fileset_name == NULL) { - fprintf(stderr, "usage: nodemap_set_fileset --name " - "--fileset \n"); + if (nodemap_name == NULL || sepol == NULL) { + fprintf(stderr, "usage: nodemap_set_sepol --name " + "--sepol \n"); return -1; } - rc = nodemap_cmd(LCFG_NODEMAP_SET_FILESET, NULL, 0, argv[0], - nodemap_name, fileset_name, NULL); + rc = nodemap_cmd(LCFG_NODEMAP_SET_SEPOL, NULL, 0, argv[0], + nodemap_name, sepol, NULL); if (rc != 0) { errno = -rc; - fprintf(stderr, "error: %s: cannot set fileset '%s' on nodemap " + fprintf(stderr, "error: %s: cannot set sepol '%s' on nodemap " "'%s': rc = %d\n", - jt_cmdname(argv[0]), fileset_name, nodemap_name, rc); + jt_cmdname(argv[0]), sepol, nodemap_name, rc); } return rc; @@ -3677,32 +3980,14 @@ int jt_nodemap_modify(int argc, char **argv) char *param = NULL; char *value = NULL; - static struct option long_options[] = { - { - .name = "name", - .has_arg = required_argument, - .flag = 0, - .val = 'n', - }, - { - .name = "property", - .has_arg = required_argument, - .flag = 0, - .val = 'p', - }, - { - .name = "value", - .has_arg = required_argument, - .flag = 0, - .val = 'v', - }, - { - NULL - } - }; + static struct option long_opts[] = { + { .val = 'n', .name = "name", .has_arg = required_argument }, + { .val = 'p', .name = "property", .has_arg = required_argument }, + { .val = 'v', .name = "value", .has_arg = required_argument }, + { .name = NULL } }; while ((c = getopt_long(argc, argv, "n:p:v:", - long_options, NULL)) != -1) { + long_opts, NULL)) != -1) { switch (c) { case 'n': nodemap_name = optarg; @@ -3720,7 +4005,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; } @@ -3736,6 +4021,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", @@ -3764,32 +4051,14 @@ int jt_nodemap_add_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; @@ -3838,32 +4107,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; @@ -3994,7 +4245,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); @@ -4011,39 +4262,19 @@ static int extract_fsname_poolname(const char *arg, char *fsname, *ptr = '\0'; ++ptr; - rc = lustre_is_fsname_valid(fsname, 1, LUSTRE_MAXFSNAME); - if (rc < 0) { - fprintf(stderr, "filesystem name %s must be 1-%d chars\n", - fsname, LUSTRE_MAXFSNAME); - rc = -EINVAL; - goto err; - } else if (rc > 0) { - fprintf(stderr, "char '%c' not allowed in filesystem name\n", - rc); - rc = -EINVAL; - goto err; - } - - rc = lustre_is_poolname_valid(ptr, 1, LOV_MAXPOOLNAME); - if (rc == -1) { + if (strlen(ptr) == 0) { fprintf(stderr, "poolname is empty\n"); rc = -EINVAL; goto err; - } else if (rc == -2) { - fprintf(stderr, - "poolname %s is too long (max is %d)\n", - ptr, LOV_MAXPOOLNAME); - rc = -ENAMETOOLONG; - goto err; - } else if (rc > 0) { - fprintf(stderr, "char '%c' not allowed in pool name '%s'\n", - rc, ptr); - rc = -EINVAL; - goto err; } 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: @@ -4186,6 +4417,7 @@ out: return rc; } +#ifdef HAVE_SERVER_SUPPORT static const char *barrier_status2name(enum barrier_status status) { switch (status) { @@ -4245,7 +4477,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; @@ -4288,7 +4520,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; @@ -4302,7 +4534,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; @@ -4316,11 +4548,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; @@ -4329,9 +4561,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; } @@ -4339,26 +4571,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; @@ -4397,7 +4671,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; @@ -4408,13 +4682,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) { @@ -4464,7 +4739,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)); @@ -4478,7 +4753,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; } @@ -4512,7 +4787,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)); @@ -4527,7 +4802,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"); @@ -4566,7 +4841,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])); @@ -4580,7 +4855,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);