From: NeilBrown Date: Mon, 7 Mar 2011 05:58:57 +0000 (+1100) Subject: Change various other functions to take an inode rather than a superblock. X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=d657c88e438acaa33bd28ef48d3040abae514712;p=LaFS.git Change various other functions to take an inode rather than a superblock. This is a natural follow-on from previous patch. Signed-off-by: NeilBrown --- diff --git a/dir.c b/dir.c index e0e6d4c..0dd5045 100644 --- a/dir.c +++ b/dir.c @@ -833,7 +833,7 @@ lafs_create(struct inode *dir, struct dentry *de, int mode, /* Need to allocate an inode and space in the directory */ struct fs *fs = fs_from_inode(dir); struct datablock *db; - struct inode *ino = lafs_new_inode(fs, dir->i_sb, + struct inode *ino = lafs_new_inode(fs, LAFSI(dir)->filesys, dir, TypeFile, 0, mode, &db); struct dirop_handle doh; struct update_handle uh; @@ -1126,7 +1126,7 @@ lafs_symlink(struct inode *dir, struct dentry *de, if (l > fs->blocksize-1) return -ENAMETOOLONG; - ino = lafs_new_inode(fs, dir->i_sb, dir, + ino = lafs_new_inode(fs, LAFSI(dir)->filesys, dir, TypeSymlink, 0, 0666, &inodb); if (IS_ERR(ino)) return PTR_ERR(ino); @@ -1208,7 +1208,7 @@ lafs_mkdir(struct inode *dir, struct dentry *de, int mode) if (dir->i_nlink >= LAFS_MAX_LINKS) return -EMLINK; - ino = lafs_new_inode(fs, dir->i_sb, dir, + ino = lafs_new_inode(fs, LAFSI(dir)->filesys, dir, TypeDir, 0, mode, &inodb); if (IS_ERR(ino)) return PTR_ERR(ino); @@ -1285,7 +1285,7 @@ lafs_mknod(struct inode *dir, struct dentry *de, int mode, default: return -EINVAL; } - ino = lafs_new_inode(fs, dir->i_sb, dir, + ino = lafs_new_inode(fs, LAFSI(dir)->filesys, dir, type, 0, mode, &inodb); if (IS_ERR(ino)) return PTR_ERR(ino); diff --git a/inode.c b/inode.c index 7605323..69df4d0 100644 --- a/inode.c +++ b/inode.c @@ -881,7 +881,7 @@ void lafs_clear_inode(struct inode *ino) /* FIXME release quota inodes if filesystem */ } -static int inode_map_free(struct fs *fs, struct super_block *sb, u32 inum); +static int inode_map_free(struct fs *fs, struct inode *fsys, u32 inum); void lafs_delete_inode(struct inode *ino) { @@ -917,7 +917,7 @@ void lafs_delete_inode(struct inode *ino) dprintk("PUNCH hole for %d\n", (int)b->b.fileaddr); putdref(b, MKREF(delete_inode)); } - inode_map_free(fs, ino->i_sb, ino->i_ino); + inode_map_free(fs, LAFSI(ino)->filesys, ino->i_ino); clear_inode(ino); } @@ -1552,10 +1552,10 @@ void lafs_inode_fillblock(struct inode *ino) */ static int -choose_free_inum(struct fs *fs, struct super_block *sb, u32 *inump, +choose_free_inum(struct fs *fs, struct inode *fsys, u32 *inump, struct datablock **bp, int *restarted) { - struct inode *im = lafs_iget(ino_from_sb(sb), 1, SYNC); + struct inode *im = lafs_iget(fsys, 1, SYNC); loff_t bnum; struct datablock *b; char *buf; @@ -1681,7 +1681,7 @@ struct inode_map_new_info { }; static int -inode_map_new_prepare(struct fs *fs, int inum, struct super_block *sb, +inode_map_new_prepare(struct fs *fs, int inum, struct inode *fsys, struct inode_map_new_info *imni) { int choice = inum; @@ -1693,12 +1693,12 @@ inode_map_new_prepare(struct fs *fs, int inum, struct super_block *sb, retry: if (inum == 0) /* choose a possibly-free inode number */ - err = choose_free_inum(fs, sb, &choice, + err = choose_free_inum(fs, fsys, &choice, &imni->mb, &restarted); if (err) return err; - b = lafs_get_block(ino_from_sb(sb), choice, NULL, GFP_KERNEL, + b = lafs_get_block(fsys, choice, NULL, GFP_KERNEL, MKREF(cfi_ino)); if (!b) return -ENOMEM; @@ -1780,7 +1780,7 @@ inode_map_new_abort(struct inode_map_new_info *imni) } struct inode * -lafs_new_inode(struct fs *fs, struct super_block *sb, struct inode *dir, +lafs_new_inode(struct fs *fs, struct inode *fsys, struct inode *dir, int type, int inum, int mode, struct datablock **inodbp) { /* allocate and instantiate a new inode. If inum is non-zero, @@ -1798,7 +1798,7 @@ lafs_new_inode(struct fs *fs, struct super_block *sb, struct inode *dir, struct update_handle ui; int err; - err = inode_map_new_prepare(fs, inum, sb, &imni); + err = inode_map_new_prepare(fs, inum, fsys, &imni); err = lafs_cluster_update_prepare(&ui, fs, sizeof(struct la_inode)) ?: err; if (err == 0) @@ -1826,7 +1826,7 @@ retry: lafs_iounlock_block(&b->b); inode_map_new_commit(&imni); - ino = lafs_iget(ino_from_sb(sb), b->b.fileaddr, SYNC); + ino = lafs_iget(fsys, b->b.fileaddr, SYNC); if (IS_ERR(ino)) { lafs_cluster_update_abort(&ui); LAFS_BUG(1, &b->b); @@ -1853,9 +1853,9 @@ abort: return ERR_PTR(err); } -static int inode_map_free(struct fs *fs, struct super_block *sb, u32 inum) +static int inode_map_free(struct fs *fs, struct inode *fsys, u32 inum) { - struct inode *im = lafs_iget(ino_from_sb(sb), 1, SYNC); + struct inode *im = lafs_iget(fsys, 1, SYNC); int bit; unsigned long *buf; struct datablock *b; @@ -1864,8 +1864,8 @@ static int inode_map_free(struct fs *fs, struct super_block *sb, u32 inum) mutex_lock_nested(&im->i_mutex, I_MUTEX_QUOTA); - bnum = inum >> (3 + sb->s_blocksize_bits); - bit = inum - (bnum << (3 + sb->s_blocksize_bits)); + bnum = inum >> (3 + fs->blocksize_bits); + bit = inum - (bnum << (3 + fs->blocksize_bits)); b = lafs_get_block(im, bnum, NULL, GFP_KERNEL, MKREF(inode_map_free)); if (!b) { mutex_unlock(&im->i_mutex); @@ -1901,12 +1901,12 @@ retry: return 0; } -int lafs_inode_inuse(struct fs *fs, struct super_block *sb, u32 inum) +int lafs_inode_inuse(struct fs *fs, struct inode *fsys, u32 inum) { /* This is used during roll-forward to register a newly created * inode in the inode map */ - struct inode *im = lafs_iget(ino_from_sb(sb), 1, SYNC); + struct inode *im = lafs_iget(fsys, 1, SYNC); int bit; unsigned long *buf; struct datablock *b; @@ -1915,8 +1915,8 @@ int lafs_inode_inuse(struct fs *fs, struct super_block *sb, u32 inum) mutex_lock_nested(&im->i_mutex, I_MUTEX_QUOTA); - bnum = inum >> (3 + sb->s_blocksize_bits); - bit = inum - (bnum << (3 + sb->s_blocksize_bits)); + bnum = inum >> (3 + fs->blocksize_bits); + bit = inum - (bnum << (3 + fs->blocksize_bits)); if (bnum > LAFSI(im)->md.inodemap.size) { /* inum to unbelievably big */ mutex_unlock(&im->i_mutex); diff --git a/lafs.h b/lafs.h index 5b1afbf..70a25d0 100644 --- a/lafs.h +++ b/lafs.h @@ -146,7 +146,7 @@ void lafs_clear_inode(struct inode *ino); void lafs_delete_inode(struct inode *ino); void lafs_dirty_inode(struct inode *ino); int lafs_sync_inode(struct inode *ino, int wait); -struct inode *lafs_new_inode(struct fs *fs, struct super_block *sb, +struct inode *lafs_new_inode(struct fs *fs, struct inode *fsys, struct inode *dir, int type, int inum, int mode, struct datablock **inodbp); int lafs_lock_inode(struct inode *ino); @@ -154,7 +154,7 @@ void lafs_inode_fillblock(struct inode *ino); struct datablock *lafs_inode_dblock(struct inode *ino, int async, REFARG); struct datablock *lafs_inode_get_dblock(struct inode *ino, REFARG); int lafs_inode_handle_orphan(struct datablock *b); -int lafs_inode_inuse(struct fs *fs, struct super_block *sb, u32 inum); +int lafs_inode_inuse(struct fs *fs, struct inode *fsys, u32 inum); static inline void lafs_iput_fs(struct inode *ino) { diff --git a/roll.c b/roll.c index 0639606..6ffe3e5 100644 --- a/roll.c +++ b/roll.c @@ -307,7 +307,7 @@ roll_mini(struct fs *fs, int fsnum, int inum, int trunc, db = lafs_get_block(fsinode, bnum, NULL, GFP_KERNEL, MKREF(roll)); sb = lafs_get_subset_sb(fsinode); - lafs_inode_inuse(fs, sb, bnum); + lafs_inode_inuse(fs, fsinode, bnum); deactivate_super(sb); lafs_iput_fs(fsinode); if (!db) diff --git a/super.c b/super.c index 46e8eec..6156c96 100644 --- a/super.c +++ b/super.c @@ -1036,7 +1036,7 @@ struct super_block *lafs_get_subset_sb(struct inode *ino) sb->s_time_gran = 2; rootdir = lafs_iget(ino, 2, SYNC); if (IS_ERR(rootdir) && PTR_ERR(rootdir) == -ENOENT) { - rootdir = lafs_new_inode(fs, sb, NULL, + rootdir = lafs_new_inode(fs, ino, NULL, TypeDir, 2, 0755, NULL); /* FIXME could the inode get written before we set * the link count ??*/ @@ -1048,7 +1048,7 @@ struct super_block *lafs_get_subset_sb(struct inode *ino) sb->s_root = d_alloc_root(rootdir); imapfile = lafs_iget(ino, 1, SYNC); if (IS_ERR(imapfile) && PTR_ERR(imapfile) == -ENOENT) - imapfile = lafs_new_inode(fs, sb, NULL, + imapfile = lafs_new_inode(fs, ino, NULL, TypeInodeMap, 1, 0, NULL); if (IS_ERR(imapfile)) @@ -1265,9 +1265,10 @@ static void __exit lafs_exit(void) static struct inode *lafs_nfs_get_inode(struct super_block *sb, u64 ino, u32 generation) { + struct fs *fs = fs_from_sb(sb); struct inode *inode; - inode = lafs_iget(ino_from_sb(sb), ino, SYNC); + inode = lafs_iget(fs->ss[0].root, ino, SYNC); if (IS_ERR(inode)) return ERR_CAST(inode); if (generation && inode->i_generation != generation) {