Skip to content

Commit da2c8fe

Browse files
LorenzoBianconichucklever
authored andcommitted
NFSD: grab nfsd_mutex in nfsd_nl_rpc_status_get_dumpit()
Grab nfsd_mutex lock in nfsd_nl_rpc_status_get_dumpit routine and remove nfsd_nl_rpc_status_get_start() and nfsd_nl_rpc_status_get_done(). This patch fix the syzbot log reported below: INFO: task syz-executor.1:17770 blocked for more than 143 seconds. Not tainted 6.10.0-rc3-syzkaller-00022-gcea2a26553ac #0 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. task:syz-executor.1 state:D stack:23800 pid:17770 tgid:17767 ppid:11381 flags:0x00000006 Call Trace: <TASK> context_switch kernel/sched/core.c:5408 [inline] __schedule+0x17e8/0x4a20 kernel/sched/core.c:6745 __schedule_loop kernel/sched/core.c:6822 [inline] schedule+0x14b/0x320 kernel/sched/core.c:6837 schedule_preempt_disabled+0x13/0x30 kernel/sched/core.c:6894 __mutex_lock_common kernel/locking/mutex.c:684 [inline] __mutex_lock+0x6a4/0xd70 kernel/locking/mutex.c:752 nfsd_nl_listener_get_doit+0x115/0x5d0 fs/nfsd/nfsctl.c:2124 genl_family_rcv_msg_doit net/netlink/genetlink.c:1115 [inline] genl_family_rcv_msg net/netlink/genetlink.c:1195 [inline] genl_rcv_msg+0xb16/0xec0 net/netlink/genetlink.c:1210 netlink_rcv_skb+0x1e5/0x430 net/netlink/af_netlink.c:2564 genl_rcv+0x28/0x40 net/netlink/genetlink.c:1219 netlink_unicast_kernel net/netlink/af_netlink.c:1335 [inline] netlink_unicast+0x7ec/0x980 net/netlink/af_netlink.c:1361 netlink_sendmsg+0x8db/0xcb0 net/netlink/af_netlink.c:1905 sock_sendmsg_nosec net/socket.c:730 [inline] __sock_sendmsg+0x223/0x270 net/socket.c:745 ____sys_sendmsg+0x525/0x7d0 net/socket.c:2585 ___sys_sendmsg net/socket.c:2639 [inline] __sys_sendmsg+0x2b0/0x3a0 net/socket.c:2668 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7f24ed27cea9 RSP: 002b:00007f24ee0080c8 EFLAGS: 00000246 ORIG_RAX: 000000000000002e RAX: ffffffffffffffda RBX: 00007f24ed3b3f80 RCX: 00007f24ed27cea9 RDX: 0000000000000000 RSI: 0000000020000100 RDI: 0000000000000005 RBP: 00007f24ed2ebff4 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000 Fixes: 1bd773b ("nfsd: hold nfsd_mutex across entire netlink operation") Fixes: bd9d6a3 ("NFSD: add rpc_status netlink support") Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
1 parent 8e948c3 commit da2c8fe

File tree

4 files changed

+11
-44
lines changed

4 files changed

+11
-44
lines changed

Documentation/netlink/specs/nfsd.yaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,6 @@ operations:
123123
doc: dump pending nfsd rpc
124124
attribute-set: rpc-status
125125
dump:
126-
pre: nfsd-nl-rpc-status-get-start
127-
post: nfsd-nl-rpc-status-get-done
128126
reply:
129127
attributes:
130128
- xid

