/* 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;
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);
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);
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);
/* 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)
{
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);
}
*/
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;
};
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;
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;
}
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,
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)
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);
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;
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);
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;
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);
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);
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)
{
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 ??*/
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))
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) {