diff options
author | Czarnowska, Anna <anna.czarnowska@intel.com> | 2012-04-02 10:15:08 +1000 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2012-04-02 10:15:08 +1000 |
commit | 97f81ee2635d8c1283ef857bc46d7314acffa1c3 (patch) | |
tree | 15461c7ab513623503a7163f7a0eb433df7e58ea | |
parent | 5551b113dc18a6275fb04c7e7e3b76c656926e0a (diff) | |
download | mdadm-97f81ee2635d8c1283ef857bc46d7314acffa1c3.tar.gz |
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 <anna.czarnowska@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r-- | super-intel.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/super-intel.c b/super-intel.c index c65d39b..480b379 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; } |