3 * adjust the usage count for the segment containing a given block
8 static void delay_update(struct lafs *fs, int dev, loff_t seg, int diff)
10 struct lafs_delayed *d = fs->delayed;
12 while (d && (d->dev != dev || d->seg != seg))
15 d = malloc(sizeof(*d));
16 d->next = fs->delayed;
25 void segment_count(struct lafs *fs, int dev, loff_t seg, int diff)
27 struct lafs_device *dv;
33 dv = dev_by_num(fs, dev);
34 addr = dv->tablesize + seg / (fs->blocksize >> USAGE_SHIFT);
36 db = lafs_dblk(dv->segsum, addr);
38 p = (void*)db->b.data;
39 cnt = __le32_to_cpu(p[seg % (fs->blocksize >> USAGE_SHIFT)]);
41 p[seg % (fs->blocksize >> USAGE_SHIFT)] = __cpu_to_le32(cnt);
42 lafs_sched_blk(&db->b);
46 void lafs_segment_count(struct lafs *fs, loff_t addr, int diff)
52 virttoseg(fs, addr, &dev, &seg, &offset);
54 if (fs->flags & LAFS_DELAY_UPDATES) {
55 delay_update(fs, dev, seg, diff);
58 segment_count(fs, dev, seg, diff);
61 void lafs_segment_apply_delayed(struct lafs *fs)
63 struct lafs_delayed *delayed = fs->delayed;
65 if (fs->flags & LAFS_DELAY_UPDATES)
70 struct lafs_delayed *d = delayed;
72 segment_count(fs, d->dev, d->seg, d->diff);