From 0175cbf62c588367c36776072c5654ac17177ad9 Mon Sep 17 00:00:00 2001 From: "mwilck@arcor.de" Date: Fri, 1 Mar 2013 23:28:24 +0100 Subject: [PATCH] DDF: increase seq number when writing meta data Cleanly increase the seq number when the DDF structures are written, instead of always setting it back to 1. Also, make sure that the sequential number of all headers and VD conf records is the same. Signed-off-by: Martin Wilck Signed-off-by: NeilBrown --- super-ddf.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/super-ddf.c b/super-ddf.c index dfbd5510..5eedbc30 100644 --- a/super-ddf.c +++ b/super-ddf.c @@ -2376,6 +2376,7 @@ static int __write_ddf_structure(struct dl *d, struct ddf_super *ddf, __u8 type, c = (struct vcl *)d->spare; if (c) { + c->conf.seqnum = ddf->primary.seq; c->conf.crc = calc_crc(&c->conf, conf_size); if (write(fd, &c->conf, conf_size) < 0) break; @@ -2408,12 +2409,20 @@ static int __write_init_super_ddf(struct supertype *st) int successes = 0; unsigned long long size; char *null_aligned; + __u32 seq; if (posix_memalign((void**)&null_aligned, 4096, NULL_CONF_SZ) != 0) { return -ENOMEM; } memset(null_aligned, 0xff, NULL_CONF_SZ); + if (ddf->primary.seq != 0xffffffff) + seq = __cpu_to_be32(__be32_to_cpu(ddf->primary.seq)+1); + else if (ddf->secondary.seq != 0xffffffff) + seq = __cpu_to_be32(__be32_to_cpu(ddf->secondary.seq)+1); + else + seq = __cpu_to_be32(1); + /* try to write updated metadata, * if we catch a failure move on to the next disk */ @@ -2447,7 +2456,7 @@ static int __write_init_super_ddf(struct supertype *st) else ddf->anchor.secondary_lba = __cpu_to_be64(size - 32*1024*2); - ddf->anchor.seq = __cpu_to_be32(1); + ddf->anchor.seq = seq; memcpy(&ddf->primary, &ddf->anchor, 512); memcpy(&ddf->secondary, &ddf->anchor, 512); -- 2.47.2