nilfs2: split nilfs_unlink as nilfs_do_unlink and nilfs_unlink

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>
This commit is contained in:
Jiro SEKIBA 2009-11-27 19:41:10 +09:00 committed by Ryusuke Konishi
parent 1749147276
commit 4cd76c3c93

View 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);