]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
imsm: update mpb_size in write_super_imsm
authorDan Williams <dan.j.williams@intel.com>
Sun, 10 Aug 2008 03:28:24 +0000 (20:28 -0700)
committerDan Williams <dan.j.williams@intel.com>
Tue, 12 Aug 2008 09:25:49 +0000 (02:25 -0700)
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 <dan.j.williams@intel.com>
super-intel.c

index 28b26d98a7b61595d0c3cd662502e2e88ce2cd43..7ea91917aa673a4f0717fd6c6506fcf2afa97257 100644 (file)
@@ -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);