Whamcloud - gitweb
git://git.whamcloud.com
/
fs
/
lustre-release.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
d5349d9
)
LU-5458: libcfs: protect kkuc_groups from write access
55/11355/4
author
Frank Zago
<fzago@cray.com>
Wed, 6 Aug 2014 20:03:42 +0000
(15:03 -0500)
committer
Oleg Drokin
<oleg.drokin@intel.com>
Mon, 6 Oct 2014 00:49:37 +0000
(
00:49
+0000)
Since reg->kr_fp can be changed inside the foreach loop,
kkuc_groups must be write protected, and not just read protected.
This should fix the following oops, which could happen if two different
threads simultaneously execute the function, and EPIPE is returned.
PID: 24385 TASK:
ffff88012da5f500
CPU: 1 COMMAND: "ldlm_cb00_056"
#0 [
ffff88012db55810
] machine_kexec at
ffffffff81038f3b
#1 [
ffff88012db55870
] crash_kexec at
ffffffff810c59f2
#2 [
ffff88012db55940
] oops_end at
ffffffff8152b7f0
#3 [
ffff88012db55970
] no_context at
ffffffff8104a00b
#4 [
ffff88012db559c0
] __bad_area_nosemaphore at
ffffffff8104a295
#5 [
ffff88012db55a10
] bad_area_nosemaphore at
ffffffff8104a363
#6 [
ffff88012db55a20
] __do_page_fault at
ffffffff8104aabf
#7 [
ffff88012db55b40
] do_page_fault at
ffffffff8152d73e
#8 [
ffff88012db55b70
] page_fault at
ffffffff8152aaf5
[exception RIP: fput+9]
RIP:
ffffffff8118a509
RSP:
ffff88012db55c20
RFLAGS:
00010246
RAX:
00000000ffffffe0
RBX:
ffff8800a8ea4fc0
RCX:
0000000000000000
RDX:
ffffffffa03c9eb0
RSI:
0000000000000000
RDI:
0000000000000000
RBP:
ffff88012db55c20
R8:
00000000ffffff0a
R9:
00000000fffffffc
R10:
0000000000000001
R11:
282064656c696166
R12:
ffffffffa03c9c60
R13:
ffff88005df240f8
R14:
0000000000000000
R15:
ffff88013b4ca000
ORIG_RAX:
ffffffffffffffff
CS: 0010 SS: 0018
#9 [
ffff88012db55c28
] libcfs_kkuc_group_put at
ffffffffa0388044
[libcfs]
[ptlrpc]
Change-Id: Ifaa861c0778e745f262cba5ab5f5661a3ad4fa9f
Signed-off-by: frank zago <fzago@cray.com>
Reviewed-on: http://review.whamcloud.com/11355
Reviewed-by: Patrick Farrell <paf@cray.com>
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: James Simmons <uja.ornl@gmail.com>
Reviewed-by: Dmitry Eremin <dmitry.eremin@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
libcfs/libcfs/kernel_user_comm.c
patch
|
blob
|
history
diff --git
a/libcfs/libcfs/kernel_user_comm.c
b/libcfs/libcfs/kernel_user_comm.c
index
1c5e0ee
..
5ac789e
100644
(file)
--- a/
libcfs/libcfs/kernel_user_comm.c
+++ b/
libcfs/libcfs/kernel_user_comm.c
@@
-306,7
+306,7
@@
int libcfs_kkuc_group_put(int group, void *payload)
int one_success = 0;
ENTRY;
- down_
read
(&kg_sem);
+ down_
write
(&kg_sem);
list_for_each_entry(reg, &kkuc_groups[group], kr_chain) {
if (reg->kr_fp != NULL) {
rc = libcfs_kkuc_msg_put(reg->kr_fp, payload);
@@
-318,7
+318,7
@@
int libcfs_kkuc_group_put(int group, void *payload)
}
}
}
- up_
read
(&kg_sem);
+ up_
write
(&kg_sem);
/* don't return an error if the message has been delivered
* at least to one agent */