err = lafs_load_page_async(fs, tc->chead,
tc->haddr,
(PAGE_SIZE /
- fs->prime_sb->s_blocksize),
+ fs->blocksize),
&tc->ac);
rv = 0;
static void cluster_reset(struct fs *fs, struct wc *wc)
{
- int blocksize = fs->prime_sb->s_blocksize;
+ int blocksize = fs->blocksize;
if (wc->seg.dev < 0) {
wc->remaining = 0;
wc->chead_size = 0;
char *ibuf, *dbuf;
loff_t size = i_size_read(b->inode);
- struct super_block *sb = b->inode->i_sb;
struct lafs_inode *lai = LAFSI(b->inode);
struct datablock *db;
-
- struct fs *fs = sb->s_fs_info;
+ struct fs *fs = fs_from_inode(b->inode);
lafs_iolock_block(&lai->iblock->b);
dprintk("FLUSHING single block into inode - s=%d %s\n",
int credits = 1;
/* Check size again, just in case it changed */
size = i_size_read(b->inode);
- if (size + lai->metadata_size > sb->s_blocksize) {
+ if (size + lai->metadata_size > fs->blocksize) {
/* Lost a race, better give up restoring Dirty bit */
if (test_and_set_bit(B_Dirty, &b->flags))
if (test_and_set_bit(B_Credit, &b->flags))
dbuf, size);
memset(ibuf + lai->metadata_size + size,
0,
- sb->s_blocksize - lai->metadata_size - size);
+ fs->blocksize - lai->metadata_size - size);
unmap_dblock_2(db, ibuf);
unmap_dblock(dblk(b), dbuf);
lafs_iounlock_block(&lai->iblock->b);
int lafs_cluster_allocate(struct block *b, int cnum)
{
- struct super_block *sb = b->inode->i_sb;
- struct fs *fs = sb->s_fs_info;
+ struct fs *fs = fs_from_inode(b->inode);
struct wc *wc = &fs->wc[cnum];
struct lafs_inode *lai;
loff_t size;
b->fileaddr == 0 &&
b->parent == lai->iblock && /* No indexing */
lai->type >= TypeBase && /* 'size' is meaningful */
- size + lai->metadata_size <= sb->s_blocksize) {
+ size + lai->metadata_size <= fs->blocksize) {
int success = flush_data_to_inode(b);
if (success) {
lafs_summary_update(fs, b->inode, b->physaddr, 0,
sizeof(struct descriptor)) ||
(wc->remaining > 2 &&
wc->chead_blocks < MAX_CHEAD_BLOCKS &&
- (wc->chead_blocks+1) * sb->s_blocksize <= PAGE_SIZE)
+ (wc->chead_blocks+1) * fs->blocksize <= PAGE_SIZE)
)
avail = 2;
else if (wc->cluster_space >= sizeof(struct descriptor))
/* need a new page */
wc->chead_blocks++;
wc->remaining--;
- wc->cluster_space += sb->s_blocksize;
+ wc->cluster_space += fs->blocksize;
}
wc->remaining--;
BUG_ON(wc->remaining < 0);
/* flush 'size' bytes of data, as 'offset' of bnum in ino
* in the next write cluster
*/
- struct super_block *sb = ino->i_sb;
struct wc *wc = &fs->wc[0];
struct group_head *head_start;
unsigned long long seq;
sizeof(struct descriptor) +
ROUND_UP(len))) {
if (wc->remaining > 0 && wc->chead_blocks < MAX_CHEAD_BLOCKS &&
- (wc->chead_blocks+1) * sb->s_blocksize <= PAGE_SIZE) {
+ (wc->chead_blocks+1) * fs->blocksize <= PAGE_SIZE) {
wc->chead_blocks++;
wc->remaining--;
- wc->cluster_space += sb->s_blocksize;
+ wc->cluster_space += fs->blocksize;
} else
cluster_flush(fs, 0);
}
struct wc *wc = &fs->wc[cnum];
int i;
struct block *b;
- struct super_block *sb = fs->prime_sb;
struct inode *current_inode = NULL;
u64 current_block = NoBlock;
u64 head_addr[MAX_CHEAD_BLOCKS];
current_block = b->fileaddr;
} else
current_block++;
- cluster_incdesc(wc, desc_start, b, sb->s_blocksize_bits);
+ cluster_incdesc(wc, desc_start, b, fs->blocksize_bits);
addr = seg_next(fs, &wc->seg);
if (cnum && test_bit(B_Dirty, &b->flags))
/* Were a cleaning but this block is now dirty.
for (i = 0; i < wc->chead_blocks; i++)
lafs_write_head(fs,
page_address(wc->page[wc->pending_next])
- + i*sb->s_blocksize,
+ + i * fs->blocksize,
head_addr[i], wc);
while (!list_empty(&wc->clhead)) {
* we only need the first of those.
*
*/
- int blocksize = fs->prime_sb->s_blocksize;
+ int blocksize = fs->blocksize;
struct datablock *dirblk;
char *buf, *n1, *n2;
int bits = dir->i_blkbits-8;
* - else add doh->previndex into doh->index
*/
char *buf;
- int bits = fs->prime_sb->s_blocksize_bits - 8;
- int blocksize = fs->prime_sb->s_blocksize;
+ int bits = fs->blocksize_bits - 8;
+ int blocksize = fs->blocksize;
struct lafs_inode *lai = LAFSI(dir);
u32 seed = lai->md.file.seed;
int err;
l = strlen(symlink);
- if (l > fs->prime_sb->s_blocksize-1)
+ if (l > fs->blocksize-1)
return -ENAMETOOLONG;
ino = lafs_new_inode(fs, dir, TypeSymlink, 0, 0666, &inodb);
if (!ib)
return NULL;
if (with_buffer) {
- ib->data = kmalloc(fs->prime_sb->s_blocksize, gfp);
+ ib->data = kmalloc(fs->blocksize, gfp);
if (!ib->data) {
kfree(ib);
return NULL;
if (lai->depth == 1)
offset = lai->metadata_size;
buf = map_iblock(leaf);
- p = leaf_lookup(buf+offset, fs->prime_sb->s_blocksize-offset,
+ p = leaf_lookup(buf+offset, fs->blocksize-offset,
leaf->b.fileaddr, (u32)*addrp, &nextd);
unmap_iblock(leaf, buf);
if (p) {
}
size += sizeof(struct la_inode);
lai->metadata_size = cpu_to_le32(size);
- memset(((char *)lai)+size, 0, fs->prime_sb->s_blocksize-size);
+ memset(((char *)lai)+size, 0, fs->blocksize-size);
*(u16 *)(((char *)lai)+size) = cpu_to_le16(IBLK_EXTENT);
unmap_dblock(b, lai);
ib2 = ib;
lastaddr = (i_size_read(ino) +
- ino->i_sb->s_blocksize - 1)
- >> ino->i_sb->s_blocksize_bits;
+ fs->blocksize - 1)
+ >> fs->blocksize_bits;
/* Find a Pinned descendent of ib which has no
* Pinned descendents and no PrimaryRef dependent
* (so take the last).
bnum = LAFSI(im)->md.inodemap.thisblock;
if (bnum == NoBlock ||
- LAFSI(im)->md.inodemap.nextbit >= (filesys->i_sb->s_blocksize<<3)) {
+ LAFSI(im)->md.inodemap.nextbit >= (fs->blocksize<<3)) {
if (bnum == NoBlock)
bnum = LAFSI(im)->md.inodemap.size;
buf = map_dblock(b);
/* Set block to "all are free" */
- memset(buf, 0xff, filesys->i_sb->s_blocksize);
+ memset(buf, 0xff, fs->blocksize);
unmap_dblock(b, buf);
set_bit(B_Valid, &b->b.flags);
LAFSI(im)->md.inodemap.size = bnum+1;
goto abort;
if (b->b.physaddr == 0 && !test_bit(B_Valid, &b->b.flags)) {
LAFSI(im)->md.inodemap.nextbit =
- (im->i_sb->s_blocksize<<3) + 1;
+ (fs->blocksize<<3) + 1;
goto retry;
}
err = lafs_read_block(b);
LAFSI(im)->md.inodemap.thisblock = bnum;
buf = map_dblock(b);
bit = find_next_bit((unsigned long *)buf,
- im->i_sb->s_blocksize<<3, bit);
+ fs->blocksize<<3, bit);
unmap_dblock(b, buf);
LAFSI(im)->md.inodemap.nextbit = bit+1;
- if (bit >= im->i_sb->s_blocksize<<3)
+ if (bit >= fs->blocksize<<3)
goto retry;
mutex_unlock(&im->i_mutex);
lafs_make_orphan(fs, db);
LAFSI(ino)->trunc_next = (i_size_read(ino) +
- ino->i_sb->s_blocksize - 1)
- >> ino->i_sb->s_blocksize_bits;
+ fs->blocksize - 1)
+ >> fs->blocksize_bits;
set_bit(I_Trunc, &LAFSI(ino)->iflags);
putdref(db, MKREF(trunc));
}
bdev = fs->devs[dev].sb->s_bdev;
return lafs_sync_page_io(bdev, sect, 0,
- blocks << fs->prime_sb->s_blocksize_bits,
+ blocks << fs->blocksize_bits,
p, 0) ? 0 : -EIO;
}
ac->state = 2; /* loading */
ac->fs = fs;
async_page_io(bdev, sect, 0,
- blocks << fs->prime_sb->s_blocksize_bits,
+ blocks << fs->blocksize_bits,
p, 0, ac);
return -EAGAIN;
}
bio->bi_bdev = bdev;
bio->bi_sector = sect;
- bio_add_page(bio, page, fs->prime_sb->s_blocksize, offset);
+ bio_add_page(bio, page, fs->blocksize, offset);
bio->bi_private = b;
bio->bi_end_io = block_loaded;
if (bio->bi_size == 0) {
bio->bi_sector = sect;
bio->bi_bdev = bdev;
- bio_add_page(bio, page, fs->prime_sb->s_blocksize, offset);
+ bio_add_page(bio, page, fs->blocksize, offset);
bio->bi_private = b;
bio->bi_end_io = blocks_loaded;
BUG_ON(!list_empty(&b->lru));
}
if (bio->bi_sector + (bio->bi_size / 512) != sect
|| bio->bi_bdev != bdev
- || bio_add_page(bio, page, fs->prime_sb->s_blocksize, offset) == 0)
+ || bio_add_page(bio, page, fs->blocksize, offset) == 0)
return -EINVAL;
/* added the block successfully */
headb = bio->bi_private;
if (bio && virt == wc->bio_virt &&
bio->bi_bdev == fs->devs[dev].sb->s_bdev &&
which == wc->bio_which &&
- bio_add_page(bio, p, fs->prime_sb->s_blocksize, offset) > 0) {
+ bio_add_page(bio, p, fs->blocksize, offset) > 0) {
/* Added the current bio - too easy */
wc->bio_virt++;
return;
wc->bio_which = which;
bio->bi_bdev = fs->devs[dev].sb->s_bdev;
bio->bi_sector = sect;
- bio_add_page(bio, p, fs->prime_sb->s_blocksize, offset);
+ bio_add_page(bio, p, fs->blocksize, offset);
bio->bi_private = wc;
bio->bi_end_io = lafs_cluster_endio_choose(which, head);
if (d < 0) return;
virt -= dv->start;
- virt <<= (fs->prime_sb->s_blocksize_bits - 9);
+ virt <<= (fs->blocksize_bits - 9);
virt += (dv->segment_offset)>>9;
*sectp = virt;
}
offset = LAFSI(ib->b.inode)->metadata_size;
else
offset = 0;
- len = fs->prime_sb->s_blocksize - offset;
+ len = fs->blocksize - offset;
current_layout = le16_to_cpu(*(u16 *)(ibuf+offset));
buf = ibuf + offset + 2;
offset = LAFSI(ib->b.inode)->metadata_size;
else
offset = 0;
- len = fs->prime_sb->s_blocksize - offset;
+ len = fs->blocksize - offset;
check_leaf(&leafinfo, ib->b.fileaddr, 0, len);
nbuf = map_iblock_2(new);
layout.data = nbuf;
layout.size = len;
- memset(nbuf, 0, fs->prime_sb->s_blocksize);
+ memset(nbuf, 0, fs->blocksize);
set_bit(B_Valid, &new->b.flags);
buf = ibuf + offset + 2;
offset = LAFSI(ib->b.inode)->metadata_size;
else
offset = 0;
- len = fs->prime_sb->s_blocksize - offset;
+ len = fs->blocksize - offset;
current_layout = le16_to_cpu(*(u16 *)(ibuf+offset));
buf = ibuf + offset + 2;
nbuf = map_iblock_2(new);
layout.data = nbuf;
layout.size = len;
- memset(nbuf, 0, fs->prime_sb->s_blocksize);
+ memset(nbuf, 0, fs->blocksize);
ok = walk_index(ib->b.fileaddr,
&buf, len-2, uninc,
int rv = 0;
char *buf;
struct uninc uit;
- int blocksize = fs->prime_sb->s_blocksize;
+ int blocksize = fs->blocksize;
LAFS_BUG(!test_bit(B_IOLock, &ib->b.flags), &ib->b);
u32 bnum;
int ent;
- bnum = slot >> (dfs->prime_sb->s_blocksize_bits-4);
+ bnum = slot >> (dfs->blocksize_bits-4);
ob = lafs_get_block(dfs->orphans, bnum, NULL, GFP_KERNEL,
MKREF(dumpo));
or = map_dblock(ob);
- ent = slot - (bnum << (dfs->prime_sb->s_blocksize_bits-4));
+ ent = slot - (bnum << (dfs->blocksize_bits-4));
printk("%3d: %d %u %u %u\n", slot,
or[ent].type, or[ent].filesys, or[ent].inum,
or[ent].addr);
#endif
mutex_lock_nested(&fs->orphans->i_mutex, I_MUTEX_QUOTA);
bnum = (om->nextfree + om->reserved) >>
- (fs->prime_sb->s_blocksize_bits-4);
+ (fs->blocksize_bits-4);
b = lafs_get_block(fs->orphans, bnum, NULL, GFP_KERNEL,
MKREF(orphan_reserve));
struct datablock *ob;
slot = om->nextfree;
- bnum = slot >> (fs->prime_sb->s_blocksize_bits-4);
+ bnum = slot >> (fs->blocksize_bits-4);
dprintk("slot=%d bnum=%d\n", slot, bnum);
ob = lafs_get_block(fs->orphans, bnum, NULL, GFP_KERNEL, MKREF(orphan));
/* that *must* succeed as we own a reference on the block already */
or = map_dblock(ob);
ent = b->orphan_slot - (ob->b.fileaddr
- << (fs->prime_sb->s_blocksize_bits-4));
+ << (fs->blocksize_bits-4));
or[ent].type = cpu_to_le32(1);
or[ent].filesys = cpu_to_le32(LAFSI(b->b.inode)->filesys->i_ino);
or[ent].inum = cpu_to_le32(b->b.inode->i_ino);
om->reserved--;
bnum = (om->nextfree + om->reserved) >>
- (fs->prime_sb->s_blocksize_bits-4);
+ (fs->blocksize_bits-4);
b = lafs_get_block(fs->orphans, bnum, NULL, GFP_KERNEL,
MKREF(orphanx));
/* Note that we now own two references to this block, one
* this block.
*/
if ((om->nextfree + om->reserved) <=
- (bnum << (fs->prime_sb->s_blocksize_bits-4))
+ (bnum << (fs->blocksize_bits-4))
)
lafs_erase_dblock(b);
if (lai->filetype >= TypeBase &&
lai->filetype != TypeDir &&
lai->depth == 0 &&
- mdsize > 1 && mdsize < fs->prime_sb->s_blocksize) {
+ mdsize > 1 && mdsize < fs->blocksize) {
u64 sz = le64_to_cpu(lai->metadata[0].file.size);
- if (sz <= fs->prime_sb->s_blocksize - mdsize)
+ if (sz <= fs->blocksize - mdsize)
err = roll_mini(fs, inum, bnum, -1, flg, 0, 0,
(int)sz,
page_address(p) + mdsize);
int i;
u64 baddr = addr;
int err;
- int blocksize = fs->prime_sb->s_blocksize;
+ int blocksize = fs->blocksize;
/* we "know" buf is big enough */
err = lafs_load_page(fs, p, addr, max/blocksize);
struct page *p, *pg;
char *buf;
int err;
- int blocksize = fs->prime_sb->s_blocksize;
+ int blocksize = fs->blocksize;
fs->phase = 1;
fs->qphase = 0;
INIT_HLIST_NODE(&new->hash);
dv = fs->devs + devnum;
addr = LAFSI(fs->ss[ssnum].root)->md.fs.usagetable * dv->tablesize;
- addr += segnum >> (fs->prime_sb->s_blocksize_bits-1);
+ addr += segnum >> (fs->blocksize_bits-1);
new->ssblk = lafs_get_block(dv->segsum, addr, NULL,
GFP_KERNEL,
MKREF(ss));
if (ssnum == 0)
new->youthblk = lafs_get_block(dv->segsum,
- segnum >> (fs->prime_sb->s_blocksize_bits-1),
+ segnum >> (fs->blocksize_bits-1),
NULL,
GFP_KERNEL,
MKREF(ssyouth));
u16 *b, *p;
b = map_dblock(ss->ssblk);
spin_lock(&fs->stable_lock);
- p = &b[ss->segnum & ((fs->prime_sb->s_blocksize-1)>>1)];
+ p = &b[ss->segnum & ((fs->blocksize-1)>>1)];
//BUG_ON(diff < 0 && le16_to_cpu(*p) < -diff);
if (diff < 0 && le16_to_cpu(*p) < -diff) {
printk("diff=%d p=%d segnum=%d\n", diff, le16_to_cpu(*p),
from = map_dblock(obl);
to = map_dblock_2(nbl);
- memcpy(to, from, fs->prime_sb->s_blocksize);
+ memcpy(to, from, fs->blocksize);
unmap_dblock_2(nbl, to);
unmap_dblock(obl, from);
lafs_dirty_dblock(nbl);
if (test_bit(FinalCheckpoint, &fs->fsstate) ||
(db &&
db->b.inode == fs->devs[*dev].segsum &&
- db->b.fileaddr == ((*seg) >> (fs->prime_sb->s_blocksize_bits
+ db->b.fileaddr == ((*seg) >> (fs->blocksize_bits
- 1)))) {
/* HACK youth_next should always be at least 0x8000 so that
* cleanable score differentiates well for new segments.
if (db) {
youthp = map_dblock(db);
- youthp[(*seg) & ((1 << (fs->prime_sb->s_blocksize_bits
+ youthp[(*seg) & ((1 << (fs->blocksize_bits
- 1)) - 1)]
= fs->youth_next;
unmap_dblock(db, youthp);
putdref(db, MKREF(youth));
db = lafs_get_block(fs->devs[*dev].segsum,
- (*seg) >> (fs->prime_sb->s_blocksize_bits
+ (*seg) >> (fs->blocksize_bits
- 1),
NULL, GFP_KERNEL,
MKREF(youth));
fs->free_blocks += fs->devs[ss->dev].segment_size;
spin_unlock(&fs->lock);
db = lafs_get_block(fs->devs[ss->dev].segsum,
- ss->segment >> (fs->prime_sb->s_blocksize_bits-1),
+ ss->segment >> (fs->blocksize_bits-1),
NULL, GFP_KERNEL | __GFP_NOFAIL,
MKREF(cleanfree));
err = lafs_read_block(db);
if (err == 0) {
u16 *b = map_dblock(db);
spin_lock(&fs->stable_lock);
- b[ss->segment & ((fs->prime_sb->s_blocksize-1)>>1)] = 0;
+ b[ss->segment & ((fs->blocksize-1)>>1)] = 0;
spin_unlock(&fs->stable_lock);
unmap_dblock(db, b);
lafs_dirty_dblock(db);
static void merge_usage(struct fs *fs, u16 *d)
{
u16 *u = fs->scan.free_usages;
- int segperblk = fs->prime_sb->s_blocksize / 2;
+ int segperblk = fs->blocksize / 2;
int i;
for (i = 0; i < segperblk; i++)
while (fs->scan.free_block >
(fs->devs[fs->scan.free_dev].segment_count
- >> (fs->prime_sb->s_blocksize_bits - 1))) {
+ >> (fs->blocksize_bits - 1))) {
fs->scan.free_dev++;
fs->scan.free_block = 0;
if (fs->scan.free_dev >= fs->devices) {
int i;
int firstseg;
- int segperblk = fs->prime_sb->s_blocksize / 2;
+ int segperblk = fs->blocksize / 2;
int segments = segperblk;
int segcount;
int blks;
break;
}
d = map_dblock(db);
- memcpy(fs->scan.free_usages, d, fs->prime_sb->s_blocksize);
+ memcpy(fs->scan.free_usages, d, fs->blocksize);
unmap_dblock(db, d);
/* Now add any free blocks */
u16 *yp = map_dblock(fs->scan.youth_db);
u16 *up = fs->scan.free_usages;
int i;
- int segperblk = fs->prime_sb->s_blocksize / 2;
+ int segperblk = fs->blocksize / 2;
int segments = segperblk;
int segcount = fs->devs[fs->scan.free_dev].segment_count;
int blks = segcount / segments;
u32 devices;
u32 statesize;
+ int blocksize, blocksize_bits;
int devs_loaded;
atomic_t sb_writes_pending;
lai->ablocks--;
else
ino->i_blocks -=
- 1 << (fs->prime_sb->s_blocksize_bits - 9);
+ 1 << (fs->blocksize_bits - 9);
}
spin_unlock(&ino->i_lock);
if (err)
return err;
- err = lafs_quota_allocate(fs, ino, diff * fs->prime_sb->s_blocksize);
+ err = lafs_quota_allocate(fs, ino, diff * fs->blocksize);
if (err) {
spin_lock(&lai->vfs_inode.i_lock);
lai->md.fs.ablocks_used -= diff;
lai = LAFSI(ino);
spin_lock(&ino->i_lock);
lai->ablocks += diff;
- ino->i_blocks += (blkcnt_t)diff << (fs->prime_sb->s_blocksize_bits - 9) ;
+ ino->i_blocks += (blkcnt_t)diff << (fs->blocksize_bits - 9) ;
spin_unlock(&ino->i_lock);
return 0;
fs->devices = op->devcnt;
fs->devs_loaded = fs->devices; /* FIXME use this or lose this */
fs->statesize = 1 << op->statebits;
+ fs->blocksize = 1 << op->blockbits;
+ fs->blocksize_bits = op->blockbits;
fs->nonlog_segment = le32_to_cpu(st->nonlog_segment);
fs->nonlog_dev = le16_to_cpu(st->nonlog_dev);
spin_lock(&root->vfs_inode.i_lock);
buf->f_type = 0x4C614654; /* "LaFS" */
- buf->f_bsize = de->d_inode->i_sb->s_blocksize;
+ buf->f_bsize = fs->blocksize;
buf->f_blocks = root->md.fs.blocks_allowed;
if (buf->f_blocks == 0) {
/* should subtract usage of all other filesystems...*/