This allows for much bigger segments.
Still use 16bit youth numbers.
Signed-off-by: NeilBrown <neilb@suse.de>
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) */
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) */
{
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
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;
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;
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);
}
{
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);
}