瀏覽代碼

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>
Al Viro 14 年之前
父節點
當前提交
22ba747f66
共有 1 個文件被更改,包括 4 次插入1 次删除
  1. 4 1
      fs/jffs2/dir.c

+ 4 - 1
fs/jffs2/dir.c

@@ -820,7 +820,10 @@ static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
 
 
 	if (victim_f) {
 	if (victim_f) {
 		/* There was a victim. Kill it off nicely */
 		/* 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
 		/* Don't oops if the victim was a dirent pointing to an
 		   inode which didn't exist. */
 		   inode which didn't exist. */
 		if (victim_f->inocache) {
 		if (victim_f->inocache) {