projects
/
linux.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
ac228fb
)
nfs_common: need lock during iterate through the list
author
Cheng Lin
<cheng.lin130@zte.com.cn>
Tue, 1 Dec 2020 12:06:35 +0000
(07:06 -0500)
committer
Greg Kroah-Hartman
<gregkh@linuxfoundation.org>
Wed, 30 Dec 2020 10:53:45 +0000
(11:53 +0100)
[ Upstream commit
4a9d81caf841cd2c0ae36abec9c2963bf21d0284
]
If the elem is deleted during be iterated on it, the iteration
process will fall into an endless loop.
kernel: NMI watchdog: BUG: soft lockup - CPU#4 stuck for 22s! [nfsd:17137]
PID: 17137 TASK:
ffff8818d93c0000
CPU: 4 COMMAND: "nfsd"
[exception RIP: __state_in_grace+76]
RIP:
ffffffffc00e817c
RSP:
ffff8818d3aefc98
RFLAGS:
00000246
RAX:
ffff881dc0c38298
RBX:
ffffffff81b03580
RCX:
ffff881dc02c9f50
RDX:
ffff881e3fce8500
RSI:
0000000000000001
RDI:
ffffffff81b03580
RBP:
ffff8818d3aefca0
R8:
0000000000000020
R9:
ffff8818d3aefd40
R10:
ffff88017fc03800
R11:
ffff8818e83933c0
R12:
ffff8818d3aefd40
R13:
0000000000000000
R14:
ffff8818e8391068
R15:
ffff8818fa6e4000
CS: 0010 SS: 0018
#0 [
ffff8818d3aefc98
] opens_in_grace at
ffffffffc00e81e3
[grace]
#1 [
ffff8818d3aefca8
] nfs4_preprocess_stateid_op at
ffffffffc02a3e6c
[nfsd]
#2 [
ffff8818d3aefd18
] nfsd4_write at
ffffffffc028ed5b
[nfsd]
#3 [
ffff8818d3aefd80
] nfsd4_proc_compound at
ffffffffc0290a0d
[nfsd]
#4 [
ffff8818d3aefdd0
] nfsd_dispatch at
ffffffffc027b800
[nfsd]
#5 [
ffff8818d3aefe08
] svc_process_common at
ffffffffc02017f3
[sunrpc]
#6 [
ffff8818d3aefe70
] svc_process at
ffffffffc0201ce3
[sunrpc]
#7 [
ffff8818d3aefe98
] nfsd at
ffffffffc027b117
[nfsd]
#8 [
ffff8818d3aefec8
] kthread at
ffffffff810b88c1
#9 [
ffff8818d3aeff50
] ret_from_fork at
ffffffff816d1607
The troublemake elem:
crash> lock_manager
ffff881dc0c38298
struct lock_manager {
list = {
next = 0xffff881dc0c38298,
prev = 0xffff881dc0c38298
},
block_opens = false
}
Fixes:
c87fb4a378f9
("lockd: NLM grace period shouldn't block NFSv4 opens")
Signed-off-by: Cheng Lin <cheng.lin130@zte.com.cn>
Signed-off-by: Yi Wang <wang.yi59@zte.com.cn>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/nfs_common/grace.c
patch
|
blob
|
history
diff --git
a/fs/nfs_common/grace.c
b/fs/nfs_common/grace.c
index
b73d9dd
..
26f2a50
100644
(file)
--- a/
fs/nfs_common/grace.c
+++ b/
fs/nfs_common/grace.c
@@
-69,10
+69,14
@@
__state_in_grace(struct net *net, bool open)
if (!open)
return !list_empty(grace_list);
+ spin_lock(&grace_lock);
list_for_each_entry(lm, grace_list, list) {
- if (lm->block_opens)
+ if (lm->block_opens) {
+ spin_unlock(&grace_lock);
return true;
+ }
}
+ spin_unlock(&grace_lock);
return false;
}