Commit 8f112e3b authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Niv Sardi

[XFS] Merge xfs_rmdir into xfs_remove

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: default avatarChristoph Hellwig <hch@infradead.org>
Signed-off-by: default avatarBarry Naujok <bnaujok@sgi.com>
Signed-off-by: default avatarLachlan McIlroy <lachlan@sgi.com>
parent 61f10fad
...@@ -245,8 +245,7 @@ STATIC void ...@@ -245,8 +245,7 @@ STATIC void
xfs_cleanup_inode( xfs_cleanup_inode(
struct inode *dir, struct inode *dir,
struct inode *inode, struct inode *inode,
struct dentry *dentry, struct dentry *dentry)
int mode)
{ {
struct xfs_name teardown; struct xfs_name teardown;
...@@ -257,10 +256,7 @@ xfs_cleanup_inode( ...@@ -257,10 +256,7 @@ xfs_cleanup_inode(
*/ */
xfs_dentry_to_name(&teardown, dentry); xfs_dentry_to_name(&teardown, dentry);
if (S_ISDIR(mode)) xfs_remove(XFS_I(dir), &teardown, XFS_I(inode));
xfs_rmdir(XFS_I(dir), &teardown, XFS_I(inode));
else
xfs_remove(XFS_I(dir), &teardown, XFS_I(inode));
iput(inode); iput(inode);
} }
...@@ -342,7 +338,7 @@ xfs_vn_mknod( ...@@ -342,7 +338,7 @@ xfs_vn_mknod(
return -error; return -error;
out_cleanup_inode: out_cleanup_inode:
xfs_cleanup_inode(dir, inode, dentry, mode); xfs_cleanup_inode(dir, inode, dentry);
out_free_acl: out_free_acl:
if (default_acl) if (default_acl)
_ACL_FREE(default_acl); _ACL_FREE(default_acl);
...@@ -518,37 +514,11 @@ xfs_vn_symlink( ...@@ -518,37 +514,11 @@ xfs_vn_symlink(
return 0; return 0;
out_cleanup_inode: out_cleanup_inode:
xfs_cleanup_inode(dir, inode, dentry, 0); xfs_cleanup_inode(dir, inode, dentry);
out: out:
return -error; 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 STATIC int
xfs_vn_rename( xfs_vn_rename(
struct inode *odir, struct inode *odir,
...@@ -842,7 +812,13 @@ const struct inode_operations xfs_dir_inode_operations = { ...@@ -842,7 +812,13 @@ const struct inode_operations xfs_dir_inode_operations = {
.unlink = xfs_vn_unlink, .unlink = xfs_vn_unlink,
.symlink = xfs_vn_symlink, .symlink = xfs_vn_symlink,
.mkdir = xfs_vn_mkdir, .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, .mknod = xfs_vn_mknod,
.rename = xfs_vn_rename, .rename = xfs_vn_rename,
.permission = xfs_vn_permission, .permission = xfs_vn_permission,
...@@ -861,7 +837,13 @@ const struct inode_operations xfs_dir_ci_inode_operations = { ...@@ -861,7 +837,13 @@ const struct inode_operations xfs_dir_ci_inode_operations = {
.unlink = xfs_vn_unlink, .unlink = xfs_vn_unlink,
.symlink = xfs_vn_symlink, .symlink = xfs_vn_symlink,
.mkdir = xfs_vn_mkdir, .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, .mknod = xfs_vn_mknod,
.rename = xfs_vn_rename, .rename = xfs_vn_rename,
.permission = xfs_vn_permission, .permission = xfs_vn_permission,
......
This diff is collapsed.
...@@ -31,8 +31,6 @@ int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip, ...@@ -31,8 +31,6 @@ int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip,
struct xfs_name *target_name); struct xfs_name *target_name);
int xfs_mkdir(struct xfs_inode *dp, struct xfs_name *dir_name, int xfs_mkdir(struct xfs_inode *dp, struct xfs_name *dir_name,
mode_t mode, struct xfs_inode **ipp, struct cred *credp); mode_t mode, struct xfs_inode **ipp, struct cred *credp);
int xfs_rmdir(struct xfs_inode *dp, struct xfs_name *name,
struct xfs_inode *cdp);
int xfs_readdir(struct xfs_inode *dp, void *dirent, size_t bufsize, int xfs_readdir(struct xfs_inode *dp, void *dirent, size_t bufsize,
xfs_off_t *offset, filldir_t filldir); xfs_off_t *offset, filldir_t filldir);
int xfs_symlink(struct xfs_inode *dp, struct xfs_name *link_name, int xfs_symlink(struct xfs_inode *dp, struct xfs_name *link_name,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment