From 97f81ee2635d8c1283ef857bc46d7314acffa1c3 Mon Sep 17 00:00:00 2001 From: "Czarnowska, Anna" Date: Mon, 2 Apr 2012 10:15:08 +1000 Subject: [PATCH] clear hi bits if not used after loading metadata from disk 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 Signed-off-by: NeilBrown --- super-intel.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/super-intel.c b/super-intel.c index c65d39ba..480b3793 100644 --- a/super-intel.c +++ b/super-intel.c @@ -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; } -- 2.39.2