From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sage Weil Subject: [PATCH 17/26] ncpfs: fix rename over directory with dangling references Date: Fri, 27 May 2011 13:42:10 -0700 Message-ID: <1306528939-30636-18-git-send-email-sage@newdream.net> References: <1306528939-30636-1-git-send-email-sage@newdream.net> Cc: linux-fsdevel@vger.kernel.org, Sage Weil , Petr Vandrovec , linux-kernel@vger.kernel.org To: hch@infradead.org, viro@ZenIV.linux.org.uk Return-path: In-Reply-To: <1306528939-30636-1-git-send-email-sage@newdream.net> Sender: linux-kernel-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org ncpfs does not handle references to unlinked directories (or so it would seem given the ncp_rmdir check). Since it is also possible to rename over an empty directory, perform the same check here. CC: Petr Vandrovec CC: linux-kernel@vger.kernel.org Signed-off-by: Sage Weil --- fs/ncpfs/dir.c | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-) diff --git a/fs/ncpfs/dir.c b/fs/ncpfs/dir.c index 81c287d..9c51f62 100644 --- a/fs/ncpfs/dir.c +++ b/fs/ncpfs/dir.c @@ -1144,8 +1144,16 @@ static int ncp_rename(struct inode *old_dir, struct dentry *old_dentry, old_dentry->d_parent->d_name.name, old_dentry->d_name.name, new_dentry->d_parent->d_name.name, new_dentry->d_name.name); - if (new_dentry->d_inode && S_ISDIR(new_dentry->d_inode->i_mode)) + if (new_dentry->d_inode && S_ISDIR(new_dentry->d_inode->i_mode)) { + /* + * fail with EBUSY if there are still references to this + * directory. + */ dentry_unhash(new_dentry); + error = -EBUSY; + if (!d_unhashed(new_dentry)) + goto out; + } ncp_age_dentry(server, old_dentry); ncp_age_dentry(server, new_dentry); -- 1.7.0