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 <[email protected]>
---
 fs/nilfs2/namei.c |   29 +++++++++++++++++++----------
 1 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/fs/nilfs2/namei.c b/fs/nilfs2/namei.c
index 35f59da..d92e839 100644
--- a/fs/nilfs2/namei.c
+++ b/fs/nilfs2/namei.c
@@ -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);
-- 
1.5.6.5

_______________________________________________
users mailing list
[email protected]
https://www.nilfs.org/mailman/listinfo/users

Reply via email to