Nicholas Bellinger
0ad134d81c
configfs: Fix race between create_link and configfs_rmdir
...
commit ba80aa909c99802c428682c352b0ee0baac0acd3 upstream.
This patch closes a long standing race in configfs between
the creation of a new symlink in create_link(), while the
symlink target's config_item is being concurrently removed
via configfs_rmdir().
This can happen because the symlink target's reference
is obtained by config_item_get() in create_link() before
the CONFIGFS_USET_DROPPING bit set by configfs_detach_prep()
during configfs_rmdir() shutdown is actually checked..
This originally manifested itself on ppc64 on v4.8.y under
heavy load using ibmvscsi target ports with Novalink API:
[ 7877.289863] rpadlpar_io: slot U8247.22L.212A91A-V1-C8 added
[ 7879.893760] ------------[ cut here ]------------
[ 7879.893768] WARNING: CPU: 15 PID: 17585 at ./include/linux/kref.h:46 config_item_get+0x7c/0x90 [configfs]
[ 7879.893811] CPU: 15 PID: 17585 Comm: targetcli Tainted: G O 4.8.17-customv2.22 #12
[ 7879.893812] task: c00000018a0d3400 task.stack: c0000001f3b40000
[ 7879.893813] NIP: d000000002c664ec LR: d000000002c60980 CTR: c000000000b70870
[ 7879.893814] REGS: c0000001f3b43810 TRAP: 0700 Tainted: G O (4.8.17-customv2.22)
[ 7879.893815] MSR: 8000000000029033 <SF,EE,ME,IR,DR,RI,LE> CR: 28222242 XER: 00000000
[ 7879.893820] CFAR: d000000002c664bc SOFTE: 1
GPR00: d000000002c60980 c0000001f3b43a90 d000000002c70908 c0000000fbc06820
GPR04: c0000001ef1bd900 0000000000000004 0000000000000001 0000000000000000
GPR08: 0000000000000000 0000000000000001 d000000002c69560 d000000002c66d80
GPR12: c000000000b70870 c00000000e798700 c0000001f3b43ca0 c0000001d4949d40
GPR16: c00000014637e1c0 0000000000000000 0000000000000000 c0000000f2392940
GPR20: c0000001f3b43b98 0000000000000041 0000000000600000 0000000000000000
GPR24: fffffffffffff000 0000000000000000 d000000002c60be0 c0000001f1dac490
GPR28: 0000000000000004 0000000000000000 c0000001ef1bd900 c0000000f2392940
[ 7879.893839] NIP [d000000002c664ec] config_item_get+0x7c/0x90 [configfs]
[ 7879.893841] LR [d000000002c60980] check_perm+0x80/0x2e0 [configfs]
[ 7879.893842] Call Trace:
[ 7879.893844] [c0000001f3b43ac0] [d000000002c60980] check_perm+0x80/0x2e0 [configfs]
[ 7879.893847] [c0000001f3b43b10] [c000000000329770] do_dentry_open+0x2c0/0x460
[ 7879.893849] [c0000001f3b43b70] [c000000000344480] path_openat+0x210/0x1490
[ 7879.893851] [c0000001f3b43c80] [c00000000034708c] do_filp_open+0xfc/0x170
[ 7879.893853] [c0000001f3b43db0] [c00000000032b5bc] do_sys_open+0x1cc/0x390
[ 7879.893856] [c0000001f3b43e30] [c000000000009584] system_call+0x38/0xec
[ 7879.893856] Instruction dump:
[ 7879.893858] 409d0014 38210030 e8010010 7c0803a6 4e800020 3d220000 e94981e0 892a0000
[ 7879.893861] 2f890000 409effe0 39200001 992a0000 <0fe00000> 4bffffd0 60000000 60000000
[ 7879.893866] ---[ end trace 14078f0b3b5ad0aa ]---
To close this race, go ahead and obtain the symlink's target
config_item reference only after the existing CONFIGFS_USET_DROPPING
check succeeds.
This way, if configfs_rmdir() wins create_link() will return -ENONET,
and if create_link() wins configfs_rmdir() will return -EBUSY.
Reported-by: Bryant G. Ly <bryantly@linux.vnet.ibm.com>
Tested-by: Bryant G. Ly <bryantly@linux.vnet.ibm.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2017-06-26 07:13:08 +02:00
..
2017-05-14 13:32:54 +02:00
2016-06-07 18:14:32 -07:00
2016-09-30 10:18:37 +02:00
2015-07-04 19:36:06 -07:00
2017-06-14 13:16:24 +02:00
2015-11-16 20:38:43 -05:00
2017-06-14 13:16:24 +02:00
2017-06-17 06:39:35 +02:00
2015-09-10 13:29:01 -07:00
2017-06-26 07:13:08 +02:00
2016-05-04 14:48:41 -07:00
2016-08-16 09:30:49 +02:00
2016-10-22 12:26:56 +02:00
2016-09-15 08:27:47 +02:00
2016-03-03 15:07:09 -08:00
2015-12-12 10:15:34 -08:00
2016-10-31 04:13:58 -06:00
2017-06-14 13:16:24 +02:00
2017-05-25 14:30:11 +02:00
2017-03-15 09:57:15 +08:00
2015-08-07 13:59:24 +02:00
2017-06-17 06:39:37 +02:00
2017-03-12 06:37:28 +01:00
2017-04-30 05:49:28 +02:00
2015-09-10 13:29:01 -07:00
2016-10-31 04:13:58 -06:00
2016-09-30 10:18:39 +02:00
2016-06-01 12:15:54 -07:00
2016-02-25 12:01:22 -08:00
2016-10-28 03:01:34 -04:00
2017-03-12 06:37:26 +01:00
2016-10-31 04:13:58 -06:00
2017-06-14 13:16:24 +02:00
2016-09-24 10:07:36 +02:00
2015-11-11 20:11:28 -08:00
2015-11-06 17:50:42 -08:00
2015-07-04 19:36:06 -07:00
2016-03-16 08:42:59 -07:00
2017-06-17 06:39:38 +02:00
2015-08-13 10:22:06 -04:00
2017-06-14 13:16:24 +02:00
2017-06-14 13:16:24 +02:00
2016-09-30 10:18:37 +02:00
2015-11-06 17:50:42 -08:00
2017-06-14 13:16:24 +02:00
2016-11-10 16:36:34 +01:00
2017-06-17 06:39:38 +02:00
2016-10-28 03:01:27 -04:00
2016-04-12 09:08:56 -07:00
2015-10-16 11:42:28 -07:00
2017-06-14 13:16:24 +02:00
2017-06-17 06:39:38 +02:00
2015-11-13 20:34:33 -05:00
2017-04-12 12:38:33 +02:00
2015-11-23 21:11:08 -05:00
2015-11-04 22:13:45 -05:00
2017-01-26 08:23:48 +01:00
2017-06-14 13:16:24 +02:00
2017-06-14 13:16:24 +02:00
2017-06-14 13:16:27 +02:00
2016-10-07 15:23:47 +02:00
2016-10-22 12:26:56 +02:00
2015-11-10 12:07:22 -08:00
2015-11-11 09:45:24 -08:00
2017-05-20 14:27:01 +02:00
2017-06-14 13:16:24 +02:00
2015-08-05 13:49:35 -07:00
2015-10-23 23:26:43 +02:00
2016-11-18 10:48:34 +01:00
2015-11-16 23:54:45 -08:00
2017-01-19 20:17:21 +01:00
2017-06-14 13:16:24 +02:00
2015-08-17 18:39:46 -04:00
2017-01-06 11:16:14 +01:00
2016-04-12 09:08:58 -07:00
2015-08-07 04:39:40 +03:00
2015-11-05 23:05:32 -08:00
2016-04-12 09:09:04 -07:00
2016-08-10 11:49:30 +02:00
2015-08-17 23:38:10 -04:00
2015-11-16 23:54:45 -08:00
2015-08-12 15:28:45 -05:00
2016-08-10 11:49:27 +02:00
2015-10-15 10:33:21 -04:00
2017-04-30 05:49:28 +02:00
2017-06-14 13:16:24 +02:00
2016-09-15 08:27:49 +02:00
2017-04-30 05:49:28 +02:00
2015-09-11 15:21:34 -07:00
2016-05-18 17:06:48 -07:00
2016-06-07 18:14:35 -07:00
2017-04-30 05:49:28 +02:00
2017-04-30 05:49:28 +02:00
2017-01-26 08:23:47 +01:00
2016-04-12 09:08:55 -07:00
2016-09-07 08:32:43 +02:00
2015-08-07 04:39:40 +03:00
2017-02-23 17:43:09 +01:00
2017-06-14 13:16:24 +02:00
2016-10-28 03:01:32 -04:00
2015-11-06 17:50:42 -08:00
2017-05-08 07:46:01 +02:00
2016-03-16 08:43:01 -07:00
2016-10-22 12:26:56 +02:00
2017-05-20 14:27:01 +02:00