summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCzarnowska, Anna <anna.czarnowska@intel.com>2012-04-02 10:15:08 +1000
committerNeilBrown <neilb@suse.de>2012-04-02 10:15:08 +1000
commit97f81ee2635d8c1283ef857bc46d7314acffa1c3 (patch)
tree15461c7ab513623503a7163f7a0eb433df7e58ea
parent5551b113dc18a6275fb04c7e7e3b76c656926e0a (diff)
downloadmdadm-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.c28
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;
}