Skip to content

Commit

Permalink
SUNRPC: rpc_unlink() must check for unhashed dentries
Browse files Browse the repository at this point in the history
A prior call to rpc_depopulate() by rpc_rmdir() on the parent directory may
have already called simple_unlink() on this entry.
Add the same check to rpc_rmdir(). Also remove a redundant call to
rpc_close_pipes() in rpc_rmdir.

Signed-off-by: Trond Myklebust <[email protected]>
(cherry picked from 0bbfb9d20f6437c4031aa3bf9b4d311a053e58e3 commit)
  • Loading branch information
Trond Myklebust authored and Trond Myklebust committed Aug 24, 2006
1 parent dff02cc commit 68adb0a
Showing 1 changed file with 10 additions and 7 deletions.
17 changes: 10 additions & 7 deletions net/sunrpc/rpc_pipe.c
Original file line number Diff line number Diff line change
Expand Up @@ -539,6 +539,7 @@ rpc_depopulate(struct dentry *parent)
rpc_close_pipes(dentry->d_inode);
simple_unlink(dir, dentry);
}
inode_dir_notify(dir, DN_DELETE);
dput(dentry);
} while (n);
goto repeat;
Expand Down Expand Up @@ -610,8 +611,8 @@ __rpc_rmdir(struct inode *dir, struct dentry *dentry)
int error;

shrink_dcache_parent(dentry);
if (dentry->d_inode)
rpc_close_pipes(dentry->d_inode);
if (d_unhashed(dentry))
return 0;
if ((error = simple_rmdir(dir, dentry)) != 0)
return error;
if (!error) {
Expand Down Expand Up @@ -747,13 +748,15 @@ rpc_unlink(struct dentry *dentry)
parent = dget_parent(dentry);
dir = parent->d_inode;
mutex_lock_nested(&dir->i_mutex, I_MUTEX_PARENT);
d_drop(dentry);
if (dentry->d_inode) {
rpc_close_pipes(dentry->d_inode);
error = simple_unlink(dir, dentry);
if (!d_unhashed(dentry)) {
d_drop(dentry);
if (dentry->d_inode) {
rpc_close_pipes(dentry->d_inode);
error = simple_unlink(dir, dentry);
}
inode_dir_notify(dir, DN_DELETE);
}
dput(dentry);
inode_dir_notify(dir, DN_DELETE);
mutex_unlock(&dir->i_mutex);
dput(parent);
return error;
Expand Down

0 comments on commit 68adb0a

Please sign in to comment.