From 272f648fb00c58989a17651f2eb9c1cf9c807d59 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Mon, 16 Jun 2008 15:36:41 -0700 Subject: [PATCH 1/1] 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 c8419f00..3a85e2c3 100644 --- a/super-intel.c +++ b/super-intel.c @@ -1795,24 +1795,23 @@ static int store_imsm_mpb(int fd, struct intel_super *super) get_dev_size(fd, NULL, &dsize); - /* first block is stored on second to last sector of the disk */ - if (lseek64(fd, dsize - (512 * 2), SEEK_SET) < 0) - return 1; + if (mpb_size > 512) { + /* -1 to account for anchor */ + sectors = mpb_sectors(mpb) - 1; - if (write(fd, super->buf, 512) != 512) - return 1; - - if (mpb_size <= 512) - return 0; + /* write the extended mpb to the sectors preceeding the anchor */ + if (lseek64(fd, dsize - (512 * (2 + sectors)), SEEK_SET) < 0) + return 1; - /* -1 because we already wrote a sector */ - sectors = mpb_sectors(mpb) - 1; + if (write(fd, super->buf + 512, mpb_size - 512) != mpb_size - 512) + return 1; + } - /* write the extended mpb to the sectors preceeding the anchor */ - if (lseek64(fd, dsize - (512 * (2 + sectors)), SEEK_SET) < 0) + /* first block is stored on second to last sector of the disk */ + if (lseek64(fd, dsize - (512 * 2), SEEK_SET) < 0) return 1; - if (write(fd, super->buf + 512, mpb_size - 512) != mpb_size - 512) + if (write(fd, super->buf, 512) != 512) return 1; fsync(fd); -- 2.39.2