From df3346e675d731b4c847272fc40bb992ace7554e Mon Sep 17 00:00:00 2001 From: "Labun, Marcin" Date: Wed, 23 Mar 2011 12:04:46 +1100 Subject: [PATCH] examine: allows to examine a disk metadata on non-metadata compliant systems Allow for loading metadata from disk attached to non-metadata compliant system. Affects mdadm --examine and guess_super. Added ignore_hw_compat in supertype to pass information to load_super handler. If ignore_hw_compat is set the handler should load metadata also from disks that do not comply with metadata requirements (i.e. disk is not attached to native controller, etc). Signed-off-by: Marcin Labun Signed-off-by: NeilBrown --- Examine.c | 2 ++ mdadm.h | 6 +++++- util.c | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Examine.c b/Examine.c index f949646f..5d71e537 100644 --- a/Examine.c +++ b/Examine.c @@ -87,6 +87,7 @@ int Examine(struct mddev_dev *devlist, int brief, int export, int scan, st = guess_super(fd); if (st) { err = 1; + st->ignore_hw_compat = 1; if (!container) err = st->ss->load_super(st, fd, (brief||scan) ? NULL @@ -98,6 +99,7 @@ int Examine(struct mddev_dev *devlist, int brief, int export, int scan, if (!err) have_container = 1; } + st->ignore_hw_compat = 0; } else { if (!brief) { fprintf(stderr, Name ": No md superblock detected on %s.\n", devlist->devname); diff --git a/mdadm.h b/mdadm.h index fa5af3ae..8277594b 100644 --- a/mdadm.h +++ b/mdadm.h @@ -827,7 +827,11 @@ struct supertype { int container_dev; /* devnum of container */ void *sb; void *info; - + int ignore_hw_compat; /* used to inform metadata handlers that it should ignore + HW/firmware related incompatability to load metadata. + Used when examining metadata to display content of disk + when user has no hw/firmare compatible system. + */ struct metadata_update *updates; struct metadata_update **update_tail; diff --git a/util.c b/util.c index 8e1b7371..ef4406a1 100644 --- a/util.c +++ b/util.c @@ -1196,6 +1196,7 @@ struct supertype *guess_super_type(int fd, enum guess_types guess_type) if (guess_type == guess_partitions && ss->add_to_super != NULL) continue; memset(st, 0, sizeof(*st)); + st->ignore_hw_compat = 1; rv = ss->load_super(st, fd, NULL); if (rv == 0) { struct mdinfo info; @@ -1211,9 +1212,11 @@ struct supertype *guess_super_type(int fd, enum guess_types guess_type) if (bestsuper != -1) { int rv; memset(st, 0, sizeof(*st)); + st->ignore_hw_compat = 1; rv = superlist[bestsuper]->load_super(st, fd, NULL); if (rv == 0) { superlist[bestsuper]->free_super(st); + st->ignore_hw_compat = 0; return st; } } -- 2.39.2