| [PATCH] jffs2: bug fix of rename when jffs2_do_unlink failed

chenjie6 at huawei.com chenjie6 at huawei.com
Mon Dec 1 06:25:07 PST 2014


From: chenjie <chenjie6 at huawei.com>

when jffs2_do_unlink return error will lead the jffs2 panic 
Testcase 
"touch a b; mv a b" when jffs2_do_unlink return error

jffs2_rename(): Link succeeded, unlink failed (err -4). You now have a hard link
------------[ cut here ]------------
kernel BUG at fs/dcache.c:1018!
Oops: Exception in kernel mode, sig: 5 [#1]
PREEMPT SMP NR_CPUS=4 LTT NESTING LEVEL : 0 
P2041 RDB
last sysfs file: /sys/devices/virtual/kbox/kbox/dev
Modules linked in: xt_tcpudp x_tables ip_tables ipt_REJECT iptable_filter 
i2c_mpc rtc_lib rtc_core rtc_ds3232 xgmac_mdio(P) 
fsl_mac fsl_oh fsl_dpaa cpld wdt kbox ddrramdriver rtos_kbox_panic rsm [last unloaded: hello]
NIP: c0132b8c LR: c02051ec CTR: 0000001e
REGS: ca4d9d10 TRAP: 0700   Tainted: P            (2.6.34.13)
MSR: 00029002 <EE,ME,CE>  CR: 28828428  XER: 20000000
TASK = cb48c380[19475] 'rename14' THREAD: ca4d8000 CPU: 2
GPR00: 00000001 ca4d9dc0 cb48c380 c8aea360 c8969078 c0680ee8 ebc01dcc 61206861 
GPR08: 00021002 c8968e40 cb48c380 0129f000 28828424 1001915c 100cf6e0 100cf7bc 
GPR16: 00000000 10131d08 00000000 00000000 10151f08 10157c08 c5eb1518 10151f08 
GPR24: fffffffc cbcfae00 000d8e52 c5eb1518 c8968de0 c8aea360 c8969078 c8aea360 
NIP [c0132b8c] d_instantiate+0x2c/0x80
LR [c02051ec] jffs2_rename+0x29c/0x2e0
Call Trace:
[ca4d9dc0] [cb48c380] 0xcb48c380 (unreliable)
[ca4d9de0] [c02051ec] jffs2_rename+0x29c/0x2e0
[ca4d9e10] [c0128908] vfs_rename+0x488/0x4f0
[ca4d9e50] [c012ad48] sys_renameat+0x1f8/0x210
[ca4d9f40] [c0010b70] ret_from_syscall+0x0/0x4
--- Exception: c01 at 0xfe95d5c
    LR = 0x1000088c
Instruction dump:
60000000 9421ffe0 7c0802a6 bfa10014 7c7f1b78 90010024 3803004c 7c9e2378 
8123004c 7f890000 38000001 7c00079e <0f000000> 3fa0c06b 3bbd4ac0 7fa3eb78 
Kernel panic - not syncing: Fatal exception
Call Trace:
[ca4d9b10] [c0007970] show_stack+0x50/0x160 (unreliable)
[ca4d9b40] [c04f4db4] panic+0x12c/0x1ac
[ca4d9b90] [c000e65c] die+0x14c/0x230
[ca4d9bc0] [c000ea10] _exception+0x150/0x270
[ca4d9cd0] [c04ee800] program_check_exception+0xb0/0x660
[ca4d9d00] [c0011174] ret_from_except_full+0x0/0x4c
--- Exception: 700 at d_instantiate+0x2c/0x80
    LR = jffs2_rename+0x29c/0x2e0
[ca4d9dc0] [cb48c380] 0xcb48c380 (unreliable)
[ca4d9de0] [c02051ec] jffs2_rename+0x29c/0x2e0
[ca4d9e10] [c0128908] vfs_rename+0x488/0x4f0
[ca4d9e50] [c012ad48] sys_renameat+0x1f8/0x210
[ca4d9f40] [c0010b70] ret_from_syscall+0x0/0x4

Cc: <stable at vger.kernel.org> 
Signed-off-by: Chen Jie <chenjie6 at huawei.com>

---
 fs/jffs2/dir.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/fs/jffs2/dir.c b/fs/jffs2/dir.c
index 9385560..feb0213 100644
--- a/fs/jffs2/dir.c
+++ b/fs/jffs2/dir.c
@@ -846,7 +846,8 @@ static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
 		pr_notice("%s(): Link succeeded, unlink failed (err %d). You now have a hard link\n",
 			  __func__, ret);
 		/* Might as well let the VFS know */
-		d_instantiate(new_dentry, old_dentry->d_inode);
+		if (list_empty(&new_dentry->d_alias))
+			d_instantiate(new_dentry, old_dentry->d_inode);
 		ihold(old_dentry->d_inode);
 		new_dir_i->i_mtime = new_dir_i->i_ctime = ITIME(now);
 		return ret;
-- 
1.8.0




More information about the linux-mtd mailing list