]> git.neil.brown.name Git - lafs-utils.git/commitdiff
FORMAT CHANGE use 32bit block counts in segment usage file.
authorNeilBrown <neilb@suse.de>
Wed, 4 May 2011 03:14:35 +0000 (13:14 +1000)
committerNeilBrown <neilb@suse.de>
Wed, 4 May 2011 03:14:35 +0000 (13:14 +1000)
This allows for much bigger segments.
Still use 16bit youth numbers.

Signed-off-by: NeilBrown <neilb@suse.de>
include/lafs/layout.h
lib/lafs_add_device.c
lib/lafs_find_free.c
lib/lafs_new_segment.c
lib/lafs_segment_count.c

index 3229b24ea4237921eb808a5270fdb0aa3c2dd364..36a3a42f2d222b8d5279138c8638f82290ee55d6 100644 (file)
@@ -46,14 +46,13 @@ struct lafs_state {
        u8      uuid[16];
        u32     levels;
        u32     devices;
-       u32     nonlog_segment; /* segment number and */
-       u16     nonlog_dev;     /* device number of active non-logged segment */
-       u16     nonlog_offset;  /* offset into above segment of next non-logged
+       u32     nonlog_offset;  /* offset into above segment of next non-logged
                                 * block to allocate
                                 */
-       u32     maxsnapshot;
+       u32     nonlog_segment; /* segment number and */
+       u16     nonlog_dev;     /* device number of active non-logged segment */
        u16     nextyouth;
-       u16     pad0;
+       u32     maxsnapshot;
 
        u64     checkpointcluster;      /* (array block) */
        u64     root_inodes[0]; /* (array block) */
@@ -95,11 +94,10 @@ struct cluster_head {
        u8      uuid[16];
        u64     seq;
        u32     flags;
+       u16     verify_type;
        u16     Hlength;        /* header length - (bytes) */
-       u16     Clength;        /* cluster length including header - (blocks) */
+       u32     Clength;        /* cluster length including header - (blocks) */
        u32     checksum;       /* over Hlength bytes */
-       u16     verify_type;
-       u16     pad0;
        u8      verify_data[16];
        u64     next_addr;      /* (Array block) */
        u64     this_addr;      /* (array block) */
@@ -284,3 +282,9 @@ static int inline decay_undo(int y)
 {
        return y + 16384;
 }
+
+/* seg usage uses 4 bytes - so shift is 2
+ * youth uses 2 bytes - so shift - 1
+ */
+#define        USAGE_SHIFT     2
+#define        YOUTH_SHIFT     1
index 63abcebd5c691ce9ee67b9b83bcf482b4f38fe47..733e43334980297da093b07767ea7a8ec6fbb66b 100644 (file)
@@ -130,8 +130,8 @@ struct lafs_device *lafs_add_device(struct lafs *fs, char *devname, int fd,
        dev->segment_count = (dev->stateaddr[3] - dev->segment_offset) / fs->blocksize / dev->segment_size;
 
 
-       dev->tablesize = ((dev->segment_count + fs->blocksize/2 + 1)
-                         / (fs->blocksize/2));
+       dev->tablesize = ((dev->segment_count + (fs->blocksize >> USAGE_SHIFT) + 1)
+                         / (fs->blocksize >> USAGE_SHIFT));
 
        dev->size = dev->segment_count * dev->segment_size;
 
index 145f3bfae7f12e3388f035c1a50456b4c49f2b5b..8c02bd1ecefb15ec27e87c97640cc227fc4fe0d1 100644 (file)
@@ -13,7 +13,7 @@
 void lafs_find_free(struct lafs *fs)
 {
        struct lafs_device *dev;
-       int mask = (1<<(fs->blockbits - 1)) - 1;
+       int mask = (1<<(fs->blockbits - YOUTH_SHIFT)) - 1;
 
        for (dev = fs->devs; dev; dev = dev->next) {
                struct lafs_ino *ino = dev->segsum;
index 43d5601d28c4ae450cfc3741b59725c9e0af3096..9db2594f9f1083e13a66682514cd4c8c9966b17e 100644 (file)
@@ -20,12 +20,12 @@ static void set_youth(struct lafs *fs, int dev, loff_t seg, int youth)
        loff_t addr;
 
        dv = dev_by_num(fs, dev);
-       addr = seg / (fs->blocksize/2);
+       addr = seg / (fs->blocksize >> YOUTH_SHIFT);
 
        db = lafs_dblk(dv->segsum, addr);
        lafs_load_dblk(db);
        p = (void*)db->b.data;
-       p[seg % (fs->blocksize/2)] = __cpu_to_le16(youth);
+       p[seg % (fs->blocksize >> YOUTH_SHIFT)] = __cpu_to_le16(youth);
        lafs_sched_blk(&db->b);
 }
 
index a332c2fed68026e5387edbba2391d5847280694b..14f3ca7f2c43b65599a44bf6798592efa3501273 100644 (file)
@@ -26,19 +26,19 @@ void segment_count(struct lafs *fs, int dev, loff_t seg, int diff)
 {
        struct lafs_device *dv;
        struct lafs_dblk *db;
-       uint16_t *p;
+       uint32_t *p;
        int cnt;
        loff_t addr;
 
        dv = dev_by_num(fs, dev);
-       addr = dv->tablesize + seg / (fs->blocksize/2);
+       addr = dv->tablesize + seg / (fs->blocksize >> USAGE_SHIFT);
 
        db = lafs_dblk(dv->segsum, addr);
        lafs_load_dblk(db);
        p = (void*)db->b.data;
-       cnt = __le16_to_cpu(p[seg % (fs->blocksize/2)]);
+       cnt = __le32_to_cpu(p[seg % (fs->blocksize >> USAGE_SHIFT)]);
        cnt += diff;
-       p[seg % (fs->blocksize/2)] = __cpu_to_le16(cnt);
+       p[seg % (fs->blocksize >> USAGE_SHIFT)] = __cpu_to_le32(cnt);
        lafs_sched_blk(&db->b);
 }