From: Dan Williams Date: Sun, 10 Aug 2008 03:28:24 +0000 (-0700) Subject: imsm: update mpb_size in write_super_imsm X-Git-Tag: mdadm-3.0-devel1~66 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a48ac0a8d626bbf1d3bd798a212512402e6ead5e;p=thirdparty%2Fmdadm.git imsm: update mpb_size in write_super_imsm With dev->vol.map and mpb->disk entries entering and leaving the parameter block write_super_imsm needs to update the size before writeback. Signed-off-by: Dan Williams --- diff --git a/super-intel.c b/super-intel.c index 28b26d98..7ea91917 100644 --- a/super-intel.c +++ b/super-intel.c @@ -1611,6 +1611,7 @@ static int write_super_imsm(struct intel_super *super, int doclose) int spares = 0; int raid_disks = 0; int i; + __u32 mpb_size = sizeof(struct imsm_super) - sizeof(struct imsm_disk); /* 'generation' is incremented everytime the metadata is written */ generation = __le32_to_cpu(mpb->generation_num); @@ -1623,6 +1624,7 @@ static int write_super_imsm(struct intel_super *super, int doclose) else { raid_disks++; mpb->disk[d->index] = d->disk; + mpb_size += sizeof(struct imsm_disk); } } if (raid_disks != mpb->num_disks) { @@ -1635,7 +1637,10 @@ static int write_super_imsm(struct intel_super *super, int doclose) struct imsm_dev *dev = __get_imsm_dev(mpb, i); imsm_copy_dev(dev, super->dev_tbl[i]); + mpb_size += sizeof_imsm_dev(dev, 0); } + mpb_size += __le32_to_cpu(mpb->bbm_log_size); + mpb->mpb_size = __cpu_to_le32(mpb_size); /* recalculate checksum */ sum = __gen_imsm_checksum(mpb);