/* 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, LAFSI(dir)->filesys,
+ struct inode *ino = lafs_new_inode(fs, dir->i_sb,
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, LAFSI(dir)->filesys, dir,
+ ino = lafs_new_inode(fs, dir->i_sb, 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, LAFSI(dir)->filesys, dir,
+ ino = lafs_new_inode(fs, dir->i_sb, dir,
TypeDir, 0, mode, &inodb);
if (IS_ERR(ino))
return PTR_ERR(ino);
default:
return -EINVAL;
}
- ino = lafs_new_inode(fs, LAFSI(dir)->filesys, dir,
+ ino = lafs_new_inode(fs, dir->i_sb, 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 inode *filesys, u32 inum);
+static int inode_map_free(struct fs *fs, struct super_block *sb, u32 inum);
void lafs_delete_inode(struct inode *ino)
{
set_bit(B_Claimed, &b->b.flags);
lafs_add_orphan(fs, b);
- inode_map_free(fs, LAFSI(ino)->filesys, ino->i_ino);
+ inode_map_free(fs, ino->i_sb, ino->i_ino);
// FIXME what to do on error (-ENOMEM )
dprintk("PUNCH hole for %d\n", (int)b->b.fileaddr);
*/
static int
-choose_free_inum(struct fs *fs, struct inode *filesys, u32 *inump,
+choose_free_inum(struct fs *fs, struct super_block *sb, u32 *inump,
struct datablock **bp, int *restarted)
{
- struct inode *im = lafs_iget(filesys->i_sb, 1, SYNC);
+ struct inode *im = lafs_iget(sb, 1, SYNC);
loff_t bnum;
struct datablock *b;
char *buf;
};
static int
-inode_map_new_prepare(struct fs *fs, int inum, struct inode *filesys,
+inode_map_new_prepare(struct fs *fs, int inum, struct super_block *sb,
struct inode_map_new_info *imni)
{
int choice = inum;
retry:
if (inum == 0)
/* choose a possibly-free inode number */
- err = choose_free_inum(fs, filesys, &choice,
+ err = choose_free_inum(fs, sb, &choice,
&imni->mb, &restarted);
if (err)
return err;
- b = lafs_get_block(filesys, choice, NULL, GFP_KERNEL,
+ b = lafs_get_block(ino_from_sb(sb), choice, NULL, GFP_KERNEL,
MKREF(cfi_ino));
if (!b)
return -ENOMEM;
}
struct inode *
-lafs_new_inode(struct fs *fs, struct inode *filesys, struct inode *dir,
+lafs_new_inode(struct fs *fs, struct super_block *sb, 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, filesys, &imni);
+ err = inode_map_new_prepare(fs, inum, sb, &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(filesys->i_sb, b->b.fileaddr, SYNC);
+ ino = lafs_iget(sb, 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 inode *filesys, u32 inum)
+static int inode_map_free(struct fs *fs, struct super_block *sb, u32 inum)
{
- struct inode *im = lafs_iget(filesys->i_sb, 1, SYNC);
+ struct inode *im = lafs_iget(sb, 1, SYNC);
int bit;
unsigned long *buf;
struct datablock *b;
u32 bnum;
int err;
- bnum = inum >> (3 + filesys->i_blkbits);
- bit = inum - (bnum << (3 + filesys->i_blkbits));
+ bnum = inum >> (3 + sb->s_blocksize_bits);
+ bit = inum - (bnum << (3 + sb->s_blocksize_bits));
b = lafs_get_block(im, bnum, NULL, GFP_KERNEL, MKREF(inode_map_free));
if (!b) {
iput(im);
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 inode *filesys,
+struct inode *lafs_new_inode(struct fs *fs, struct super_block *sb,
struct inode *dir, int type,
int inum, int mode, struct datablock **inodbp);
int lafs_lock_inode(struct inode *ino);
return k->fs;
}
+static inline struct inode *ino_from_sb(struct super_block *sb)
+{
+ struct sb_key *k = sb->s_fs_info;
+ return k->root;
+}
+
static inline struct fs *fs_from_inode(struct inode *ino)
{
return fs_from_sb(ino->i_sb);