nfsd-6.10 fixes:
- Fix crashes triggered by administrative operations on the server -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEKLLlsBKG3yQ88j7+M2qzM29mf5cFAmZ2/VgACgkQM2qzM29m f5d+tA/+OoNtrNfaGrrXjmKte0eLLQzX4o1IbvQPcydqEQwHFIpCNXGQXdzrjYzg ChICf2/IKH7Dl9dOTp0QMsZbTnGORDHcImjaWBck//ObYopLOk8e+pJs2VypX+uE O5gIFnpFapP2IZRFiEolzOx5x73wWE7/tJYMzL5sDsV/bHavIR3abH/hBkF/1E7N wSCcZuBfGm0pRWJS+KI8Bwa+dVbpq80Y8ITZ3S+gQEH0nHTEw9VxpmV0oQjQinV5 aCBegPXSBDuc2SX7KNLoHVqVX9x/htAnV5BcjbViEqhyakoa+ANIJb7LaOx/lZ2J 9CB1lP1FPmw0AVwu4krvdnJncIGlZJPEK7eLv5cAaxNK6jb48Gv0pul5tvMphEym +6qw0bqalXvsvoSQFMeidVUvvkDC2fxqHBI0N8w5LVKzbYiv3JUTy3WLt/f6sd0F nXWgUhYGgMT62KBxyEI0f2ip38Qb2JjRrSWcKXi5D/2TfLgL5GqbRloFmX8nx6+p 9RuYeFFNGzS6qWfYljR41lTgkD0nU0/MF9GiRn+8JvqHrACXi3z9oQ8V5jlye+HW PrpBvYDqrDMzBiH22H095jtgo7YK+xib87wy9ql4BxrygHCg55czLiSTZliHC1iA z8dGtwusFayuTaD21FytD00DkVDJQAlsahhQPfyaUOR0mcrWVR4= =LCB+ -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
c2fc946223
@ -123,8 +123,6 @@ operations:
|
||||
doc: dump pending nfsd rpc
|
||||
attribute-set: rpc-status
|
||||
dump:
|
||||
pre: nfsd-nl-rpc-status-get-start
|
||||
post: nfsd-nl-rpc-status-get-done
|
||||
reply:
|
||||
attributes:
|
||||
- xid
|
||||
|
@ -44,9 +44,7 @@ static const struct nla_policy nfsd_listener_set_nl_policy[NFSD_A_SERVER_SOCK_AD
|
||||
static const struct genl_split_ops nfsd_nl_ops[] = {
|
||||
{
|
||||
.cmd = NFSD_CMD_RPC_STATUS_GET,
|
||||
.start = nfsd_nl_rpc_status_get_start,
|
||||
.dumpit = nfsd_nl_rpc_status_get_dumpit,
|
||||
.done = nfsd_nl_rpc_status_get_done,
|
||||
.flags = GENL_CMD_CAP_DUMP,
|
||||
},
|
||||
{
|
||||
|
@ -15,9 +15,6 @@
|
||||
extern const struct nla_policy nfsd_sock_nl_policy[NFSD_A_SOCK_TRANSPORT_NAME + 1];
|
||||
extern const struct nla_policy nfsd_version_nl_policy[NFSD_A_VERSION_ENABLED + 1];
|
||||
|
||||
int nfsd_nl_rpc_status_get_start(struct netlink_callback *cb);
|
||||
int nfsd_nl_rpc_status_get_done(struct netlink_callback *cb);
|
||||
|
||||
int nfsd_nl_rpc_status_get_dumpit(struct sk_buff *skb,
|
||||
struct netlink_callback *cb);
|
||||
int nfsd_nl_threads_set_doit(struct sk_buff *skb, struct genl_info *info);
|
||||
|
@ -1460,28 +1460,6 @@ static int create_proc_exports_entry(void)
|
||||
|
||||
unsigned int nfsd_net_id;
|
||||
|
||||
/**
|
||||
* nfsd_nl_rpc_status_get_start - Prepare rpc_status_get dumpit
|
||||
* @cb: netlink metadata and command arguments
|
||||
*
|
||||
* Return values:
|
||||
* %0: The rpc_status_get command may proceed
|
||||
* %-ENODEV: There is no NFSD running in this namespace
|
||||
*/
|
||||
int nfsd_nl_rpc_status_get_start(struct netlink_callback *cb)
|
||||
{
|
||||
struct nfsd_net *nn = net_generic(sock_net(cb->skb->sk), nfsd_net_id);
|
||||
int ret = -ENODEV;
|
||||
|
||||
mutex_lock(&nfsd_mutex);
|
||||
if (nn->nfsd_serv)
|
||||
ret = 0;
|
||||
else
|
||||
mutex_unlock(&nfsd_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int nfsd_genl_rpc_status_compose_msg(struct sk_buff *skb,
|
||||
struct netlink_callback *cb,
|
||||
struct nfsd_genl_rqstp *rqstp)
|
||||
@ -1558,8 +1536,16 @@ static int nfsd_genl_rpc_status_compose_msg(struct sk_buff *skb,
|
||||
int nfsd_nl_rpc_status_get_dumpit(struct sk_buff *skb,
|
||||
struct netlink_callback *cb)
|
||||
{
|
||||
struct nfsd_net *nn = net_generic(sock_net(skb->sk), nfsd_net_id);
|
||||
int i, ret, rqstp_index = 0;
|
||||
struct nfsd_net *nn;
|
||||
|
||||
mutex_lock(&nfsd_mutex);
|
||||
|
||||
nn = net_generic(sock_net(skb->sk), nfsd_net_id);
|
||||
if (!nn->nfsd_serv) {
|
||||
ret = -ENODEV;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
@ -1636,22 +1622,10 @@ int nfsd_nl_rpc_status_get_dumpit(struct sk_buff *skb,
|
||||
ret = skb->len;
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* nfsd_nl_rpc_status_get_done - rpc_status_get dumpit post-processing
|
||||
* @cb: netlink metadata and command arguments
|
||||
*
|
||||
* Return values:
|
||||
* %0: Success
|
||||
*/
|
||||
int nfsd_nl_rpc_status_get_done(struct netlink_callback *cb)
|
||||
{
|
||||
out_unlock:
|
||||
mutex_unlock(&nfsd_mutex);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1421,12 +1421,13 @@ static void *svc_pool_stats_start(struct seq_file *m, loff_t *pos)
|
||||
|
||||
dprintk("svc_pool_stats_start, *pidx=%u\n", pidx);
|
||||
|
||||
if (!si->serv)
|
||||
return NULL;
|
||||
|
||||
mutex_lock(si->mutex);
|
||||
|
||||
if (!pidx)
|
||||
return SEQ_START_TOKEN;
|
||||
if (!si->serv)
|
||||
return NULL;
|
||||
return pidx > si->serv->sv_nrpools ? NULL
|
||||
: &si->serv->sv_pools[pidx - 1];
|
||||
}
|
||||
@ -1458,7 +1459,8 @@ static void svc_pool_stats_stop(struct seq_file *m, void *p)
|
||||
{
|
||||
struct svc_info *si = m->private;
|
||||
|
||||
mutex_unlock(si->mutex);
|
||||
if (si->serv)
|
||||
mutex_unlock(si->mutex);
|
||||
}
|
||||
|
||||
static int svc_pool_stats_show(struct seq_file *m, void *p)
|
||||
|
Loading…
Reference in New Issue
Block a user