Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'nfsd-6.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux

Pull nfsd fixes from Chuck Lever:

- Fix crashes triggered by administrative operations on the server

* tag 'nfsd-6.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux:
NFSD: grab nfsd_mutex in nfsd_nl_rpc_status_get_dumpit()
nfsd: fix oops when reading pool_stats before server is started

+16 -47
-2
Documentation/netlink/specs/nfsd.yaml
··· 123 123 doc: dump pending nfsd rpc 124 124 attribute-set: rpc-status 125 125 dump: 126 - pre: nfsd-nl-rpc-status-get-start 127 - post: nfsd-nl-rpc-status-get-done 128 126 reply: 129 127 attributes: 130 128 - xid
-2
fs/nfsd/netlink.c
··· 44 44 static const struct genl_split_ops nfsd_nl_ops[] = { 45 45 { 46 46 .cmd = NFSD_CMD_RPC_STATUS_GET, 47 - .start = nfsd_nl_rpc_status_get_start, 48 47 .dumpit = nfsd_nl_rpc_status_get_dumpit, 49 - .done = nfsd_nl_rpc_status_get_done, 50 48 .flags = GENL_CMD_CAP_DUMP, 51 49 }, 52 50 {
-3
fs/nfsd/netlink.h
··· 15 15 extern const struct nla_policy nfsd_sock_nl_policy[NFSD_A_SOCK_TRANSPORT_NAME + 1]; 16 16 extern const struct nla_policy nfsd_version_nl_policy[NFSD_A_VERSION_ENABLED + 1]; 17 17 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 - 21 18 int nfsd_nl_rpc_status_get_dumpit(struct sk_buff *skb, 22 19 struct netlink_callback *cb); 23 20 int nfsd_nl_threads_set_doit(struct sk_buff *skb, struct genl_info *info);
+11 -37
fs/nfsd/nfsctl.c
··· 1460 1460 1461 1461 unsigned int nfsd_net_id; 1462 1462 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 - 1485 1463 static int nfsd_genl_rpc_status_compose_msg(struct sk_buff *skb, 1486 1464 struct netlink_callback *cb, 1487 1465 struct nfsd_genl_rqstp *rqstp) ··· 1536 1558 int nfsd_nl_rpc_status_get_dumpit(struct sk_buff *skb, 1537 1559 struct netlink_callback *cb) 1538 1560 { 1539 - struct nfsd_net *nn = net_generic(sock_net(skb->sk), nfsd_net_id); 1540 1561 int i, ret, rqstp_index = 0; 1562 + struct nfsd_net *nn; 1563 + 1564 + mutex_lock(&nfsd_mutex); 1565 + 1566 + nn = net_generic(sock_net(skb->sk), nfsd_net_id); 1567 + if (!nn->nfsd_serv) { 1568 + ret = -ENODEV; 1569 + goto out_unlock; 1570 + } 1541 1571 1542 1572 rcu_read_lock(); 1543 1573 ··· 1622 1636 ret = skb->len; 1623 1637 out: 1624 1638 rcu_read_unlock(); 1625 - 1626 - return ret; 1627 - } 1628 - 1629 - /** 1630 - * nfsd_nl_rpc_status_get_done - rpc_status_get dumpit post-processing 1631 - * @cb: netlink metadata and command arguments 1632 - * 1633 - * Return values: 1634 - * %0: Success 1635 - */ 1636 - int nfsd_nl_rpc_status_get_done(struct netlink_callback *cb) 1637 - { 1639 + out_unlock: 1638 1640 mutex_unlock(&nfsd_mutex); 1639 1641 1640 - return 0; 1642 + return ret; 1641 1643 } 1642 1644 1643 1645 /**
+5 -3
net/sunrpc/svc_xprt.c
··· 1421 1421 1422 1422 dprintk("svc_pool_stats_start, *pidx=%u\n", pidx); 1423 1423 1424 + if (!si->serv) 1425 + return NULL; 1426 + 1424 1427 mutex_lock(si->mutex); 1425 1428 1426 1429 if (!pidx) 1427 1430 return SEQ_START_TOKEN; 1428 - if (!si->serv) 1429 - return NULL; 1430 1431 return pidx > si->serv->sv_nrpools ? NULL 1431 1432 : &si->serv->sv_pools[pidx - 1]; 1432 1433 } ··· 1459 1458 { 1460 1459 struct svc_info *si = m->private; 1461 1460 1462 - mutex_unlock(si->mutex); 1461 + if (si->serv) 1462 + mutex_unlock(si->mutex); 1463 1463 } 1464 1464 1465 1465 static int svc_pool_stats_show(struct seq_file *m, void *p)