Skip to content

Commit

Permalink
[XFS] Merge xfs_rmdir into xfs_remove
Browse files Browse the repository at this point in the history
xfs_remove and xfs_rmdir are almost the same with a little more work
performed in xfs_rmdir due to the . and .. entries. This patch merges
xfs_rmdir into xfs_remove and performs these actions conditionally.

Also clean up the error handling which was a nightmare in both versions
before.

SGI-PV: 981498

SGI-Modid: xfs-linux-melb:xfs-kern:31335a

Signed-off-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Barry Naujok <bnaujok@sgi.com>
Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
  • Loading branch information
Christoph Hellwig authored and Niv Sardi committed Jul 28, 2008
1 parent 61f10fa commit 8f112e3
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 278 deletions.
54 changes: 18 additions & 36 deletions fs/xfs/linux-2.6/xfs_iops.c
Original file line number Diff line number Diff line change
Expand Up @@ -245,8 +245,7 @@ STATIC void
xfs_cleanup_inode(
struct inode *dir,
struct inode *inode,
struct dentry *dentry,
int mode)
struct dentry *dentry)
{
struct xfs_name teardown;

Expand All @@ -257,10 +256,7 @@ xfs_cleanup_inode(
*/
xfs_dentry_to_name(&teardown, dentry);

if (S_ISDIR(mode))
xfs_rmdir(XFS_I(dir), &teardown, XFS_I(inode));
else
xfs_remove(XFS_I(dir), &teardown, XFS_I(inode));
xfs_remove(XFS_I(dir), &teardown, XFS_I(inode));
iput(inode);
}

Expand Down Expand Up @@ -342,7 +338,7 @@ xfs_vn_mknod(
return -error;

out_cleanup_inode:
xfs_cleanup_inode(dir, inode, dentry, mode);
xfs_cleanup_inode(dir, inode, dentry);
out_free_acl:
if (default_acl)
_ACL_FREE(default_acl);
Expand Down Expand Up @@ -518,37 +514,11 @@ xfs_vn_symlink(
return 0;

out_cleanup_inode:
xfs_cleanup_inode(dir, inode, dentry, 0);
xfs_cleanup_inode(dir, inode, dentry);
out:
return -error;
}

STATIC int
xfs_vn_rmdir(
struct inode *dir,
struct dentry *dentry)
{
struct inode *inode = dentry->d_inode;
struct xfs_name name;
int error;

xfs_dentry_to_name(&name, dentry);

error = xfs_rmdir(XFS_I(dir), &name, XFS_I(inode));
if (likely(!error)) {
xfs_validate_fields(inode);
xfs_validate_fields(dir);
/*
* With rmdir, the VFS makes the dentry "negative": no inode,
* but still hashed. This is incompatible with case-insensitive
* mode, so invalidate (unhash) the dentry in CI-mode.
*/
if (xfs_sb_version_hasasciici(&XFS_M(dir->i_sb)->m_sb))
d_invalidate(dentry);
}
return -error;
}

STATIC int
xfs_vn_rename(
struct inode *odir,
Expand Down Expand Up @@ -842,7 +812,13 @@ const struct inode_operations xfs_dir_inode_operations = {
.unlink = xfs_vn_unlink,
.symlink = xfs_vn_symlink,
.mkdir = xfs_vn_mkdir,
.rmdir = xfs_vn_rmdir,
/*
* Yes, XFS uses the same method for rmdir and unlink.
*
* There are some subtile differences deeper in the code,
* but we use S_ISDIR to check for those.
*/
.rmdir = xfs_vn_unlink,
.mknod = xfs_vn_mknod,
.rename = xfs_vn_rename,
.permission = xfs_vn_permission,
Expand All @@ -861,7 +837,13 @@ const struct inode_operations xfs_dir_ci_inode_operations = {
.unlink = xfs_vn_unlink,
.symlink = xfs_vn_symlink,
.mkdir = xfs_vn_mkdir,
.rmdir = xfs_vn_rmdir,
/*
* Yes, XFS uses the same method for rmdir and unlink.
*
* There are some subtile differences deeper in the code,
* but we use S_ISDIR to check for those.
*/
.rmdir = xfs_vn_unlink,
.mknod = xfs_vn_mknod,
.rename = xfs_vn_rename,
.permission = xfs_vn_permission,
Expand Down
Loading

0 comments on commit 8f112e3

Please sign in to comment.