]> git.neil.brown.name Git - LaFS.git/commitdiff
FORMAT CHANGE Various changes to 'superblock' format.
authorNeilBrown <neilb@suse.de>
Wed, 4 May 2011 07:04:36 +0000 (17:04 +1000)
committerNeilBrown <neilb@suse.de>
Wed, 4 May 2011 07:04:36 +0000 (17:04 +1000)
Simplify version number.
Allow reference to readonly base.
Allow arbitrary config options.

Signed-off-by: NeilBrown <neilb@suse.de>
layout.h
state.h
super.c

index e92b8cc8c8829e2fc61de7ad3aa295a51fa9fc46..8443980eb998dc63695fe069e15ce9bf713d6792 100644 (file)
--- a/layout.h
+++ b/layout.h
  */
 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 be8b204147b80464584025405c88a5e68d9ab963..1ba86c72d3d4b4bbc6c9846b0e6def7154ee7ab4 100644 (file)
--- 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 81c32e2878f38524ff7f3799362d863631914fff..0428fe6709ef20ab710e53825e3a8023be2aa4b5 100644 (file)
--- 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<<dv->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;