X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Futils%2Fobd.c;h=4c0c14ecf9884d8cfd33a853876fefd2069d34a3;hp=663b5ec7daf63e36b4b157b3e83d59bc24c27ca3;hb=9c5fad36aac2086b38f91e28db90da01efc9126a;hpb=51828ff66904be2a56a8790c3c9ce562a7c8e2e6 diff --git a/lustre/utils/obd.c b/lustre/utils/obd.c index 663b5ec..4c0c14e 100644 --- a/lustre/utils/obd.c +++ b/lustre/utils/obd.c @@ -60,6 +60,7 @@ #include #include "obdctl.h" +#include "lustreapi_internal.h" #include #include #include @@ -67,14 +68,15 @@ #include #include -#include -#include -#include +#include +#include +#include #include #include #include -#include +#include +#include #define MAX_STRING_SIZE 128 @@ -1148,18 +1150,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) { @@ -1364,7 +1369,7 @@ int jt_obd_md_common(int argc, char **argv, int cmd) fprintf(stderr, "Allocate fids error %d.\n",rc); return rc; } - fid_to_ostid(&fid, &data.ioc_obdo1.o_oi); + data.ioc_obdo1.o_oi.oi_fid = fid; } child_base_id += data.ioc_count; @@ -1492,13 +1497,19 @@ int jt_obd_create(int argc, char **argv) ostid_set_seq_echo(&data.ioc_obdo1.o_oi); for (i = 1, next_count = verbose; i <= count && shmem_running(); i++) { + /* + * base_id is 1 so we don't need to worry about it being + * greater than OBIF_MAX_OID + */ + data.ioc_obdo1.o_oi.oi_fid.f_oid = base_id; data.ioc_obdo1.o_mode = mode; - ostid_set_id(&data.ioc_obdo1.o_oi, base_id); data.ioc_obdo1.o_uid = 0; data.ioc_obdo1.o_gid = 0; + data.ioc_obdo1.o_projid = 0; data.ioc_obdo1.o_valid = OBD_MD_FLTYPE | OBD_MD_FLMODE | OBD_MD_FLID | OBD_MD_FLUID | - OBD_MD_FLGID | OBD_MD_FLGROUP; + OBD_MD_FLGID | OBD_MD_FLGROUP | + OBD_MD_FLPROJID; memset(buf, 0, sizeof(rawbuf)); rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); @@ -1533,30 +1544,42 @@ int jt_obd_create(int argc, char **argv) int jt_obd_setattr(int argc, char **argv) { - struct obd_ioctl_data data; - char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf; - char *end; - int rc; + struct obd_ioctl_data data; + char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf; + __u64 objid; + char *end; + int mode; + int rc; memset(&data, 0, sizeof(data)); data.ioc_dev = cur_device; if (argc != 2) return CMD_HELP; - ostid_set_seq_echo(&data.ioc_obdo1.o_oi); - ostid_set_id(&data.ioc_obdo1.o_oi, strtoull(argv[1], &end, 0)); - if (*end) { + objid = strtoull(argv[1], &end, 0); + if (*end) { + fprintf(stderr, "error: %s: objid '%s' is not a number\n", + jt_cmdname(argv[0]), argv[1]); + return CMD_HELP; + } + + if (objid >= OBIF_MAX_OID) { fprintf(stderr, "error: %s: invalid objid '%s'\n", jt_cmdname(argv[0]), argv[1]); return CMD_HELP; } - data.ioc_obdo1.o_mode = S_IFREG | strtoul(argv[2], &end, 0); + + mode = strtoul(argv[2], &end, 0); if (*end) { fprintf(stderr, "error: %s: invalid mode '%s'\n", jt_cmdname(argv[0]), argv[2]); return CMD_HELP; } - data.ioc_obdo1.o_valid = OBD_MD_FLID | OBD_MD_FLTYPE | OBD_MD_FLMODE; + + ostid_set_seq_echo(&data.ioc_obdo1.o_oi); + data.ioc_obdo1.o_mode = S_IFREG | mode; + data.ioc_obdo1.o_oi.oi_fid.f_oid = objid; + 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)); @@ -1626,7 +1649,13 @@ int jt_obd_test_setattr(int argc, char **argv) ostid_set_seq_echo(&data.ioc_obdo1.o_oi); for (i = 1, next_count = verbose; i <= count && shmem_running(); i++) { - ostid_set_id(&data.ioc_obdo1.o_oi, objid); + if (objid >= OBIF_MAX_OID) { + fprintf(stderr, "errr: %s: invalid objid '%llu'\n", + jt_cmdname(argv[0]), objid); + return -E2BIG; + } + + data.ioc_obdo1.o_oi.oi_fid.f_oid = objid; 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)); @@ -1712,7 +1741,13 @@ int jt_obd_destroy(int argc, char **argv) ostid_set_seq_echo(&data.ioc_obdo1.o_oi); for (i = 1, next_count = verbose; i <= count && shmem_running(); i++, id++) { - ostid_set_id(&data.ioc_obdo1.o_oi, id); + if (id >= OBIF_MAX_OID) { + fprintf(stderr, "errr: %s: invalid objid '%llu'\n", + jt_cmdname(argv[0]), id); + return -E2BIG; + } + + data.ioc_obdo1.o_oi.oi_fid.f_oid = id; data.ioc_obdo1.o_mode = S_IFREG | 0644; data.ioc_obdo1.o_valid = OBD_MD_FLID | OBD_MD_FLMODE; @@ -1745,21 +1780,30 @@ int jt_obd_getattr(int argc, char **argv) { struct obd_ioctl_data data; char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf; + __u64 objid; char *end; int rc; if (argc != 2) return CMD_HELP; - memset(&data, 0, sizeof(data)); - data.ioc_dev = cur_device; - ostid_set_seq_echo(&data.ioc_obdo1.o_oi); - ostid_set_id(&data.ioc_obdo1.o_oi, strtoull(argv[1], &end, 0)); + objid = strtoull(argv[1], &end, 0); if (*end) { + fprintf(stderr, "error: %s: objid '%s' is not a number\n", + jt_cmdname(argv[0]), argv[1]); + return CMD_HELP; + } + + if (objid >= OBIF_MAX_OID) { fprintf(stderr, "error: %s: invalid objid '%s'\n", jt_cmdname(argv[0]), argv[1]); return CMD_HELP; } + + memset(&data, 0, sizeof(data)); + data.ioc_dev = cur_device; + ostid_set_seq_echo(&data.ioc_obdo1.o_oi); + data.ioc_obdo1.o_oi.oi_fid.f_oid = objid; /* to help obd filter */ data.ioc_obdo1.o_mode = 0100644; data.ioc_obdo1.o_valid = 0xffffffff; @@ -1839,7 +1883,13 @@ int jt_obd_test_getattr(int argc, char **argv) ostid_set_seq_echo(&data.ioc_obdo1.o_oi); for (i = 1, next_count = verbose; i <= count && shmem_running(); i++) { - ostid_set_id(&data.ioc_obdo1.o_oi, objid); + if (objid >= OBIF_MAX_OID) { + fprintf(stderr, "errr: %s: invalid objid '%llu'\n", + jt_cmdname(argv[0]), objid); + return -E2BIG; + } + + data.ioc_obdo1.o_oi.oi_fid.f_oid = objid; data.ioc_obdo1.o_mode = S_IFREG; data.ioc_obdo1.o_valid = 0xffffffff; memset(buf, 0, sizeof(rawbuf)); @@ -2046,7 +2096,13 @@ int jt_obd_test_brw(int argc, char **argv) #endif ostid_set_seq_echo(&data.ioc_obdo1.o_oi); - ostid_set_id(&data.ioc_obdo1.o_oi, objid); + if (objid >= OBIF_MAX_OID) { + fprintf(stderr, "errr: %s: invalid objid '%llu'\n", + jt_cmdname(argv[0]), objid); + return -E2BIG; + } + + data.ioc_obdo1.o_oi.oi_fid.f_oid = objid; data.ioc_obdo1.o_mode = S_IFREG; data.ioc_obdo1.o_valid = OBD_MD_FLID | OBD_MD_FLTYPE | OBD_MD_FLMODE | OBD_MD_FLFLAGS | OBD_MD_FLGROUP; @@ -2420,6 +2476,73 @@ int jt_obd_mdc_lookup(int argc, char **argv) return rc; } +int jt_lcfg_fork(int argc, char **argv) +{ + struct obd_ioctl_data data; + char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf; + int rc; + + if (argc != 3) + return CMD_HELP; + + memset(&data, 0, sizeof(data)); + data.ioc_dev = get_mgs_device(); + data.ioc_inllen1 = strlen(argv[1]) + 1; + data.ioc_inlbuf1 = argv[1]; + 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; + } + + rc = l_ioctl(OBD_DEV_ID, OBD_IOC_LCFG_FORK, buf); + if (rc < 0) + fprintf(stderr, "error: %s: OBD_IOC_LCFG_FORK failed: %s\n", + jt_cmdname(argv[0]), strerror(errno)); + + return rc; +} + +int jt_lcfg_erase(int argc, char **argv) +{ + struct obd_ioctl_data data; + char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf; + int rc; + + if (argc == 3) { + if (strncmp(argv[2], "-q", strlen("-q")) != 0 && + strncmp(argv[2], "--quiet", strlen("--quiet")) != 0) + return CMD_HELP; + } else if (argc != 2) { + return CMD_HELP; + } + + memset(&data, 0, sizeof(data)); + data.ioc_dev = get_mgs_device(); + data.ioc_inllen1 = strlen(argv[1]) + 1; + data.ioc_inlbuf1 = argv[1]; + + 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; + } + + rc = l_ioctl(OBD_DEV_ID, OBD_IOC_LCFG_ERASE, buf); + if (rc < 0) + fprintf(stderr, "error: %s: OBD_IOC_LCFG_ERASE failed: %s\n", + jt_cmdname(argv[0]), strerror(errno)); + + return rc; +} + int jt_llog_catlist(int argc, char **argv) { struct obd_ioctl_data data; @@ -2533,14 +2656,13 @@ static int llog_cancel_parse_optional(int argc, char **argv, struct obd_ioctl_data *data) { 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 char *const short_opts = "c:l:i:h"; + const struct option long_opts[] = { + { .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 } }; /* sanity check */ if (!data || argc <= 1) { @@ -2548,8 +2670,8 @@ static int llog_cancel_parse_optional(int argc, char **argv, } /*now process command line arguments*/ - while ((cOpt = getopt_long(argc, argv, short_options, - long_options, NULL)) != -1) { + while ((cOpt = getopt_long(argc, argv, short_opts, + long_opts, NULL)) != -1) { switch (cOpt) { case 'c': data->ioc_inllen1 = strlen(optarg) + 1; @@ -2776,7 +2898,9 @@ static int check_pool_cmd(enum lcfg_command_type cmd, switch (cmd) { case LCFG_POOL_NEW: { - LASSERT(ostname == NULL); + if (ostname != NULL) + return -EINVAL; + if (rc >= 0) { fprintf(stderr, "Pool %s.%s already exists\n", fsname, poolname); @@ -2785,7 +2909,9 @@ static int check_pool_cmd(enum lcfg_command_type cmd, return 0; } case LCFG_POOL_DEL: { - LASSERT(ostname == NULL); + if (ostname != NULL) + return -EINVAL; + if (rc == 1) { fprintf(stderr, "Pool %s.%s not empty, " "please remove all members\n", @@ -2993,9 +3119,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(); @@ -3012,14 +3140,14 @@ static int pool_cmd(enum lcfg_command_type cmd, 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); + free(lcfg); return rc; } @@ -3059,9 +3187,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(); @@ -3099,7 +3228,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; } @@ -3309,28 +3438,15 @@ int jt_nodemap_add_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; @@ -3483,26 +3599,13 @@ int jt_nodemap_set_fileset(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 = "fileset", - .has_arg = required_argument, - .flag = 0, - .val = 'f', - }, - { - NULL - } - }; + 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_options, NULL)) != -1) { + long_opts, NULL)) != -1) { switch (c) { case 'n': nodemap_name = optarg; @@ -3595,7 +3698,7 @@ int jt_nodemap_modify(int argc, char **argv) if (nodemap_name == NULL || param == NULL || value == NULL) { fprintf(stderr, "usage: nodemap_modify --name " "--property --value \n"); - fprintf(stderr, "valid properties: admin trusted " + fprintf(stderr, "valid properties: admin trusted map_mode " "squash_uid squash_gid deny_unknown\n"); return -1; } @@ -3610,6 +3713,8 @@ int jt_nodemap_modify(int argc, char **argv) cmd = LCFG_NODEMAP_SQUASH_UID; } else if (strcmp("squash_gid", param) == 0) { cmd = LCFG_NODEMAP_SQUASH_GID; + } else if (strcmp("map_mode", param) == 0) { + cmd = LCFG_NODEMAP_MAP_MODE; } else { fprintf(stderr, "error: %s: nodemap_modify invalid " "subcommand: %s\n", @@ -3885,35 +3990,10 @@ 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); @@ -4060,6 +4140,236 @@ out: return rc; } +static const char *barrier_status2name(enum barrier_status status) +{ + switch (status) { + case BS_INIT: + return "init"; + case BS_FREEZING_P1: + return "freezing_p1"; + case BS_FREEZING_P2: + return "freezing_p2"; + case BS_FROZEN: + return "frozen"; + case BS_THAWING: + return "thawing"; + case BS_THAWED: + return "thawed"; + case BS_FAILED: + return "failed"; + case BS_EXPIRED: + return "expired"; + case BS_RESCAN: + return "rescan"; + default: + return "unknown"; + } +} + +int jt_barrier_freeze(int argc, char **argv) +{ + struct obd_ioctl_data data; + char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf; + struct barrier_ctl bc; + int rc; + + if (argc < 2 || argc > 3) + return CMD_HELP; + + memset(&data, 0, sizeof(data)); + rc = data.ioc_dev = get_mgs_device(); + if (rc < 0) + return rc; + + memset(&bc, 0, sizeof(bc)); + bc.bc_version = BARRIER_VERSION_V1; + bc.bc_cmd = BC_FREEZE; + if (argc == 3) + bc.bc_timeout = atoi(argv[2]); + if (bc.bc_timeout == 0) + bc.bc_timeout = BARRIER_TIMEOUT_DEFAULT; + + if (strlen(argv[1]) > 8) { + fprintf(stderr, "%s: fsname name %s is too long. " + "It should not exceed 8.\n", argv[0], argv[1]); + return -EINVAL; + } + + strncpy(bc.bc_name, argv[1], 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)); + if (rc) { + fprintf(stderr, "Fail to pack ioctl data: rc = %d.\n", rc); + return rc; + } + + rc = l_ioctl(OBD_DEV_ID, OBD_IOC_BARRIER, buf); + if (rc < 0) + fprintf(stderr, "Fail to freeze barrier for %s: %s\n", + argv[1], strerror(errno)); + + return rc; +} + +int jt_barrier_thaw(int argc, char **argv) +{ + struct obd_ioctl_data data; + char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf; + struct barrier_ctl bc; + int rc; + + if (argc != 2) + return CMD_HELP; + + memset(&data, 0, sizeof(data)); + rc = data.ioc_dev = get_mgs_device(); + if (rc < 0) + return rc; + + memset(&bc, 0, sizeof(bc)); + bc.bc_version = BARRIER_VERSION_V1; + bc.bc_cmd = BC_THAW; + + if (strlen(argv[1]) > 8) { + fprintf(stderr, "fsname name %s is too long. " + "It should not exceed 8.\n", argv[1]); + return -EINVAL; + } + + strncpy(bc.bc_name, argv[1], 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)); + if (rc) { + fprintf(stderr, "Fail to pack ioctl data: rc = %d.\n", rc); + return rc; + } + + rc = l_ioctl(OBD_DEV_ID, OBD_IOC_BARRIER, buf); + if (rc < 0) + fprintf(stderr, "Fail to thaw barrier for %s: %s\n", + argv[1], strerror(errno)); + + return rc; +} + +int __jt_barrier_stat(int argc, char **argv, struct barrier_ctl *bc) +{ + struct obd_ioctl_data data; + char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf; + int rc; + + memset(&data, 0, sizeof(data)); + rc = data.ioc_dev = get_mgs_device(); + if (rc < 0) + return rc; + + 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)); + data.ioc_inlbuf1 = (char *)bc; + data.ioc_inllen1 = sizeof(*bc); + memset(buf, 0, sizeof(rawbuf)); + rc = obd_ioctl_pack(&data, &buf, sizeof(rawbuf)); + if (rc) { + fprintf(stderr, "Fail to pack ioctl data: rc = %d.\n", rc); + return rc; + } + + 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)); + else + obd_ioctl_unpack(&data, buf, sizeof(rawbuf)); + + return rc; +} + +int jt_barrier_stat(int argc, char **argv) +{ + struct barrier_ctl bc; + int rc; + + if (argc != 2) + return CMD_HELP; + + if (strlen(argv[1]) > 8) { + fprintf(stderr, "fsname name %s is too long. " + "It should not exceed 8.\n", argv[1]); + return -EINVAL; + } + + rc = __jt_barrier_stat(argc, argv, &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); + } + + return rc; +} + +int jt_barrier_rescan(int argc, char **argv) +{ + struct obd_ioctl_data data; + char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf; + struct barrier_ctl bc; + int rc; + + if (argc < 2 || argc > 3) + return CMD_HELP; + + memset(&data, 0, sizeof(data)); + rc = data.ioc_dev = get_mgs_device(); + if (rc < 0) + return rc; + + memset(&bc, 0, sizeof(bc)); + bc.bc_version = BARRIER_VERSION_V1; + bc.bc_cmd = BC_RESCAN; + if (argc == 3) + bc.bc_timeout = atoi(argv[2]); + if (bc.bc_timeout == 0) + bc.bc_timeout = BARRIER_TIMEOUT_DEFAULT; + + if (strlen(argv[1]) > 8) { + fprintf(stderr, "fsname name %s is too long. " + "It should not exceed 8.\n", argv[1]); + return -EINVAL; + } + + strncpy(bc.bc_name, argv[1], 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)); + if (rc) { + fprintf(stderr, "Fail to pack ioctl data: rc = %d.\n", rc); + return rc; + } + + rc = l_ioctl(OBD_DEV_ID, OBD_IOC_BARRIER, buf); + if (rc < 0) { + fprintf(stderr, "Fail to rescan barrier bitmap for %s: %s\n", + argv[1], strerror(errno)); + } else { + obd_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; +} + int jt_get_obj_version(int argc, char **argv) { struct lu_fid fid;