]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
imsm: FIX: Verify if migration record is loaded correctly
authorAdam Kwolek <adam.kwolek@intel.com>
Thu, 9 Jun 2011 03:00:54 +0000 (13:00 +1000)
committerNeilBrown <neilb@suse.de>
Thu, 9 Jun 2011 03:00:54 +0000 (13:00 +1000)
Migration compatibility can be checked when general migration record
is present.

Signed-off-by: Adam Kwolek <adam.kwolek@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
super-intel.c

index d8070be55d870351b408a69b78ec8ee3333be54c..ad5e79c689c78cdd4d68e5dcb102ae1a68b8b5fe 100644 (file)
@@ -3038,8 +3038,8 @@ static int load_imsm_mpb(int fd, struct intel_super *super, char *devname)
 
        if (lseek64(fd, dsize - (512 * 2), SEEK_SET) < 0) {
                if (devname)
-                       fprintf(stderr,
-                               Name ": Cannot seek to anchor block on %s: %s\n",
+                       fprintf(stderr, Name
+                               ": Cannot seek to anchor block on %s: %s\n",
                                devname, strerror(errno));
                return 1;
        }
@@ -3836,16 +3836,17 @@ static int load_super_imsm(struct supertype *st, int fd, char *devname)
        }
 
        /* load migration record */
-       load_imsm_migr_rec(super, NULL);
-
-       /* Check for unsupported migration features */
-       if (check_mpb_migr_compatibility(super) != 0) {
-               fprintf(stderr, Name ": Unsupported migration detected");
-               if (devname)
-                       fprintf(stderr, " on %s\n", devname);
-               else
-                       fprintf(stderr, " (IMSM).\n");
-               return 3;
+       if (load_imsm_migr_rec(super, NULL) == 0) {
+               /* Check for unsupported migration features */
+               if (check_mpb_migr_compatibility(super) != 0) {
+                       fprintf(stderr,
+                               Name ": Unsupported migration detected");
+                       if (devname)
+                               fprintf(stderr, " on %s\n", devname);
+                       else
+                               fprintf(stderr, " (IMSM).\n");
+                       return 3;
+               }
        }
 
        return 0;
@@ -7762,7 +7763,12 @@ abort:
 int save_checkpoint_imsm(struct supertype *st, struct mdinfo *info, int state)
 {
        struct intel_super *super = st->sb;
-       load_imsm_migr_rec(super, info);
+       if (load_imsm_migr_rec(super, info) != 0) {
+               dprintf("imsm: ERROR: Cannot read migration record "
+                       "for checkpoint save.\n");
+               return 1;
+       }
+
        if (__le32_to_cpu(super->migr_rec->blocks_per_unit) == 0) {
                dprintf("ERROR: blocks_per_unit = 0!!!\n");
                return 1;