Commit fe3c9239 authored by Brian Gerst's avatar Brian Gerst Committed by Linus Torvalds

[PATCH] struct super_block cleanup - affs

Seperates affs_sb_info from struct super_block.
parent e368ea0b
...@@ -246,7 +246,7 @@ affs_empty_dir(struct inode *inode) ...@@ -246,7 +246,7 @@ affs_empty_dir(struct inode *inode)
goto done; goto done;
retval = -ENOTEMPTY; retval = -ENOTEMPTY;
for (size = AFFS_SB->s_hashsize - 1; size >= 0; size--) for (size = AFFS_SB(sb)->s_hashsize - 1; size >= 0; size--)
if (AFFS_HEAD(bh)->table[size]) if (AFFS_HEAD(bh)->table[size])
goto not_empty; goto not_empty;
retval = 0; retval = 0;
...@@ -458,7 +458,7 @@ affs_error(struct super_block *sb, const char *function, const char *fmt, ...) ...@@ -458,7 +458,7 @@ affs_error(struct super_block *sb, const char *function, const char *fmt, ...)
if (!(sb->s_flags & MS_RDONLY)) if (!(sb->s_flags & MS_RDONLY))
printk(KERN_WARNING "AFFS: Remounting filesystem read-only\n"); printk(KERN_WARNING "AFFS: Remounting filesystem read-only\n");
sb->s_flags |= MS_RDONLY; sb->s_flags |= MS_RDONLY;
AFFS_SB->s_flags |= SF_READONLY; /* Don't allow to remount rw */ AFFS_SB(sb)->s_flags |= SF_READONLY; /* Don't allow to remount rw */
} }
void void
......
...@@ -53,14 +53,14 @@ affs_count_free_blocks(struct super_block *sb) ...@@ -53,14 +53,14 @@ affs_count_free_blocks(struct super_block *sb)
if (sb->s_flags & MS_RDONLY) if (sb->s_flags & MS_RDONLY)
return 0; return 0;
down(&AFFS_SB->s_bmlock); down(&AFFS_SB(sb)->s_bmlock);
bm = AFFS_SB->s_bitmap; bm = AFFS_SB(sb)->s_bitmap;
free = 0; free = 0;
for (i = AFFS_SB->s_bmap_count; i > 0; bm++, i--) for (i = AFFS_SB(sb)->s_bmap_count; i > 0; bm++, i--)
free += bm->bm_free; free += bm->bm_free;
up(&AFFS_SB->s_bmlock); up(&AFFS_SB(sb)->s_bmlock);
return free; return free;
} }
...@@ -68,6 +68,7 @@ affs_count_free_blocks(struct super_block *sb) ...@@ -68,6 +68,7 @@ affs_count_free_blocks(struct super_block *sb)
void void
affs_free_block(struct super_block *sb, u32 block) affs_free_block(struct super_block *sb, u32 block)
{ {
struct affs_sb_info *sbi = AFFS_SB(sb);
struct affs_bm_info *bm; struct affs_bm_info *bm;
struct buffer_head *bh; struct buffer_head *bh;
u32 blk, bmap, bit, mask, tmp; u32 blk, bmap, bit, mask, tmp;
...@@ -75,24 +76,24 @@ affs_free_block(struct super_block *sb, u32 block) ...@@ -75,24 +76,24 @@ affs_free_block(struct super_block *sb, u32 block)
pr_debug("AFFS: free_block(%u)\n", block); pr_debug("AFFS: free_block(%u)\n", block);
if (block > AFFS_SB->s_partition_size) if (block > sbi->s_partition_size)
goto err_range; goto err_range;
blk = block - AFFS_SB->s_reserved; blk = block - sbi->s_reserved;
bmap = blk / AFFS_SB->s_bmap_bits; bmap = blk / sbi->s_bmap_bits;
bit = blk % AFFS_SB->s_bmap_bits; bit = blk % sbi->s_bmap_bits;
bm = &AFFS_SB->s_bitmap[bmap]; bm = &sbi->s_bitmap[bmap];
down(&AFFS_SB->s_bmlock); down(&sbi->s_bmlock);
bh = AFFS_SB->s_bmap_bh; bh = sbi->s_bmap_bh;
if (AFFS_SB->s_last_bmap != bmap) { if (sbi->s_last_bmap != bmap) {
affs_brelse(bh); affs_brelse(bh);
bh = affs_bread(sb, bm->bm_key); bh = affs_bread(sb, bm->bm_key);
if (!bh) if (!bh)
goto err_bh_read; goto err_bh_read;
AFFS_SB->s_bmap_bh = bh; sbi->s_bmap_bh = bh;
AFFS_SB->s_last_bmap = bmap; sbi->s_last_bmap = bmap;
} }
mask = 1 << (bit & 31); mask = 1 << (bit & 31);
...@@ -112,19 +113,19 @@ affs_free_block(struct super_block *sb, u32 block) ...@@ -112,19 +113,19 @@ affs_free_block(struct super_block *sb, u32 block)
sb->s_dirt = 1; sb->s_dirt = 1;
bm->bm_free++; bm->bm_free++;
up(&AFFS_SB->s_bmlock); up(&sbi->s_bmlock);
return; return;
err_free: err_free:
affs_warning(sb,"affs_free_block","Trying to free block %u which is already free", block); affs_warning(sb,"affs_free_block","Trying to free block %u which is already free", block);
up(&AFFS_SB->s_bmlock); up(&sbi->s_bmlock);
return; return;
err_bh_read: err_bh_read:
affs_error(sb,"affs_free_block","Cannot read bitmap block %u", bm->bm_key); affs_error(sb,"affs_free_block","Cannot read bitmap block %u", bm->bm_key);
AFFS_SB->s_bmap_bh = NULL; sbi->s_bmap_bh = NULL;
AFFS_SB->s_last_bmap = ~0; sbi->s_last_bmap = ~0;
up(&AFFS_SB->s_bmlock); up(&sbi->s_bmlock);
return; return;
err_range: err_range:
...@@ -145,6 +146,7 @@ u32 ...@@ -145,6 +146,7 @@ u32
affs_alloc_block(struct inode *inode, u32 goal) affs_alloc_block(struct inode *inode, u32 goal)
{ {
struct super_block *sb; struct super_block *sb;
struct affs_sb_info *sbi;
struct affs_bm_info *bm; struct affs_bm_info *bm;
struct buffer_head *bh; struct buffer_head *bh;
u32 *data, *enddata; u32 *data, *enddata;
...@@ -152,6 +154,7 @@ affs_alloc_block(struct inode *inode, u32 goal) ...@@ -152,6 +154,7 @@ affs_alloc_block(struct inode *inode, u32 goal)
int i; int i;
sb = inode->i_sb; sb = inode->i_sb;
sbi = AFFS_SB(sb);
pr_debug("AFFS: balloc(inode=%lu,goal=%u): ", inode->i_ino, goal); pr_debug("AFFS: balloc(inode=%lu,goal=%u): ", inode->i_ino, goal);
...@@ -161,53 +164,53 @@ affs_alloc_block(struct inode *inode, u32 goal) ...@@ -161,53 +164,53 @@ affs_alloc_block(struct inode *inode, u32 goal)
return ++AFFS_I(inode)->i_lastalloc; return ++AFFS_I(inode)->i_lastalloc;
} }
if (!goal || goal > AFFS_SB->s_partition_size) { if (!goal || goal > sbi->s_partition_size) {
if (goal) if (goal)
affs_warning(sb, "affs_balloc", "invalid goal %d", goal); affs_warning(sb, "affs_balloc", "invalid goal %d", goal);
//if (!AFFS_I(inode)->i_last_block) //if (!AFFS_I(inode)->i_last_block)
// affs_warning(sb, "affs_balloc", "no last alloc block"); // affs_warning(sb, "affs_balloc", "no last alloc block");
goal = AFFS_SB->s_reserved; goal = sbi->s_reserved;
} }
blk = goal - AFFS_SB->s_reserved; blk = goal - sbi->s_reserved;
bmap = blk / AFFS_SB->s_bmap_bits; bmap = blk / sbi->s_bmap_bits;
bm = &AFFS_SB->s_bitmap[bmap]; bm = &sbi->s_bitmap[bmap];
down(&AFFS_SB->s_bmlock); down(&sbi->s_bmlock);
if (bm->bm_free) if (bm->bm_free)
goto find_bmap_bit; goto find_bmap_bit;
find_bmap: find_bmap:
/* search for the next bmap buffer with free bits */ /* search for the next bmap buffer with free bits */
i = AFFS_SB->s_bmap_count; i = sbi->s_bmap_count;
do { do {
bmap++; bmap++;
bm++; bm++;
if (bmap < AFFS_SB->s_bmap_count) if (bmap < sbi->s_bmap_count)
continue; continue;
/* restart search at zero */ /* restart search at zero */
bmap = 0; bmap = 0;
bm = AFFS_SB->s_bitmap; bm = sbi->s_bitmap;
if (--i <= 0) if (--i <= 0)
goto err_full; goto err_full;
} while (!bm->bm_free); } while (!bm->bm_free);
blk = bmap * AFFS_SB->s_bmap_bits; blk = bmap * sbi->s_bmap_bits;
find_bmap_bit: find_bmap_bit:
bh = AFFS_SB->s_bmap_bh; bh = sbi->s_bmap_bh;
if (AFFS_SB->s_last_bmap != bmap) { if (sbi->s_last_bmap != bmap) {
affs_brelse(bh); affs_brelse(bh);
bh = affs_bread(sb, bm->bm_key); bh = affs_bread(sb, bm->bm_key);
if (!bh) if (!bh)
goto err_bh_read; goto err_bh_read;
AFFS_SB->s_bmap_bh = bh; sbi->s_bmap_bh = bh;
AFFS_SB->s_last_bmap = bmap; sbi->s_last_bmap = bmap;
} }
/* find an unused block in this bitmap block */ /* find an unused block in this bitmap block */
bit = blk % AFFS_SB->s_bmap_bits; bit = blk % sbi->s_bmap_bits;
data = (u32 *)bh->b_data + bit / 32 + 1; data = (u32 *)bh->b_data + bit / 32 + 1;
enddata = (u32 *)((u8 *)bh->b_data + sb->s_blocksize); enddata = (u32 *)((u8 *)bh->b_data + sb->s_blocksize);
mask = ~0UL << (bit & 31); mask = ~0UL << (bit & 31);
...@@ -231,7 +234,7 @@ affs_alloc_block(struct inode *inode, u32 goal) ...@@ -231,7 +234,7 @@ affs_alloc_block(struct inode *inode, u32 goal)
find_bit: find_bit:
/* finally look for a free bit in the word */ /* finally look for a free bit in the word */
bit = ffs(tmp) - 1; bit = ffs(tmp) - 1;
blk += bit + AFFS_SB->s_reserved; blk += bit + sbi->s_reserved;
mask2 = mask = 1 << (bit & 31); mask2 = mask = 1 << (bit & 31);
AFFS_I(inode)->i_lastalloc = blk; AFFS_I(inode)->i_lastalloc = blk;
...@@ -253,18 +256,18 @@ affs_alloc_block(struct inode *inode, u32 goal) ...@@ -253,18 +256,18 @@ affs_alloc_block(struct inode *inode, u32 goal)
mark_buffer_dirty(bh); mark_buffer_dirty(bh);
sb->s_dirt = 1; sb->s_dirt = 1;
up(&AFFS_SB->s_bmlock); up(&sbi->s_bmlock);
pr_debug("%d\n", blk); pr_debug("%d\n", blk);
return blk; return blk;
err_bh_read: err_bh_read:
affs_error(sb,"affs_read_block","Cannot read bitmap block %u", bm->bm_key); affs_error(sb,"affs_read_block","Cannot read bitmap block %u", bm->bm_key);
AFFS_SB->s_bmap_bh = NULL; sbi->s_bmap_bh = NULL;
AFFS_SB->s_last_bmap = ~0; sbi->s_last_bmap = ~0;
err_full: err_full:
pr_debug("failed\n"); pr_debug("failed\n");
up(&AFFS_SB->s_bmlock); up(&sbi->s_bmlock);
return 0; return 0;
} }
...@@ -276,35 +279,36 @@ affs_init_bitmap(struct super_block *sb) ...@@ -276,35 +279,36 @@ affs_init_bitmap(struct super_block *sb)
u32 *bmap_blk; u32 *bmap_blk;
u32 size, blk, end, offset, mask; u32 size, blk, end, offset, mask;
int i, res = 0; int i, res = 0;
struct affs_sb_info *sbi = AFFS_SB(sb);
if (sb->s_flags & MS_RDONLY) if (sb->s_flags & MS_RDONLY)
return 0; return 0;
if (!AFFS_ROOT_TAIL(sb, AFFS_SB->s_root_bh)->bm_flag) { if (!AFFS_ROOT_TAIL(sb, sbi->s_root_bh)->bm_flag) {
printk(KERN_NOTICE "AFFS: Bitmap invalid - mounting %s read only\n", printk(KERN_NOTICE "AFFS: Bitmap invalid - mounting %s read only\n",
sb->s_id); sb->s_id);
sb->s_flags |= MS_RDONLY; sb->s_flags |= MS_RDONLY;
return 0; return 0;
} }
AFFS_SB->s_last_bmap = ~0; sbi->s_last_bmap = ~0;
AFFS_SB->s_bmap_bh = NULL; sbi->s_bmap_bh = NULL;
AFFS_SB->s_bmap_bits = sb->s_blocksize * 8 - 32; sbi->s_bmap_bits = sb->s_blocksize * 8 - 32;
AFFS_SB->s_bmap_count = (AFFS_SB->s_partition_size - AFFS_SB->s_reserved + sbi->s_bmap_count = (sbi->s_partition_size - sbi->s_reserved +
AFFS_SB->s_bmap_bits - 1) / AFFS_SB->s_bmap_bits; sbi->s_bmap_bits - 1) / sbi->s_bmap_bits;
size = AFFS_SB->s_bmap_count * sizeof(struct affs_bm_info); size = sbi->s_bmap_count * sizeof(struct affs_bm_info);
bm = AFFS_SB->s_bitmap = kmalloc(size, GFP_KERNEL); bm = sbi->s_bitmap = kmalloc(size, GFP_KERNEL);
if (!AFFS_SB->s_bitmap) { if (!sbi->s_bitmap) {
printk(KERN_ERR "AFFS: Bitmap allocation failed\n"); printk(KERN_ERR "AFFS: Bitmap allocation failed\n");
return 1; return 1;
} }
memset(AFFS_SB->s_bitmap, 0, size); memset(sbi->s_bitmap, 0, size);
bmap_blk = (u32 *)AFFS_SB->s_root_bh->b_data; bmap_blk = (u32 *)sbi->s_root_bh->b_data;
blk = sb->s_blocksize / 4 - 49; blk = sb->s_blocksize / 4 - 49;
end = blk + 25; end = blk + 25;
for (i = AFFS_SB->s_bmap_count; i > 0; bm++, i--) { for (i = sbi->s_bmap_count; i > 0; bm++, i--) {
affs_brelse(bh); affs_brelse(bh);
bm->bm_key = be32_to_cpu(bmap_blk[blk]); bm->bm_key = be32_to_cpu(bmap_blk[blk]);
...@@ -341,7 +345,7 @@ affs_init_bitmap(struct super_block *sb) ...@@ -341,7 +345,7 @@ affs_init_bitmap(struct super_block *sb)
end = sb->s_blocksize / 4 - 1; end = sb->s_blocksize / 4 - 1;
} }
offset = (AFFS_SB->s_partition_size - AFFS_SB->s_reserved) % AFFS_SB->s_bmap_bits; offset = (sbi->s_partition_size - sbi->s_reserved) % sbi->s_bmap_bits;
mask = ~(0xFFFFFFFFU << (offset & 31)); mask = ~(0xFFFFFFFFU << (offset & 31));
pr_debug("last word: %d %d %d\n", offset, offset / 32 + 1, mask); pr_debug("last word: %d %d %d\n", offset, offset / 32 + 1, mask);
offset = offset / 32 + 1; offset = offset / 32 + 1;
......
...@@ -122,7 +122,7 @@ affs_readdir(struct file *filp, void *dirent, filldir_t filldir) ...@@ -122,7 +122,7 @@ affs_readdir(struct file *filp, void *dirent, filldir_t filldir)
goto inside; goto inside;
hash_pos++; hash_pos++;
for (; hash_pos < AFFS_SB->s_hashsize; hash_pos++) { for (; hash_pos < AFFS_SB(sb)->s_hashsize; hash_pos++) {
ino = be32_to_cpu(AFFS_HEAD(dir_bh)->table[hash_pos]); ino = be32_to_cpu(AFFS_HEAD(dir_bh)->table[hash_pos]);
if (!ino) if (!ino)
continue; continue;
......
...@@ -350,8 +350,8 @@ affs_get_block(struct inode *inode, sector_t block, struct buffer_head *bh_resul ...@@ -350,8 +350,8 @@ affs_get_block(struct inode *inode, sector_t block, struct buffer_head *bh_resul
//lock cache //lock cache
affs_lock_ext(inode); affs_lock_ext(inode);
ext = block / AFFS_SB->s_hashsize; ext = block / AFFS_SB(sb)->s_hashsize;
block -= ext * AFFS_SB->s_hashsize; block -= ext * AFFS_SB(sb)->s_hashsize;
ext_bh = affs_get_extblock(inode, ext); ext_bh = affs_get_extblock(inode, ext);
if (IS_ERR(ext_bh)) if (IS_ERR(ext_bh))
goto err_ext; goto err_ext;
...@@ -362,7 +362,7 @@ affs_get_block(struct inode *inode, sector_t block, struct buffer_head *bh_resul ...@@ -362,7 +362,7 @@ affs_get_block(struct inode *inode, sector_t block, struct buffer_head *bh_resul
if (!blocknr) if (!blocknr)
goto err_alloc; goto err_alloc;
bh_result->b_state |= (1UL << BH_New); bh_result->b_state |= (1UL << BH_New);
AFFS_I(inode)->mmu_private += AFFS_SB->s_data_blksize; AFFS_I(inode)->mmu_private += AFFS_SB(sb)->s_data_blksize;
AFFS_I(inode)->i_blkcnt++; AFFS_I(inode)->i_blkcnt++;
/* store new block */ /* store new block */
...@@ -516,7 +516,7 @@ affs_do_readpage_ofs(struct file *file, struct page *page, unsigned from, unsign ...@@ -516,7 +516,7 @@ affs_do_readpage_ofs(struct file *file, struct page *page, unsigned from, unsign
pr_debug("AFFS: read_page(%u, %ld, %d, %d)\n", (u32)inode->i_ino, page->index, from, to); pr_debug("AFFS: read_page(%u, %ld, %d, %d)\n", (u32)inode->i_ino, page->index, from, to);
data = page_address(page); data = page_address(page);
bsize = AFFS_SB->s_data_blksize; bsize = AFFS_SB(sb)->s_data_blksize;
tmp = (page->index << PAGE_CACHE_SHIFT) + from; tmp = (page->index << PAGE_CACHE_SHIFT) + from;
bidx = tmp / bsize; bidx = tmp / bsize;
boff = tmp % bsize; boff = tmp % bsize;
...@@ -546,7 +546,7 @@ affs_extent_file_ofs(struct file *file, u32 newsize) ...@@ -546,7 +546,7 @@ affs_extent_file_ofs(struct file *file, u32 newsize)
u32 tmp; u32 tmp;
pr_debug("AFFS: extent_file(%u, %d)\n", (u32)inode->i_ino, newsize); pr_debug("AFFS: extent_file(%u, %d)\n", (u32)inode->i_ino, newsize);
bsize = AFFS_SB->s_data_blksize; bsize = AFFS_SB(sb)->s_data_blksize;
bh = NULL; bh = NULL;
size = inode->i_size; size = inode->i_size;
bidx = size / bsize; bidx = size / bsize;
...@@ -670,7 +670,7 @@ static int affs_commit_write_ofs(struct file *file, struct page *page, unsigned ...@@ -670,7 +670,7 @@ static int affs_commit_write_ofs(struct file *file, struct page *page, unsigned
int written; int written;
pr_debug("AFFS: commit_write(%u, %ld, %d, %d)\n", (u32)inode->i_ino, page->index, from, to); pr_debug("AFFS: commit_write(%u, %ld, %d, %d)\n", (u32)inode->i_ino, page->index, from, to);
bsize = AFFS_SB->s_data_blksize; bsize = AFFS_SB(sb)->s_data_blksize;
data = page_address(page); data = page_address(page);
bh = NULL; bh = NULL;
...@@ -811,8 +811,8 @@ affs_truncate(struct inode *inode) ...@@ -811,8 +811,8 @@ affs_truncate(struct inode *inode)
last_blk = 0; last_blk = 0;
ext = 0; ext = 0;
if (inode->i_size) { if (inode->i_size) {
last_blk = ((u32)inode->i_size - 1) / AFFS_SB->s_data_blksize; last_blk = ((u32)inode->i_size - 1) / AFFS_SB(sb)->s_data_blksize;
ext = last_blk / AFFS_SB->s_hashsize; ext = last_blk / AFFS_SB(sb)->s_hashsize;
} }
if (inode->i_size > AFFS_I(inode)->mmu_private) { if (inode->i_size > AFFS_I(inode)->mmu_private) {
...@@ -857,11 +857,11 @@ affs_truncate(struct inode *inode) ...@@ -857,11 +857,11 @@ affs_truncate(struct inode *inode)
i = 0; i = 0;
blk = last_blk; blk = last_blk;
if (inode->i_size) { if (inode->i_size) {
i = last_blk % AFFS_SB->s_hashsize + 1; i = last_blk % AFFS_SB(sb)->s_hashsize + 1;
blk++; blk++;
} else } else
AFFS_HEAD(ext_bh)->first_data = 0; AFFS_HEAD(ext_bh)->first_data = 0;
size = AFFS_SB->s_hashsize; size = AFFS_SB(sb)->s_hashsize;
if (size > blkcnt - blk + i) if (size > blkcnt - blk + i)
size = blkcnt - blk + i; size = blkcnt - blk + i;
for (; i < size; i++, blk++) { for (; i < size; i++, blk++) {
...@@ -885,7 +885,7 @@ affs_truncate(struct inode *inode) ...@@ -885,7 +885,7 @@ affs_truncate(struct inode *inode)
while (ext_key) { while (ext_key) {
ext_bh = affs_bread(sb, ext_key); ext_bh = affs_bread(sb, ext_key);
size = AFFS_SB->s_hashsize; size = AFFS_SB(sb)->s_hashsize;
if (size > blkcnt - blk) if (size > blkcnt - blk)
size = blkcnt - blk; size = blkcnt - blk;
for (i = 0; i < size; i++, blk++) for (i = 0; i < size; i++, blk++)
......
...@@ -38,6 +38,7 @@ void ...@@ -38,6 +38,7 @@ void
affs_read_inode(struct inode *inode) affs_read_inode(struct inode *inode)
{ {
struct super_block *sb = inode->i_sb; struct super_block *sb = inode->i_sb;
struct affs_sb_info *sbi = AFFS_SB(sb);
struct buffer_head *bh; struct buffer_head *bh;
struct affs_head *head; struct affs_head *head;
struct affs_tail *tail; struct affs_tail *tail;
...@@ -83,35 +84,35 @@ affs_read_inode(struct inode *inode) ...@@ -83,35 +84,35 @@ affs_read_inode(struct inode *inode)
AFFS_I(inode)->i_lastalloc = 0; AFFS_I(inode)->i_lastalloc = 0;
AFFS_I(inode)->i_pa_cnt = 0; AFFS_I(inode)->i_pa_cnt = 0;
if (AFFS_SB->s_flags & SF_SETMODE) if (sbi->s_flags & SF_SETMODE)
inode->i_mode = AFFS_SB->s_mode; inode->i_mode = sbi->s_mode;
else else
inode->i_mode = prot_to_mode(prot); inode->i_mode = prot_to_mode(prot);
id = be16_to_cpu(tail->uid); id = be16_to_cpu(tail->uid);
if (id == 0 || AFFS_SB->s_flags & SF_SETUID) if (id == 0 || sbi->s_flags & SF_SETUID)
inode->i_uid = AFFS_SB->s_uid; inode->i_uid = sbi->s_uid;
else if (id == 0xFFFF && AFFS_SB->s_flags & SF_MUFS) else if (id == 0xFFFF && sbi->s_flags & SF_MUFS)
inode->i_uid = 0; inode->i_uid = 0;
else else
inode->i_uid = id; inode->i_uid = id;
id = be16_to_cpu(tail->gid); id = be16_to_cpu(tail->gid);
if (id == 0 || AFFS_SB->s_flags & SF_SETGID) if (id == 0 || sbi->s_flags & SF_SETGID)
inode->i_gid = AFFS_SB->s_gid; inode->i_gid = sbi->s_gid;
else if (id == 0xFFFF && AFFS_SB->s_flags & SF_MUFS) else if (id == 0xFFFF && sbi->s_flags & SF_MUFS)
inode->i_gid = 0; inode->i_gid = 0;
else else
inode->i_gid = id; inode->i_gid = id;
switch (be32_to_cpu(tail->stype)) { switch (be32_to_cpu(tail->stype)) {
case ST_ROOT: case ST_ROOT:
inode->i_uid = AFFS_SB->s_uid; inode->i_uid = sbi->s_uid;
inode->i_gid = AFFS_SB->s_gid; inode->i_gid = sbi->s_gid;
/* fall through */ /* fall through */
case ST_USERDIR: case ST_USERDIR:
if (be32_to_cpu(tail->stype) == ST_USERDIR || if (be32_to_cpu(tail->stype) == ST_USERDIR ||
AFFS_SB->s_flags & SF_SETMODE) { sbi->s_flags & SF_SETMODE) {
if (inode->i_mode & S_IRUSR) if (inode->i_mode & S_IRUSR)
inode->i_mode |= S_IXUSR; inode->i_mode |= S_IXUSR;
if (inode->i_mode & S_IRGRP) if (inode->i_mode & S_IRGRP)
...@@ -147,13 +148,13 @@ affs_read_inode(struct inode *inode) ...@@ -147,13 +148,13 @@ affs_read_inode(struct inode *inode)
AFFS_I(inode)->mmu_private = inode->i_size = size; AFFS_I(inode)->mmu_private = inode->i_size = size;
if (inode->i_size) { if (inode->i_size) {
AFFS_I(inode)->i_blkcnt = (size - 1) / AFFS_I(inode)->i_blkcnt = (size - 1) /
AFFS_SB->s_data_blksize + 1; sbi->s_data_blksize + 1;
AFFS_I(inode)->i_extcnt = (AFFS_I(inode)->i_blkcnt - 1) / AFFS_I(inode)->i_extcnt = (AFFS_I(inode)->i_blkcnt - 1) /
AFFS_SB->s_hashsize + 1; sbi->s_hashsize + 1;
} }
if (tail->link_chain) if (tail->link_chain)
inode->i_nlink = 2; inode->i_nlink = 2;
inode->i_mapping->a_ops = (AFFS_SB->s_flags & SF_OFS) ? &affs_aops_ofs : &affs_aops; inode->i_mapping->a_ops = (sbi->s_flags & SF_OFS) ? &affs_aops_ofs : &affs_aops;
inode->i_op = &affs_file_inode_operations; inode->i_op = &affs_file_inode_operations;
inode->i_fop = &affs_file_operations; inode->i_fop = &affs_file_operations;
break; break;
...@@ -207,18 +208,18 @@ affs_write_inode(struct inode *inode, int unused) ...@@ -207,18 +208,18 @@ affs_write_inode(struct inode *inode, int unused)
tail->protect = cpu_to_be32(AFFS_I(inode)->i_protect); tail->protect = cpu_to_be32(AFFS_I(inode)->i_protect);
tail->size = cpu_to_be32(inode->i_size); tail->size = cpu_to_be32(inode->i_size);
secs_to_datestamp(inode->i_mtime,&tail->change); secs_to_datestamp(inode->i_mtime,&tail->change);
if (!(inode->i_ino == AFFS_SB->s_root_block)) { if (!(inode->i_ino == AFFS_SB(sb)->s_root_block)) {
uid = inode->i_uid; uid = inode->i_uid;
gid = inode->i_gid; gid = inode->i_gid;
if (sb->u.affs_sb.s_flags & SF_MUFS) { if (AFFS_SB(sb)->s_flags & SF_MUFS) {
if (inode->i_uid == 0 || inode->i_uid == 0xFFFF) if (inode->i_uid == 0 || inode->i_uid == 0xFFFF)
uid = inode->i_uid ^ ~0; uid = inode->i_uid ^ ~0;
if (inode->i_gid == 0 || inode->i_gid == 0xFFFF) if (inode->i_gid == 0 || inode->i_gid == 0xFFFF)
gid = inode->i_gid ^ ~0; gid = inode->i_gid ^ ~0;
} }
if (!(sb->u.affs_sb.s_flags & SF_SETUID)) if (!(AFFS_SB(sb)->s_flags & SF_SETUID))
tail->uid = cpu_to_be16(uid); tail->uid = cpu_to_be16(uid);
if (!(sb->u.affs_sb.s_flags & SF_SETGID)) if (!(AFFS_SB(sb)->s_flags & SF_SETGID))
tail->gid = cpu_to_be16(gid); tail->gid = cpu_to_be16(gid);
} }
} }
...@@ -240,11 +241,11 @@ affs_notify_change(struct dentry *dentry, struct iattr *attr) ...@@ -240,11 +241,11 @@ affs_notify_change(struct dentry *dentry, struct iattr *attr)
if (error) if (error)
goto out; goto out;
if (((attr->ia_valid & ATTR_UID) && (inode->i_sb->u.affs_sb.s_flags & SF_SETUID)) || if (((attr->ia_valid & ATTR_UID) && (AFFS_SB(inode->i_sb)->s_flags & SF_SETUID)) ||
((attr->ia_valid & ATTR_GID) && (inode->i_sb->u.affs_sb.s_flags & SF_SETGID)) || ((attr->ia_valid & ATTR_GID) && (AFFS_SB(inode->i_sb)->s_flags & SF_SETGID)) ||
((attr->ia_valid & ATTR_MODE) && ((attr->ia_valid & ATTR_MODE) &&
(inode->i_sb->u.affs_sb.s_flags & (SF_SETMODE | SF_IMMUTABLE)))) { (AFFS_SB(inode->i_sb)->s_flags & (SF_SETMODE | SF_IMMUTABLE)))) {
if (!(inode->i_sb->u.affs_sb.s_flags & SF_QUIET)) if (!(AFFS_SB(inode->i_sb)->s_flags & SF_QUIET))
error = -EPERM; error = -EPERM;
goto out; goto out;
} }
......
...@@ -64,7 +64,7 @@ affs_intl_toupper(int ch) ...@@ -64,7 +64,7 @@ affs_intl_toupper(int ch)
static inline toupper_t static inline toupper_t
affs_get_toupper(struct super_block *sb) affs_get_toupper(struct super_block *sb)
{ {
return AFFS_SB->s_flags & SF_INTL ? affs_intl_toupper : affs_toupper; return AFFS_SB(sb)->s_flags & SF_INTL ? affs_intl_toupper : affs_toupper;
} }
/* /*
...@@ -177,7 +177,7 @@ affs_hash_name(struct super_block *sb, const u8 *name, unsigned int len) ...@@ -177,7 +177,7 @@ affs_hash_name(struct super_block *sb, const u8 *name, unsigned int len)
for (; len > 0; len--) for (; len > 0; len--)
hash = (hash * 13 + toupper(*name++)) & 0x7ff; hash = (hash * 13 + toupper(*name++)) & 0x7ff;
return hash % AFFS_SB->s_hashsize; return hash % AFFS_SB(sb)->s_hashsize;
} }
static struct buffer_head * static struct buffer_head *
...@@ -244,7 +244,7 @@ affs_lookup(struct inode *dir, struct dentry *dentry) ...@@ -244,7 +244,7 @@ affs_lookup(struct inode *dir, struct dentry *dentry)
return ERR_PTR(-EACCES); return ERR_PTR(-EACCES);
} }
} }
dentry->d_op = AFFS_SB->s_flags & SF_INTL ? &affs_intl_dentry_operations : &affs_dentry_operations; dentry->d_op = AFFS_SB(sb)->s_flags & SF_INTL ? &affs_intl_dentry_operations : &affs_dentry_operations;
unlock_kernel(); unlock_kernel();
d_add(dentry, inode); d_add(dentry, inode);
return NULL; return NULL;
...@@ -289,7 +289,7 @@ affs_create(struct inode *dir, struct dentry *dentry, int mode) ...@@ -289,7 +289,7 @@ affs_create(struct inode *dir, struct dentry *dentry, int mode)
inode->i_op = &affs_file_inode_operations; inode->i_op = &affs_file_inode_operations;
inode->i_fop = &affs_file_operations; inode->i_fop = &affs_file_operations;
inode->i_mapping->a_ops = (AFFS_SB->s_flags & SF_OFS) ? &affs_aops_ofs : &affs_aops; inode->i_mapping->a_ops = (AFFS_SB(sb)->s_flags & SF_OFS) ? &affs_aops_ofs : &affs_aops;
error = affs_add_entry(dir, inode, dentry, ST_FILE); error = affs_add_entry(dir, inode, dentry, ST_FILE);
if (error) { if (error) {
inode->i_nlink = 0; inode->i_nlink = 0;
...@@ -367,7 +367,7 @@ affs_symlink(struct inode *dir, struct dentry *dentry, const char *symname) ...@@ -367,7 +367,7 @@ affs_symlink(struct inode *dir, struct dentry *dentry, const char *symname)
(int)dentry->d_name.len,dentry->d_name.name,symname); (int)dentry->d_name.len,dentry->d_name.name,symname);
lock_kernel(); lock_kernel();
maxlen = AFFS_SB->s_hashsize * sizeof(u32) - 1; maxlen = AFFS_SB(sb)->s_hashsize * sizeof(u32) - 1;
error = -ENOSPC; error = -ENOSPC;
inode = affs_new_inode(dir); inode = affs_new_inode(dir);
if (!inode) { if (!inode) {
...@@ -390,8 +390,8 @@ affs_symlink(struct inode *dir, struct dentry *dentry, const char *symname) ...@@ -390,8 +390,8 @@ affs_symlink(struct inode *dir, struct dentry *dentry, const char *symname)
if (*symname == '/') { if (*symname == '/') {
while (*symname == '/') while (*symname == '/')
symname++; symname++;
while (AFFS_SB->s_volume[i]) /* Cannot overflow */ while (AFFS_SB(sb)->s_volume[i]) /* Cannot overflow */
*p++ = AFFS_SB->s_volume[i++]; *p++ = AFFS_SB(sb)->s_volume[i++];
} }
while (i < maxlen && (c = *symname++)) { while (i < maxlen && (c = *symname++)) {
if (c == '.' && lc == '/' && *symname == '.' && symname[1] == '/') { if (c == '.' && lc == '/' && *symname == '.' && symname[1] == '/') {
......
...@@ -38,21 +38,25 @@ static int affs_remount (struct super_block *sb, int *flags, char *data); ...@@ -38,21 +38,25 @@ static int affs_remount (struct super_block *sb, int *flags, char *data);
static void static void
affs_put_super(struct super_block *sb) affs_put_super(struct super_block *sb)
{ {
struct affs_sb_info *sbi = AFFS_SB(sb);
pr_debug("AFFS: put_super()\n"); pr_debug("AFFS: put_super()\n");
if (!(sb->s_flags & MS_RDONLY)) { if (!(sb->s_flags & MS_RDONLY)) {
AFFS_ROOT_TAIL(sb, AFFS_SB->s_root_bh)->bm_flag = be32_to_cpu(1); AFFS_ROOT_TAIL(sb, sbi->s_root_bh)->bm_flag = be32_to_cpu(1);
secs_to_datestamp(CURRENT_TIME, secs_to_datestamp(CURRENT_TIME,
&AFFS_ROOT_TAIL(sb, AFFS_SB->s_root_bh)->disk_change); &AFFS_ROOT_TAIL(sb, sbi->s_root_bh)->disk_change);
affs_fix_checksum(sb, AFFS_SB->s_root_bh); affs_fix_checksum(sb, sbi->s_root_bh);
mark_buffer_dirty(AFFS_SB->s_root_bh); mark_buffer_dirty(sbi->s_root_bh);
} }
affs_brelse(AFFS_SB->s_bmap_bh); affs_brelse(sbi->s_bmap_bh);
if (AFFS_SB->s_prefix) if (sbi->s_prefix)
kfree(AFFS_SB->s_prefix); kfree(sbi->s_prefix);
kfree(AFFS_SB->s_bitmap); kfree(sbi->s_bitmap);
affs_brelse(AFFS_SB->s_root_bh); affs_brelse(sbi->s_root_bh);
kfree(sbi);
sb->u.generic_sbp = NULL;
return; return;
} }
...@@ -61,16 +65,17 @@ static void ...@@ -61,16 +65,17 @@ static void
affs_write_super(struct super_block *sb) affs_write_super(struct super_block *sb)
{ {
int clean = 2; int clean = 2;
struct affs_sb_info *sbi = AFFS_SB(sb);
if (!(sb->s_flags & MS_RDONLY)) { if (!(sb->s_flags & MS_RDONLY)) {
// if (AFFS_SB->s_bitmap[i].bm_bh) { // if (sbi->s_bitmap[i].bm_bh) {
// if (buffer_dirty(AFFS_SB->s_bitmap[i].bm_bh)) { // if (buffer_dirty(sbi->s_bitmap[i].bm_bh)) {
// clean = 0; // clean = 0;
AFFS_ROOT_TAIL(sb, AFFS_SB->s_root_bh)->bm_flag = be32_to_cpu(clean); AFFS_ROOT_TAIL(sb, sbi->s_root_bh)->bm_flag = be32_to_cpu(clean);
secs_to_datestamp(CURRENT_TIME, secs_to_datestamp(CURRENT_TIME,
&AFFS_ROOT_TAIL(sb, AFFS_SB->s_root_bh)->disk_change); &AFFS_ROOT_TAIL(sb, sbi->s_root_bh)->disk_change);
affs_fix_checksum(sb, AFFS_SB->s_root_bh); affs_fix_checksum(sb, sbi->s_root_bh);
mark_buffer_dirty(AFFS_SB->s_root_bh); mark_buffer_dirty(sbi->s_root_bh);
sb->s_dirt = !clean; /* redo until bitmap synced */ sb->s_dirt = !clean; /* redo until bitmap synced */
} else } else
sb->s_dirt = 0; sb->s_dirt = 0;
...@@ -267,6 +272,7 @@ parse_options(char *options, uid_t *uid, gid_t *gid, int *mode, int *reserved, s ...@@ -267,6 +272,7 @@ parse_options(char *options, uid_t *uid, gid_t *gid, int *mode, int *reserved, s
static int affs_fill_super(struct super_block *sb, void *data, int silent) static int affs_fill_super(struct super_block *sb, void *data, int silent)
{ {
struct affs_sb_info *sbi;
struct buffer_head *root_bh = NULL; struct buffer_head *root_bh = NULL;
struct buffer_head *boot_bh; struct buffer_head *boot_bh;
struct inode *root_inode = NULL; struct inode *root_inode = NULL;
...@@ -285,22 +291,27 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -285,22 +291,27 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent)
sb->s_magic = AFFS_SUPER_MAGIC; sb->s_magic = AFFS_SUPER_MAGIC;
sb->s_op = &affs_sops; sb->s_op = &affs_sops;
memset(AFFS_SB, 0, sizeof(struct affs_sb_info));
init_MUTEX(&AFFS_SB->s_bmlock); sbi = kmalloc(sizeof(struct affs_sb_info), GFP_KERNEL);
if (!sbi)
return -ENOMEM;
sb->u.generic_sbp = sbi;
memset(sbi, 0, sizeof(struct affs_sb_info));
init_MUTEX(&sbi->s_bmlock);
if (!parse_options(data,&uid,&gid,&i,&reserved,&root_block, if (!parse_options(data,&uid,&gid,&i,&reserved,&root_block,
&blocksize,&AFFS_SB->s_prefix, &blocksize,&sbi->s_prefix,
AFFS_SB->s_volume, &mount_flags)) { sbi->s_volume, &mount_flags)) {
printk(KERN_ERR "AFFS: Error parsing options\n"); printk(KERN_ERR "AFFS: Error parsing options\n");
return -EINVAL; return -EINVAL;
} }
/* N.B. after this point s_prefix must be released */ /* N.B. after this point s_prefix must be released */
AFFS_SB->s_flags = mount_flags; sbi->s_flags = mount_flags;
AFFS_SB->s_mode = i; sbi->s_mode = i;
AFFS_SB->s_uid = uid; sbi->s_uid = uid;
AFFS_SB->s_gid = gid; sbi->s_gid = gid;
AFFS_SB->s_reserved= reserved; sbi->s_reserved= reserved;
/* Get the size of the device in 512-byte blocks. /* Get the size of the device in 512-byte blocks.
* If we later see that the partition uses bigger * If we later see that the partition uses bigger
...@@ -320,12 +331,12 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -320,12 +331,12 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent)
size = size / (blocksize / 512); size = size / (blocksize / 512);
} }
for (blocksize = i, key = 0; blocksize <= j; blocksize <<= 1, size >>= 1) { for (blocksize = i, key = 0; blocksize <= j; blocksize <<= 1, size >>= 1) {
AFFS_SB->s_root_block = root_block; sbi->s_root_block = root_block;
if (root_block < 0) if (root_block < 0)
AFFS_SB->s_root_block = (reserved + size - 1) / 2; sbi->s_root_block = (reserved + size - 1) / 2;
pr_debug("AFFS: setting blocksize to %d\n", blocksize); pr_debug("AFFS: setting blocksize to %d\n", blocksize);
affs_set_blocksize(sb, blocksize); affs_set_blocksize(sb, blocksize);
AFFS_SB->s_partition_size = size; sbi->s_partition_size = size;
/* The root block location that was calculated above is not /* The root block location that was calculated above is not
* correct if the partition size is an odd number of 512- * correct if the partition size is an odd number of 512-
...@@ -341,16 +352,16 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -341,16 +352,16 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent)
pr_debug("AFFS: Dev %s, trying root=%u, bs=%d, " pr_debug("AFFS: Dev %s, trying root=%u, bs=%d, "
"size=%d, reserved=%d\n", "size=%d, reserved=%d\n",
sb->s_id, sb->s_id,
AFFS_SB->s_root_block + num_bm, sbi->s_root_block + num_bm,
blocksize, size, reserved); blocksize, size, reserved);
root_bh = affs_bread(sb, AFFS_SB->s_root_block + num_bm); root_bh = affs_bread(sb, sbi->s_root_block + num_bm);
if (!root_bh) if (!root_bh)
continue; continue;
if (!affs_checksum_block(sb, root_bh) && if (!affs_checksum_block(sb, root_bh) &&
be32_to_cpu(AFFS_ROOT_HEAD(root_bh)->ptype) == T_SHORT && be32_to_cpu(AFFS_ROOT_HEAD(root_bh)->ptype) == T_SHORT &&
be32_to_cpu(AFFS_ROOT_TAIL(sb, root_bh)->stype) == ST_ROOT) { be32_to_cpu(AFFS_ROOT_TAIL(sb, root_bh)->stype) == ST_ROOT) {
AFFS_SB->s_hashsize = blocksize / 4 - 56; sbi->s_hashsize = blocksize / 4 - 56;
AFFS_SB->s_root_block += num_bm; sbi->s_root_block += num_bm;
key = 1; key = 1;
goto got_root; goto got_root;
} }
...@@ -365,7 +376,7 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -365,7 +376,7 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent)
/* N.B. after this point bh must be released */ /* N.B. after this point bh must be released */
got_root: got_root:
root_block = AFFS_SB->s_root_block; root_block = sbi->s_root_block;
/* Find out which kind of FS we have */ /* Find out which kind of FS we have */
boot_bh = sb_bread(sb, 0); boot_bh = sb_bread(sb, 0);
...@@ -385,36 +396,36 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -385,36 +396,36 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent)
printk(KERN_NOTICE "AFFS: Dircache FS - mounting %s read only\n", printk(KERN_NOTICE "AFFS: Dircache FS - mounting %s read only\n",
sb->s_id); sb->s_id);
sb->s_flags |= MS_RDONLY; sb->s_flags |= MS_RDONLY;
AFFS_SB->s_flags |= SF_READONLY; sbi->s_flags |= SF_READONLY;
} }
switch (chksum) { switch (chksum) {
case MUFS_FS: case MUFS_FS:
case MUFS_INTLFFS: case MUFS_INTLFFS:
case MUFS_DCFFS: case MUFS_DCFFS:
AFFS_SB->s_flags |= SF_MUFS; sbi->s_flags |= SF_MUFS;
/* fall thru */ /* fall thru */
case FS_INTLFFS: case FS_INTLFFS:
case FS_DCFFS: case FS_DCFFS:
AFFS_SB->s_flags |= SF_INTL; sbi->s_flags |= SF_INTL;
break; break;
case MUFS_FFS: case MUFS_FFS:
AFFS_SB->s_flags |= SF_MUFS; sbi->s_flags |= SF_MUFS;
break; break;
case FS_FFS: case FS_FFS:
break; break;
case MUFS_OFS: case MUFS_OFS:
AFFS_SB->s_flags |= SF_MUFS; sbi->s_flags |= SF_MUFS;
/* fall thru */ /* fall thru */
case FS_OFS: case FS_OFS:
AFFS_SB->s_flags |= SF_OFS; sbi->s_flags |= SF_OFS;
sb->s_flags |= MS_NOEXEC; sb->s_flags |= MS_NOEXEC;
break; break;
case MUFS_DCOFS: case MUFS_DCOFS:
case MUFS_INTLOFS: case MUFS_INTLOFS:
AFFS_SB->s_flags |= SF_MUFS; sbi->s_flags |= SF_MUFS;
case FS_DCOFS: case FS_DCOFS:
case FS_INTLOFS: case FS_INTLOFS:
AFFS_SB->s_flags |= SF_INTL | SF_OFS; sbi->s_flags |= SF_INTL | SF_OFS;
sb->s_flags |= MS_NOEXEC; sb->s_flags |= MS_NOEXEC;
break; break;
default: default:
...@@ -433,12 +444,12 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -433,12 +444,12 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent)
sb->s_flags |= MS_NODEV | MS_NOSUID; sb->s_flags |= MS_NODEV | MS_NOSUID;
AFFS_SB->s_data_blksize = sb->s_blocksize; sbi->s_data_blksize = sb->s_blocksize;
if (AFFS_SB->s_flags & SF_OFS) if (sbi->s_flags & SF_OFS)
AFFS_SB->s_data_blksize -= 24; sbi->s_data_blksize -= 24;
/* Keep super block in cache */ /* Keep super block in cache */
AFFS_SB->s_root_bh = root_bh; sbi->s_root_bh = root_bh;
/* N.B. after this point s_root_bh must be released */ /* N.B. after this point s_root_bh must be released */
if (affs_init_bitmap(sb)) if (affs_init_bitmap(sb))
...@@ -463,17 +474,20 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -463,17 +474,20 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent)
out_error: out_error:
if (root_inode) if (root_inode)
iput(root_inode); iput(root_inode);
if (AFFS_SB->s_bitmap) if (sbi->s_bitmap)
kfree(AFFS_SB->s_bitmap); kfree(sbi->s_bitmap);
affs_brelse(root_bh); affs_brelse(root_bh);
if (AFFS_SB->s_prefix) if (sbi->s_prefix)
kfree(AFFS_SB->s_prefix); kfree(sbi->s_prefix);
kfree(sbi);
sb->u.generic_sbp = NULL;
return -EINVAL; return -EINVAL;
} }
static int static int
affs_remount(struct super_block *sb, int *flags, char *data) affs_remount(struct super_block *sb, int *flags, char *data)
{ {
struct affs_sb_info *sbi = AFFS_SB(sb);
int blocksize; int blocksize;
uid_t uid; uid_t uid;
gid_t gid; gid_t gid;
...@@ -481,17 +495,17 @@ affs_remount(struct super_block *sb, int *flags, char *data) ...@@ -481,17 +495,17 @@ affs_remount(struct super_block *sb, int *flags, char *data)
int reserved; int reserved;
int root_block; int root_block;
unsigned long mount_flags; unsigned long mount_flags;
unsigned long read_only = AFFS_SB->s_flags & SF_READONLY; unsigned long read_only = sbi->s_flags & SF_READONLY;
pr_debug("AFFS: remount(flags=0x%x,opts=\"%s\")\n",*flags,data); pr_debug("AFFS: remount(flags=0x%x,opts=\"%s\")\n",*flags,data);
if (!parse_options(data,&uid,&gid,&mode,&reserved,&root_block, if (!parse_options(data,&uid,&gid,&mode,&reserved,&root_block,
&blocksize,&AFFS_SB->s_prefix,AFFS_SB->s_volume,&mount_flags)) &blocksize,&sbi->s_prefix,sbi->s_volume,&mount_flags))
return -EINVAL; return -EINVAL;
AFFS_SB->s_flags = mount_flags | read_only; sbi->s_flags = mount_flags | read_only;
AFFS_SB->s_mode = mode; sbi->s_mode = mode;
AFFS_SB->s_uid = uid; sbi->s_uid = uid;
AFFS_SB->s_gid = gid; sbi->s_gid = gid;
if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
return 0; return 0;
...@@ -500,7 +514,7 @@ affs_remount(struct super_block *sb, int *flags, char *data) ...@@ -500,7 +514,7 @@ affs_remount(struct super_block *sb, int *flags, char *data)
while (sb->s_dirt) while (sb->s_dirt)
affs_write_super(sb); affs_write_super(sb);
sb->s_flags |= MS_RDONLY; sb->s_flags |= MS_RDONLY;
} else if (!(AFFS_SB->s_flags & SF_READONLY)) { } else if (!(sbi->s_flags & SF_READONLY)) {
sb->s_flags &= ~MS_RDONLY; sb->s_flags &= ~MS_RDONLY;
} else { } else {
affs_warning(sb,"remount","Cannot remount fs read/write because of errors"); affs_warning(sb,"remount","Cannot remount fs read/write because of errors");
...@@ -514,13 +528,13 @@ affs_statfs(struct super_block *sb, struct statfs *buf) ...@@ -514,13 +528,13 @@ affs_statfs(struct super_block *sb, struct statfs *buf)
{ {
int free; int free;
pr_debug("AFFS: statfs() partsize=%d, reserved=%d\n",AFFS_SB->s_partition_size, pr_debug("AFFS: statfs() partsize=%d, reserved=%d\n",AFFS_SB(sb)->s_partition_size,
AFFS_SB->s_reserved); AFFS_SB(sb)->s_reserved);
free = affs_count_free_blocks(sb); free = affs_count_free_blocks(sb);
buf->f_type = AFFS_SUPER_MAGIC; buf->f_type = AFFS_SUPER_MAGIC;
buf->f_bsize = sb->s_blocksize; buf->f_bsize = sb->s_blocksize;
buf->f_blocks = AFFS_SB->s_partition_size - AFFS_SB->s_reserved; buf->f_blocks = AFFS_SB(sb)->s_partition_size - AFFS_SB(sb)->s_reserved;
buf->f_bfree = free; buf->f_bfree = free;
buf->f_bavail = free; buf->f_bavail = free;
return 0; return 0;
......
...@@ -40,7 +40,7 @@ static int affs_symlink_readpage(struct file *file, struct page *page) ...@@ -40,7 +40,7 @@ static int affs_symlink_readpage(struct file *file, struct page *page)
j = 0; j = 0;
lf = (struct slink_front *)bh->b_data; lf = (struct slink_front *)bh->b_data;
lc = 0; lc = 0;
pf = inode->i_sb->u.affs_sb.s_prefix ? inode->i_sb->u.affs_sb.s_prefix : "/"; pf = AFFS_SB(inode->i_sb)->s_prefix ? AFFS_SB(inode->i_sb)->s_prefix : "/";
if (strchr(lf->symname,':')) { /* Handle assign or volume name */ if (strchr(lf->symname,':')) { /* Handle assign or volume name */
while (i < 1023 && (c = pf[i])) while (i < 1023 && (c = pf[i]))
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/affs_fs_i.h> #include <linux/affs_fs_i.h>
#include <linux/affs_fs_sb.h>
#define AFFS_SUPER_MAGIC 0xadff #define AFFS_SUPER_MAGIC 0xadff
......
...@@ -50,6 +50,9 @@ struct affs_sb_info { ...@@ -50,6 +50,9 @@ struct affs_sb_info {
#define SF_READONLY 0x1000 /* Don't allow to remount rw */ #define SF_READONLY 0x1000 /* Don't allow to remount rw */
/* short cut to get to the affs specific sb data */ /* short cut to get to the affs specific sb data */
#define AFFS_SB (&sb->u.affs_sb) static inline struct affs_sb_info *AFFS_SB(struct super_block *sb)
{
return sb->u.generic_sbp;
}
#endif #endif
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
#define GET_END_PTR(st,p,sz) ((st *)((char *)(p)+((sz)-sizeof(st)))) #define GET_END_PTR(st,p,sz) ((st *)((char *)(p)+((sz)-sizeof(st))))
#define AFFS_GET_HASHENTRY(data,hashkey) be32_to_cpu(((struct dir_front *)data)->hashtable[hashkey]) #define AFFS_GET_HASHENTRY(data,hashkey) be32_to_cpu(((struct dir_front *)data)->hashtable[hashkey])
#define AFFS_BLOCK(sb, bh, blk) (AFFS_HEAD(bh)->table[(sb)->u.affs_sb.s_hashsize-1-(blk)]) #define AFFS_BLOCK(sb, bh, blk) (AFFS_HEAD(bh)->table[AFFS_SB(sb)->s_hashsize-1-(blk)])
static inline void static inline void
affs_set_blocksize(struct super_block *sb, int size) affs_set_blocksize(struct super_block *sb, int size)
...@@ -29,7 +29,7 @@ static inline struct buffer_head * ...@@ -29,7 +29,7 @@ static inline struct buffer_head *
affs_bread(struct super_block *sb, int block) affs_bread(struct super_block *sb, int block)
{ {
pr_debug(KERN_DEBUG "affs_bread: %d\n", block); pr_debug(KERN_DEBUG "affs_bread: %d\n", block);
if (block >= AFFS_SB->s_reserved && block < AFFS_SB->s_partition_size) if (block >= AFFS_SB(sb)->s_reserved && block < AFFS_SB(sb)->s_partition_size)
return sb_bread(sb, block); return sb_bread(sb, block);
return NULL; return NULL;
} }
...@@ -37,7 +37,7 @@ static inline struct buffer_head * ...@@ -37,7 +37,7 @@ static inline struct buffer_head *
affs_getblk(struct super_block *sb, int block) affs_getblk(struct super_block *sb, int block)
{ {
pr_debug(KERN_DEBUG "affs_getblk: %d\n", block); pr_debug(KERN_DEBUG "affs_getblk: %d\n", block);
if (block >= AFFS_SB->s_reserved && block < AFFS_SB->s_partition_size) if (block >= AFFS_SB(sb)->s_reserved && block < AFFS_SB(sb)->s_partition_size)
return sb_getblk(sb, block); return sb_getblk(sb, block);
return NULL; return NULL;
} }
...@@ -46,7 +46,7 @@ affs_getzeroblk(struct super_block *sb, int block) ...@@ -46,7 +46,7 @@ affs_getzeroblk(struct super_block *sb, int block)
{ {
struct buffer_head *bh; struct buffer_head *bh;
pr_debug(KERN_DEBUG "affs_getzeroblk: %d\n", block); pr_debug(KERN_DEBUG "affs_getzeroblk: %d\n", block);
if (block >= AFFS_SB->s_reserved && block < AFFS_SB->s_partition_size) { if (block >= AFFS_SB(sb)->s_reserved && block < AFFS_SB(sb)->s_partition_size) {
bh = sb_getblk(sb, block); bh = sb_getblk(sb, block);
lock_buffer(bh); lock_buffer(bh);
memset(bh->b_data, 0 , sb->s_blocksize); memset(bh->b_data, 0 , sb->s_blocksize);
...@@ -61,7 +61,7 @@ affs_getemptyblk(struct super_block *sb, int block) ...@@ -61,7 +61,7 @@ affs_getemptyblk(struct super_block *sb, int block)
{ {
struct buffer_head *bh; struct buffer_head *bh;
pr_debug(KERN_DEBUG "affs_getemptyblk: %d\n", block); pr_debug(KERN_DEBUG "affs_getemptyblk: %d\n", block);
if (block >= AFFS_SB->s_reserved && block < AFFS_SB->s_partition_size) { if (block >= AFFS_SB(sb)->s_reserved && block < AFFS_SB(sb)->s_partition_size) {
bh = sb_getblk(sb, block); bh = sb_getblk(sb, block);
wait_on_buffer(bh); wait_on_buffer(bh);
mark_buffer_uptodate(bh, 1); mark_buffer_uptodate(bh, 1);
......
...@@ -648,7 +648,6 @@ struct quota_mount_options ...@@ -648,7 +648,6 @@ struct quota_mount_options
#include <linux/hpfs_fs_sb.h> #include <linux/hpfs_fs_sb.h>
#include <linux/ntfs_fs_sb.h> #include <linux/ntfs_fs_sb.h>
#include <linux/sysv_fs_sb.h> #include <linux/sysv_fs_sb.h>
#include <linux/affs_fs_sb.h>
#include <linux/ufs_fs_sb.h> #include <linux/ufs_fs_sb.h>
#include <linux/romfs_fs_sb.h> #include <linux/romfs_fs_sb.h>
#include <linux/adfs_fs_sb.h> #include <linux/adfs_fs_sb.h>
...@@ -693,7 +692,6 @@ struct super_block { ...@@ -693,7 +692,6 @@ struct super_block {
struct hpfs_sb_info hpfs_sb; struct hpfs_sb_info hpfs_sb;
struct ntfs_sb_info ntfs_sb; struct ntfs_sb_info ntfs_sb;
struct sysv_sb_info sysv_sb; struct sysv_sb_info sysv_sb;
struct affs_sb_info affs_sb;
struct ufs_sb_info ufs_sb; struct ufs_sb_info ufs_sb;
struct romfs_sb_info romfs_sb; struct romfs_sb_info romfs_sb;
struct adfs_sb_info adfs_sb; struct adfs_sb_info adfs_sb;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment