From: NeilBrown Date: Wed, 4 May 2011 07:04:36 +0000 (+1000) Subject: FORMAT CHANGE Various changes to 'superblock' format. X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=15356cffbe96158f264be9de3ccf725d712f1fb1;p=LaFS.git FORMAT CHANGE Various changes to 'superblock' format. Simplify version number. Allow reference to readonly base. Allow arbitrary config options. Signed-off-by: NeilBrown --- diff --git a/layout.h b/layout.h index e92b8cc..8443980 100644 --- a/layout.h +++ b/layout.h @@ -16,10 +16,11 @@ */ struct lafs_dev { char idtag[16]; /* LaFS-DeviceBlock */ - char version[16]; /* number space options */ u8 uuid[16]; u32 checksum; u32 seq; + u32 version; /* Currently must be LAFS_DEV_VERS == 1 */ + u32 pad0; u64 ctime; u64 start, size; /* in array address space (array block)*/ @@ -34,18 +35,26 @@ struct lafs_dev { u32 segment_offset; /* offset of first segment (device byte) */ u32 segment_count; u32 usage_inum; /* inum of segment usage file */ - u32 level; + char options[512]; /* Space separated, nul terminated, Cap for + * read-only-if-you-don't-understand + */ } __attribute__((packed)); -#define LAFS_DEVBLK_SIZE 1024 +#define LAFS_DEVBLK_SIZE 1024 +#define LAFS_DEV_VERS 1 struct lafs_state { char idtag[16]; /* LaFS-State-Block */ - char version[16]; /* number space options */ + u8 uuid[16]; + u8 alt_uuid[16]; /* allows sharing of read-only devices + * between arrays + */ u32 checksum; + u32 version; /* Must be LAFS_STATE_VERS == 1 */ u32 seq; - u8 uuid[16]; - u32 levels; + u32 alt_seq; /* seq number of the alt_uuid devices */ u32 devices; + u32 pad0; + u32 nonlog_offset; /* offset into following segment of next non-logged * block to allocate */ @@ -54,9 +63,18 @@ struct lafs_state { u16 nextyouth; u32 maxsnapshot; + u64 inconsistencies;/* bit set of discovered inconsistency types. + * If any unknown bits are set, an fsck is needed + * for writing. + * If known bits are set, behaviour is dependant + * on those bits. + */ + u64 checkpointcluster; /* (array block) */ + char options[512]; /* Space separated, nul terminated. */ u64 root_inodes[0]; /* (array block) */ } __attribute__((packed)); +#define LAFS_STATE_VERS 1 struct descriptor { u32 block_num; /* (file block) */ diff --git a/state.h b/state.h index be8b204..1ba86c7 100644 --- a/state.h +++ b/state.h @@ -255,7 +255,6 @@ struct fs { u32 segment_stride; u32 segment_count; u32 usage_inum; - u16 level; u32 rows_per_table, tables_per_seg; diff --git a/super.c b/super.c index 81c32e2..0428fe6 100644 --- a/super.c +++ b/super.c @@ -76,7 +76,7 @@ valid_devblock(struct lafs_dev *db, sector_t addr, sector_t size) if (strncmp(db->idtag, "LaFS-DeviceBlock", 16) != 0) return 0; - if (strncmp(db->version, "AlphaDevel ", 16) != 0) + if (le32_to_cpu(db->version) != LAFS_DEV_VERS) return 0; /* uuid can be anything */ crc = db->checksum; @@ -156,9 +156,6 @@ valid_devblock(struct lafs_dev *db, sector_t addr, sector_t size) if (le32_to_cpu(db->segment_offset) + segsize > (size << db->blockbits)) return 0; - if (le32_to_cpu(db->level) > 10) - return 0; - /* I guess it look sane enough... */ return 1; } @@ -189,7 +186,7 @@ valid_stateblock(struct lafs_state *st, struct lafs_dev *dv) u32 crc; if (strncmp(st->idtag, "LaFS-State-Block", 16) != 0) return 0; - if (strncmp(st->version, "AlphaDevel ", 16) != 0) + if (le32_to_cpu(st->version) != LAFS_STATE_VERS) return 0; crc = st->checksum; st->checksum = 0; @@ -204,6 +201,10 @@ valid_stateblock(struct lafs_state *st, struct lafs_dev *dv) > (1<statebits)) return 0; + /* Don't support RO sharing yet. */ + if (st->alt_seq) + return 0; + return 1; } @@ -536,7 +537,6 @@ lafs_load(struct fs *fs, struct options *op, int newest) #endif fs->seq = le32_to_cpu(st->seq); - fs->levels = le32_to_cpu(st->levels); fs->devices = op->devcnt; fs->devs_loaded = fs->devices; /* FIXME use this or lose this */ fs->statesize = 1 << op->statebits; @@ -674,7 +674,6 @@ lafs_load(struct fs *fs, struct options *op, int newest) dv->segment_offset = le32_to_cpu(dv->devblk->segment_offset); dv->segment_count = le32_to_cpu(dv->devblk->segment_count); dv->usage_inum = le32_to_cpu(dv->devblk->usage_inum); - dv->level = le16_to_cpu(dv->devblk->level); if (dv->segment_size > fs->max_segment) fs->max_segment = dv->segment_size;