From 272f648fb00c58989a17651f2eb9c1cf9c807d59 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Mon, 16 Jun 2008 15:36:41 -0700 Subject: [PATCH] imsm: write anchor last Ensure that newly written anchors reflect a consistent metadata block. Signed-off-by: Dan Williams --- super-intel.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/super-intel.c b/super-intel.c index c8419f0..3a85e2c 100644 --- a/super-intel.c +++ b/super-intel.c @@ -1795,6 +1795,18 @@ static int store_imsm_mpb(int fd, struct intel_super *super) get_dev_size(fd, NULL, &dsize); + if (mpb_size > 512) { + /* -1 to account for anchor */ + sectors = mpb_sectors(mpb) - 1; + + /* write the extended mpb to the sectors preceeding the anchor */ + if (lseek64(fd, dsize - (512 * (2 + sectors)), SEEK_SET) < 0) + return 1; + + if (write(fd, super->buf + 512, mpb_size - 512) != mpb_size - 512) + return 1; + } + /* first block is stored on second to last sector of the disk */ if (lseek64(fd, dsize - (512 * 2), SEEK_SET) < 0) return 1; @@ -1802,19 +1814,6 @@ static int store_imsm_mpb(int fd, struct intel_super *super) if (write(fd, super->buf, 512) != 512) return 1; - if (mpb_size <= 512) - return 0; - - /* -1 because we already wrote a sector */ - sectors = mpb_sectors(mpb) - 1; - - /* write the extended mpb to the sectors preceeding the anchor */ - if (lseek64(fd, dsize - (512 * (2 + sectors)), SEEK_SET) < 0) - return 1; - - if (write(fd, super->buf + 512, mpb_size - 512) != mpb_size - 512) - return 1; - fsync(fd); return 0;