From 3bb1f51db3e3ff81e79fbaf008061043c36436fe Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Wed, 4 May 2011 13:14:35 +1000 Subject: [PATCH] FORMAT CHANGE use 32bit block counts in segment usage file. This allows for much bigger segments. Still use 16bit youth numbers. Signed-off-by: NeilBrown --- include/lafs/layout.h | 20 ++++++++++++-------- lib/lafs_add_device.c | 4 ++-- lib/lafs_find_free.c | 2 +- lib/lafs_new_segment.c | 4 ++-- lib/lafs_segment_count.c | 8 ++++---- 5 files changed, 21 insertions(+), 17 deletions(-) diff --git a/include/lafs/layout.h b/include/lafs/layout.h index 3229b24..36a3a42 100644 --- a/include/lafs/layout.h +++ b/include/lafs/layout.h @@ -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 diff --git a/lib/lafs_add_device.c b/lib/lafs_add_device.c index 63abceb..733e433 100644 --- a/lib/lafs_add_device.c +++ b/lib/lafs_add_device.c @@ -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; diff --git a/lib/lafs_find_free.c b/lib/lafs_find_free.c index 145f3bf..8c02bd1 100644 --- a/lib/lafs_find_free.c +++ b/lib/lafs_find_free.c @@ -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; diff --git a/lib/lafs_new_segment.c b/lib/lafs_new_segment.c index 43d5601..9db2594 100644 --- a/lib/lafs_new_segment.c +++ b/lib/lafs_new_segment.c @@ -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); } diff --git a/lib/lafs_segment_count.c b/lib/lafs_segment_count.c index a332c2f..14f3ca7 100644 --- a/lib/lafs_segment_count.c +++ b/lib/lafs_segment_count.c @@ -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); } -- 2.39.5