fs/nfsd/netlink.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,7 @@ static const struct nla_policy nfsd_listener_set_nl_policy[NFSD_A_SERVER_SOCK_AD
4444
static const struct genl_split_ops nfsd_nl_ops[] = {
4545
{
4646
.cmd = NFSD_CMD_RPC_STATUS_GET,
47-
.start = nfsd_nl_rpc_status_get_start,
4847
.dumpit = nfsd_nl_rpc_status_get_dumpit,
49-
.done = nfsd_nl_rpc_status_get_done,
5048
.flags = GENL_CMD_CAP_DUMP,
5149
},
5250
{

fs/nfsd/netlink.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@
1515
extern const struct nla_policy nfsd_sock_nl_policy[NFSD_A_SOCK_TRANSPORT_NAME + 1];
1616
extern const struct nla_policy nfsd_version_nl_policy[NFSD_A_VERSION_ENABLED + 1];
1717

18-
int nfsd_nl_rpc_status_get_start(struct netlink_callback *cb);
19-
int nfsd_nl_rpc_status_get_done(struct netlink_callback *cb);
20-
2118
int nfsd_nl_rpc_status_get_dumpit(struct sk_buff *skb,
2219
struct netlink_callback *cb);
2320
int nfsd_nl_threads_set_doit(struct sk_buff *skb, struct genl_info *info);

fs/nfsd/nfsctl.c

Lines changed: 11 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1460,28 +1460,6 @@ static int create_proc_exports_entry(void)
14601460

14611461
unsigned int nfsd_net_id;
14621462

1463-
/**
1464-
* nfsd_nl_rpc_status_get_start - Prepare rpc_status_get dumpit
1465-
* @cb: netlink metadata and command arguments
1466-
*
1467-
* Return values:
1468-
* %0: The rpc_status_get command may proceed
1469-
* %-ENODEV: There is no NFSD running in this namespace
1470-
*/
1471-
int nfsd_nl_rpc_status_get_start(struct netlink_callback *cb)
1472-
{
1473-
struct nfsd_net *nn = net_generic(sock_net(cb->skb->sk), nfsd_net_id);
1474-
int ret = -ENODEV;
1475-
1476-
mutex_lock(&nfsd_mutex);
1477-
if (nn->nfsd_serv)
1478-
ret = 0;
1479-
else
1480-
mutex_unlock(&nfsd_mutex);
1481-
1482-
return ret;
1483-
}
1484-
14851463
static int nfsd_genl_rpc_status_compose_msg(struct sk_buff *skb,
14861464
struct netlink_callback *cb,
14871465
struct nfsd_genl_rqstp *rqstp)
@@ -1558,8 +1536,16 @@ static int nfsd_genl_rpc_status_compose_msg(struct sk_buff *skb,
15581536
int nfsd_nl_rpc_status_get_dumpit(struct sk_buff *skb,
15591537
struct netlink_callback *cb)
15601538
{
1561-
struct nfsd_net *nn = net_generic(sock_net(skb->sk), nfsd_net_id);
15621539
int i, ret, rqstp_index = 0;
1540+
struct nfsd_net *nn;
1541+
1542+
mutex_lock(&nfsd_mutex);
1543+
1544+
nn = net_generic(sock_net(skb->sk), nfsd_net_id);
1545+
if (!nn->nfsd_serv) {
1546+
ret = -ENODEV;
1547+
goto out_unlock;
1548+
}
15631549

15641550
rcu_read_lock();
15651551

@@ -1636,22 +1622,10 @@ int nfsd_nl_rpc_status_get_dumpit(struct sk_buff *skb,
16361622
ret = skb->len;
16371623
out:
16381624
rcu_read_unlock();
1639-
1640-
return ret;
1641-
}
1642-
1643-
/**
1644-
* nfsd_nl_rpc_status_get_done - rpc_status_get dumpit post-processing
1645-
* @cb: netlink metadata and command arguments
1646-
*
1647-
* Return values:
1648-
* %0: Success
1649-
*/
1650-
int nfsd_nl_rpc_status_get_done(struct netlink_callback *cb)
1651-
{
1625+
out_unlock:
16521626
mutex_unlock(&nfsd_mutex);
16531627

1654-
return 0;
1628+
return ret;
16551629
}
16561630

16571631
/**

0 commit comments

Comments
 (0)