]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
clear hi bits if not used after loading metadata from disk
authorCzarnowska, Anna <anna.czarnowska@intel.com>
Mon, 2 Apr 2012 00:15:08 +0000 (10:15 +1000)
committerNeilBrown <neilb@suse.de>
Mon, 2 Apr 2012 00:15:08 +0000 (10:15 +1000)
Functions retrieving sizes from metadata do not need to check
2TB attribute only when we can guarantee the hi bits are always
clear when the MPB_ATTR_2TB_DISK attribute is not set.

Therefore the following fields are cleared on metadata load
when not in use according to attribute:
struct imsm_disk.total_blocks_hi
struct imsm_map.pba_of_lba0_hi
struct imsm_map.blocks_per_member_hi
struct imsm_map.num_data_stripes_hi

Signed-off-by: Anna Czarnowska <anna.czarnowska@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
super-intel.c

index c65d39bab3f5ba9bf6c92bac1060b83974ff4593..480b37932e44438cce122971df69520bea56058c 100644 (file)
@@ -3590,6 +3590,32 @@ static int load_imsm_mpb(int fd, struct intel_super *super, char *devname)
 
 static int read_imsm_migr_rec(int fd, struct intel_super *super);
 
+/* clears hi bits in metadata if MPB_ATTRIB_2TB_DISK not set */
+static void clear_hi(struct intel_super *super)
+{
+       struct imsm_super *mpb = super->anchor;
+       int i, n;
+       if (mpb->attributes & MPB_ATTRIB_2TB_DISK)
+               return;
+       for (i = 0; i < mpb->num_disks; ++i) {
+               struct imsm_disk *disk = &mpb->disk[i];
+               disk->total_blocks_hi = 0;
+       }
+       for (i = 0; i < mpb->num_raid_devs; ++i) {
+               struct imsm_dev *dev = get_imsm_dev(super, i);
+               if (!dev)
+                       return;
+               for (n = 0; n < 2; ++n) {
+                       struct imsm_map *map = get_imsm_map(dev, n);
+                       if (!map)
+                               continue;
+                       map->pba_of_lba0_hi = 0;
+                       map->blocks_per_member_hi = 0;
+                       map->num_data_stripes_hi = 0;
+               }
+       }
+}
+
 static int
 load_and_parse_mpb(int fd, struct intel_super *super, char *devname, int keep_fd)
 {
@@ -3602,7 +3628,7 @@ load_and_parse_mpb(int fd, struct intel_super *super, char *devname, int keep_fd
        if (err)
                return err;
        err = parse_raid_devices(super);
-
+       clear_hi(super);
        return err;
 }