summaryrefslogtreecommitdiff
path: root/super-intel.c
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2008-11-26 15:39:51 -0700
committerNeilBrown <neilb@suse.de>2008-11-27 15:41:03 +1100
commitdda5855f96baa1b7e15e6ee8bb6d985e269257e5 (patch)
tree35336b64b2a893e3582bedec686c2cfcab724b2d /super-intel.c
parent208933a7a839d60e48efc90450c6ed3c0f6873e2 (diff)
imsm: fix metadata reservation
1/ When truncating the space reserved for the metadata round down to an even numbered sector count to avoid an off-by-one error when sysfs_add_disk rounds up. 2/ Set the current metadata parameter block size as a floor. Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'super-intel.c')
-rw-r--r--super-intel.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/super-intel.c b/super-intel.c
index 5d8944ce..99419ffd 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -489,6 +489,13 @@ static struct extent *get_extents(struct intel_super *super, struct dl *dl)
remainder = __le32_to_cpu(dl->disk.total_blocks) -
(last->start + last->size);
+ /* round down to 1k block to satisfy precision of the kernel
+ * 'size' interface
+ */
+ remainder &= ~1UL;
+ /* make sure remainder is still sane */
+ if (remainder < ROUND_UP(super->len, 512) >> 9)
+ remainder = ROUND_UP(super->len, 512) >> 9;
if (reservation > remainder)
reservation = remainder;
}