projects
/
openwrt
/
staging
/
blogic.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
db59c0e
)
NFSD: Error out when register_shrinker() fail
author
Kinglong Mee
<kinglongmee@gmail.com>
Thu, 19 Mar 2015 11:48:31 +0000
(19:48 +0800)
committer
J. Bruce Fields
<bfields@redhat.com>
Fri, 20 Mar 2015 16:44:00 +0000
(12:44 -0400)
If register_shrinker() failed, nfsd will cause a NULL pointer access as,
[ 9250.875465] nfsd: last server has exited, flushing export cache
[ 9251.427270] BUG: unable to handle kernel NULL pointer dereference at (null)
[ 9251.427393] IP: [<
ffffffff8136fc29
>] __list_del_entry+0x29/0xd0
[ 9251.427579] PGD
13e4d067
PUD
13e4c067
PMD 0
[ 9251.427633] Oops: 0000 [#1] SMP DEBUG_PAGEALLOC
[ 9251.427706] Modules linked in: ip6t_rpfilter ip6t_REJECT bnep bluetooth xt_conntrack cfg80211 rfkill ebtable_nat ebtable_broute bridge stp llc ebtable_filter ebtables ip6table_nat nf_conntrack_ipv6 nf_defrag_ipv6 nf_nat_ipv6 ip6table_mangle ip6table_security ip6table_raw ip6table_filter ip6_tables iptable_nat nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat_ipv4 nf_nat nf_conntrack iptable_mangle iptable_security iptable_raw btrfs xfs microcode ppdev serio_raw pcspkr xor libcrc32c raid6_pq e1000 parport_pc parport i2c_piix4 i2c_core nfsd(OE-) auth_rpcgss nfs_acl lockd sunrpc(E) ata_generic pata_acpi
[ 9251.428240] CPU: 0 PID: 1557 Comm: rmmod Tainted: G OE 3.16.0-rc2+ #22
[ 9251.428366] Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 07/31/2013
[ 9251.428496] task:
ffff880000849540
ti:
ffff8800136f4000
task.ti:
ffff8800136f4000
[ 9251.428593] RIP: 0010:[<
ffffffff8136fc29
>] [<
ffffffff8136fc29
>] __list_del_entry+0x29/0xd0
[ 9251.428696] RSP: 0018:
ffff8800136f7ea0
EFLAGS:
00010207
[ 9251.428751] RAX:
0000000000000000
RBX:
ffffffffa0116d48
RCX:
dead000000200200
[ 9251.428814] RDX:
0000000000000000
RSI:
0000000000000000
RDI:
ffffffffa0116d48
[ 9251.428876] RBP:
ffff8800136f7ea0
R08:
ffff8800136f4000
R09:
0000000000000001
[ 9251.428939] R10:
8080808080808080
R11:
0000000000000000
R12:
ffffffffa011a5a0
[ 9251.429002] R13:
0000000000000800
R14:
0000000000000000
R15:
00000000018ac090
[ 9251.429064] FS:
00007fb9acef0740
(0000) GS:
ffff88003fa00000
(0000) knlGS:
0000000000000000
[ 9251.429164] CS: 0010 DS: 0000 ES: 0000 CR0:
0000000080050033
[ 9251.429221] CR2:
0000000000000000
CR3:
0000000031a17000
CR4:
00000000001407f0
[ 9251.429306] Stack:
[ 9251.429410]
ffff8800136f7eb8
ffffffff8136fcdd
ffffffffa0116d20
ffff8800136f7ed0
[ 9251.429511]
ffffffff8118a0f2
0000000000000000
ffff8800136f7ee0
ffffffffa00eb765
[ 9251.429610]
ffff8800136f7ef0
ffffffffa010e93c
ffff8800136f7f78
ffffffff81104ac2
[ 9251.429709] Call Trace:
[ 9251.429755] [<
ffffffff8136fcdd
>] list_del+0xd/0x30
[ 9251.429896] [<
ffffffff8118a0f2
>] unregister_shrinker+0x22/0x40
[ 9251.430037] [<
ffffffffa00eb765
>] nfsd_reply_cache_shutdown+0x15/0x90 [nfsd]
[ 9251.430106] [<
ffffffffa010e93c
>] exit_nfsd+0x9/0x6cd [nfsd]
[ 9251.430192] [<
ffffffff81104ac2
>] SyS_delete_module+0x162/0x200
[ 9251.430280] [<
ffffffff81013b69
>] ? do_notify_resume+0x59/0x90
[ 9251.430395] [<
ffffffff816f2369
>] system_call_fastpath+0x16/0x1b
[ 9251.430457] Code: 00 00 55 48 8b 17 48 b9 00 01 10 00 00 00 ad de 48 8b 47 08 48 89 e5 48 39 ca 74 29 48 b9 00 02 20 00 00 00 ad de 48 39 c8 74 7a <4c> 8b 00 4c 39 c7 75 53 4c 8b 42 08 4c 39 c7 75 2b 48 89 42 08
[ 9251.430691] RIP [<
ffffffff8136fc29
>] __list_del_entry+0x29/0xd0
[ 9251.430755] RSP <
ffff8800136f7ea0
>
[ 9251.430805] CR2:
0000000000000000
[ 9251.431033] ---[ end trace
080f3050d082b4ea
]---
Signed-off-by: Kinglong Mee <kinglongmee@gmail.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfscache.c
patch
|
blob
|
history
diff --git
a/fs/nfsd/nfscache.c
b/fs/nfsd/nfscache.c
index 83a9694ec485b0593e3de847464243640fcd7186..46ec934f5dee8c529020558bed4cd820956734f1 100644
(file)
--- a/
fs/nfsd/nfscache.c
+++ b/
fs/nfsd/nfscache.c
@@
-165,13
+165,17
@@
int nfsd_reply_cache_init(void)
{
unsigned int hashsize;
unsigned int i;
+ int status = 0;
max_drc_entries = nfsd_cache_size_limit();
atomic_set(&num_drc_entries, 0);
hashsize = nfsd_hashsize(max_drc_entries);
maskbits = ilog2(hashsize);
- register_shrinker(&nfsd_reply_cache_shrinker);
+ status = register_shrinker(&nfsd_reply_cache_shrinker);
+ if (status)
+ return status;
+
drc_slab = kmem_cache_create("nfsd_drc", sizeof(struct svc_cacherep),
0, 0, NULL);
if (!drc_slab)