nilfs2: split nilfs_unlink as nilfs_do_unlink and nilfs_unlink
authorJiro SEKIBA <jir@unicus.jp>
Fri, 27 Nov 2009 10:41:10 +0000 (19:41 +0900)
committerRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
Fri, 27 Nov 2009 11:05:15 +0000 (20:05 +0900)
Split nilfs_unlink() to reduce nested transaction and duplicate
mark_inode_dirty() calls when calling nilfs_unlink() from nilfs_rmdir().

nilfs_do_unlink() is an actual unlink functionality which is not
in transaction and does not call mark_inode_dirty() for dentry argument.

nilfs_unlink() is a wrapper function for do_nilfs_unlink() with
transaction and mark_inode_dirty() for dentry argument.

Signed-off-by: Jiro SEKIBA <jir@unicus.jp>
Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
fs/nilfs2/namei.c

index 35f59da..d92e839 100644 (file)
@@ -288,18 +288,13 @@ out_dir:
        goto out;
 }
 
-static int nilfs_unlink(struct inode *dir, struct dentry *dentry)
+static int nilfs_do_unlink(struct inode *dir, struct dentry *dentry)
 {
        struct inode *inode;
        struct nilfs_dir_entry *de;
        struct page *page;
-       struct nilfs_transaction_info ti;
        int err;
 
-       err = nilfs_transaction_begin(dir->i_sb, &ti, 0);
-       if (err)
-               return err;
-
        err = -ENOENT;
        de = nilfs_find_entry(dir, dentry, &page);
        if (!de)
@@ -322,12 +317,26 @@ static int nilfs_unlink(struct inode *dir, struct dentry *dentry)
 
        inode->i_ctime = dir->i_ctime;
        drop_nlink(inode);
-       mark_inode_dirty(inode);
        err = 0;
 out:
-       if (!err)
+       return err;
+}
+
+static int nilfs_unlink(struct inode *dir, struct dentry *dentry)
+{
+       struct nilfs_transaction_info ti;
+       int err;
+
+       err = nilfs_transaction_begin(dir->i_sb, &ti, 0);
+       if (err)
+               return err;
+
+       err = nilfs_do_unlink(dir, dentry);
+
+       if (!err) {
+               mark_inode_dirty(dentry->d_inode);
                err = nilfs_transaction_commit(dir->i_sb);
-       else
+       else
                nilfs_transaction_abort(dir->i_sb);
 
        return err;
@@ -345,7 +354,7 @@ static int nilfs_rmdir(struct inode *dir, struct dentry *dentry)
 
        err = -ENOTEMPTY;
        if (nilfs_empty_dir(inode)) {
-               err = nilfs_unlink(dir, dentry);
+               err = nilfs_do_unlink(dir, dentry);
                if (!err) {
                        inode->i_size = 0;
                        drop_nlink(inode);