static int stop_scan(int verbose);
static int misc_list(struct mddev_dev *devlist,
struct mddev_ident *ident,
+ char *dump_directory,
struct supertype *ss, struct context *c);
int rebuild_map = 0;
char *remove_path = NULL;
char *udev_filename = NULL;
+ char *dump_directory = NULL;
int print_help = 0;
FILE *outf;
case 'X':
case 'Q':
case ExamineBB:
+ case Dump:
+ case Restore:
newmode = MISC;
break;
case O(CREATE,DataOffset):
case O(GROW,DataOffset):
if (data_offset != INVALID_SECTORS) {
- fprintf(stderr, Name ": data-offset may only be specified one. "
+ pr_err("data-offset may only be specified one. "
"Second value is %s.\n", optarg);
exit(2);
}
else
data_offset = parse_size(optarg);
if (data_offset == INVALID_SECTORS) {
- fprintf(stderr, Name ": invalid data-offset: %s\n",
+ pr_err("invalid data-offset: %s\n",
optarg);
exit(2);
}
case O(MISC, DetailPlatform):
case O(MISC, KillSubarray):
case O(MISC, UpdateSubarray):
+ case O(MISC, Dump):
+ case O(MISC, Restore):
if (opt == KillSubarray || opt == UpdateSubarray) {
if (c.subarray) {
pr_err("subarray can only"
exit(2);
}
devmode = opt;
+ if (opt == Dump || opt == Restore) {
+ if (dump_directory != NULL) {
+ pr_err("dump/restore directory specified twice: %s and %s\n",
+ dump_directory, optarg);
+ exit(2);
+ }
+ dump_directory = optarg;
+ }
continue;
case O(MISC, UdevRules):
if (devmode && devmode != opt) {
exit(2);
}
} else
- rv = misc_list(devlist, &ident, ss, &c);
+ rv = misc_list(devlist, &ident, dump_directory, ss, &c);
break;
case MONITOR:
if (!devlist && !c.scan) {
for (members = 0; members <= 1; members++) {
for (e=ms ; e ; e=e->next) {
- char *name;
+ char *name = NULL;
struct map_ent *me;
+ struct stat stb;
int member = e->metadata_version &&
strncmp(e->metadata_version,
"external:/", 10) == 0;
if (me && me->path
&& strcmp(me->path, "/unknown") != 0)
name = me->path;
- else
+ if (name == NULL ||
+ stat(name, &stb) != 0)
name = get_md_name(e->devnm);
if (!name) {
static int misc_list(struct mddev_dev *devlist,
struct mddev_ident *ident,
+ char *dump_directory,
struct supertype *ss, struct context *c)
{
struct mddev_dev *dv;
int rv = 0;
- for (dv=devlist ; dv; dv=dv->next) {
+ for (dv=devlist ; dv; dv=(rv & 16) ? NULL : dv->next) {
int mdfd;
switch(dv->disposition) {
rv |= Update_subarray(dv->devname, c->subarray,
c->update, ident, c->verbose);
continue;
+ case Dump:
+ rv |= Dump_metadata(dv->devname, dump_directory, c, ss);
+ continue;
+ case Restore:
+ rv |= Restore_metadata(dv->devname, dump_directory, c, ss,
+ (dv == devlist && dv->next == NULL));
+ continue;
}
mdfd = open_mddev(dv->devname, 1);
if (mdfd>=0) {