X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Futils%2Flustre_lfsck.c;h=f399a32f874b676724537783b09a6efbdbf55936;hp=3795a172e4f38561f0cb19da94c9d820f4068352;hb=f7815c80d95b20c97317fbd7010013dca009121e;hpb=d10200a80770f0029d1d665af954187b9ad883df diff --git a/lustre/utils/lustre_lfsck.c b/lustre/utils/lustre_lfsck.c index 3795a17..f399a32 100644 --- a/lustre/utils/lustre_lfsck.c +++ b/lustre/utils/lustre_lfsck.c @@ -55,6 +55,8 @@ static struct option long_opt_start[] = { {"create-ostobj", optional_argument, 0, 'c'}, {"create_mdtobj", optional_argument, 0, 'C'}, {"create-mdtobj", optional_argument, 0, 'C'}, + {"delay_create_ostobj", optional_argument, 0, 'd'}, + {"delay-create-ostobj", optional_argument, 0, 'd'}, {"error", required_argument, 0, 'e'}, {"help", no_argument, 0, 'h'}, {"dryrun", optional_argument, 0, 'n'}, @@ -126,6 +128,7 @@ static void usage_start(void) "lfsck_start [-M | --device {MDT,OST}_device]\n" " [-A | --all] [-c | --create_ostobj [on | off]]\n" " [-C | --create_mdtobj [on | off]]\n" + " [-d | --delay_create_ostobj [on | off]]\n" " [-e | --error {continue | abort}] [-h | --help]\n" " [-n | --dryrun [on | off]] [-o | --orphan]\n" " [-r | --reset] [-s | --speed ops_per_sec_limit]\n" @@ -139,6 +142,8 @@ static void usage_start(void) "(default 'off', or 'on')\n" "-C: create the lost MDT-object for dangling name entry " "(default 'off', or 'on')\n" + "-d: delay create the lost OST-object for dangling LOV EA " + "until orphan OST-objects handled (default 'off', or 'on')\n" "-e: error handle mode (default 'continue', or 'abort')\n" "-h: this help message\n" "-n: check with no modification (default 'off', or 'on')\n" @@ -235,12 +240,18 @@ static int lfsck_get_dev_name(struct obd_ioctl_data *data, char *device, } ptr = strrchr(param.gl_pathv[0], '-'); - LASSERT(ptr != NULL); + if (ptr == NULL) { + rc = -EINVAL; + goto out; + } for (i = 1; i < param.gl_pathc; i++) { char *ptr2 = strrchr(param.gl_pathv[i], '-'); - LASSERT(ptr2 != NULL); + if (ptr2 == NULL) { + rc = -EINVAL; + goto out; + } if ((ptr - param.gl_pathv[0]) != (ptr2 - param.gl_pathv[i]) || strncmp(param.gl_pathv[0], param.gl_pathv[i], @@ -269,7 +280,7 @@ int jt_lfsck_start(int argc, char **argv) char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf; char device[MAX_OBD_NAME]; struct lfsck_start start; - char *optstring = "Ac::C::e:hM:n::ors:t:w:"; + char *optstring = "Ac::C::d::e:hM:n::ors:t:w:"; int opt, index, rc, val, i; memset(&data, 0, sizeof(data)); @@ -313,6 +324,19 @@ int jt_lfsck_start(int argc, char **argv) } start.ls_valid |= LSV_CREATE_MDTOBJ; break; + case 'd': + if (optarg == NULL || strcmp(optarg, "on") == 0) { + start.ls_flags |= LPF_DELAY_CREATE_OSTOBJ; + } else if (strcmp(optarg, "off") != 0) { + fprintf(stderr, "invalid switch: -c '%s'. " + "valid switches are:\n" + "empty ('on'), or 'off' without space. " + "For example:\n" + "'-c', '-con', '-coff'\n", optarg); + return -EINVAL; + } + start.ls_valid |= LSV_DELAY_CREATE_OSTOBJ; + break; case 'e': if (strcmp(optarg, "abort") == 0) { start.ls_flags |= LPF_FAILOUT;