aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nilfs2
diff options
context:
space:
mode:
authorRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>2010-08-26 01:52:51 +0900
committerRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>2010-10-23 09:24:35 +0900
commit367ea33486a68f935a01311a3be9b7e97d2e5ead (patch)
treede5ccfd05a527bc85ba63b9f22fdef57bfa80053 /fs/nilfs2
parentnilfs2: deny write access to inodes in snapshots (diff)
downloadlinux-dev-367ea33486a68f935a01311a3be9b7e97d2e5ead.tar.xz
linux-dev-367ea33486a68f935a01311a3be9b7e97d2e5ead.zip
nilfs2: split out nilfs_get_root_dentry
This splits the code to allocate root dentry into a separate routine for convenience in successive changes. Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
Diffstat (limited to 'fs/nilfs2')
-rw-r--r--fs/nilfs2/super.c54
1 files changed, 35 insertions, 19 deletions
diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c
index acfa74e45f0b..1e12930f8b94 100644
--- a/fs/nilfs2/super.c
+++ b/fs/nilfs2/super.c
@@ -750,6 +750,39 @@ int nilfs_check_feature_compatibility(struct super_block *sb,
return 0;
}
+static int nilfs_get_root_dentry(struct super_block *sb,
+ struct nilfs_root *root,
+ struct dentry **root_dentry)
+{
+ struct inode *inode;
+ struct dentry *dentry;
+ int ret = 0;
+
+ inode = nilfs_iget(sb, root, NILFS_ROOT_INO);
+ if (IS_ERR(inode)) {
+ printk(KERN_ERR "NILFS: get root inode failed\n");
+ ret = PTR_ERR(inode);
+ goto out;
+ }
+ if (!S_ISDIR(inode->i_mode) || !inode->i_blocks || !inode->i_size) {
+ iput(inode);
+ printk(KERN_ERR "NILFS: corrupt root inode.\n");
+ ret = -EINVAL;
+ goto out;
+ }
+
+ dentry = d_alloc_root(inode);
+ if (!dentry) {
+ iput(inode);
+ printk(KERN_ERR "NILFS: get root dentry failed\n");
+ ret = -ENOMEM;
+ goto out;
+ }
+ *root_dentry = dentry;
+ out:
+ return ret;
+}
+
/**
* nilfs_fill_super() - initialize a super block instance
* @sb: super_block
@@ -766,7 +799,6 @@ nilfs_fill_super(struct super_block *sb, void *data, int silent,
{
struct nilfs_sb_info *sbi;
struct nilfs_root *fsroot;
- struct inode *root;
__u64 cno;
int err, curr_mnt;
@@ -850,25 +882,9 @@ nilfs_fill_super(struct super_block *sb, void *data, int silent,
goto failed_checkpoint;
}
- root = nilfs_iget(sb, fsroot, NILFS_ROOT_INO);
- if (IS_ERR(root)) {
- printk(KERN_ERR "NILFS: get root inode failed\n");
- err = PTR_ERR(root);
- goto failed_segctor;
- }
- if (!S_ISDIR(root->i_mode) || !root->i_blocks || !root->i_size) {
- iput(root);
- printk(KERN_ERR "NILFS: corrupt root inode.\n");
- err = -EINVAL;
- goto failed_segctor;
- }
- sb->s_root = d_alloc_root(root);
- if (!sb->s_root) {
- iput(root);
- printk(KERN_ERR "NILFS: get root dentry failed\n");
- err = -ENOMEM;
+ err = nilfs_get_root_dentry(sb, fsroot, &sb->s_root);
+ if (err)
goto failed_segctor;
- }
nilfs_put_root(fsroot);