summaryrefslogtreecommitdiff
path: root/fs/jffs2/dir.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2011-07-21 15:57:47 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2011-07-22 19:42:11 -0400
commit22ba747f660c0acd14761628c24aa972d18058a0 (patch)
tree8a96b344623ba66c3138bd4d6cc916f5ad3d3053 /fs/jffs2/dir.c
parent841590ce16c19a3ce38028adfc8b1955482ee00c (diff)
downloadlwn-22ba747f660c0acd14761628c24aa972d18058a0.tar.gz
lwn-22ba747f660c0acd14761628c24aa972d18058a0.zip
jffs2: fix IN_DELETE_SELF on overwriting rename() killing a directory
We don't generate IN_DELETE_SELF on victim of overwriting rename() if it happens to be a directory. Trivially fixed by doing to ->i_nlink what we do ->pino_nlink a couple of lines later in jffs2_rename(). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/jffs2/dir.c')
-rw-r--r--fs/jffs2/dir.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/fs/jffs2/dir.c b/fs/jffs2/dir.c
index 8f40ce4f1777..5f243cd63afc 100644
--- a/fs/jffs2/dir.c
+++ b/fs/jffs2/dir.c
@@ -820,7 +820,10 @@ static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
if (victim_f) {
/* There was a victim. Kill it off nicely */
- drop_nlink(new_dentry->d_inode);
+ if (S_ISDIR(new_dentry->d_inode->i_mode))
+ clear_nlink(new_dentry->d_inode);
+ else
+ drop_nlink(new_dentry->d_inode);
/* Don't oops if the victim was a dirent pointing to an
inode which didn't exist. */
if (victim_f->inocache) {