mirror of
https://github.com/torvalds/linux
synced 2024-10-01 17:00:41 +00:00
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
|
doc: dump pending nfsd rpc
|
||||||
attribute-set: rpc-status
|
attribute-set: rpc-status
|
||||||
dump:
|
dump:
|
||||||
pre: nfsd-nl-rpc-status-get-start
|
|
||||||
post: nfsd-nl-rpc-status-get-done
|
|
||||||
reply:
|
reply:
|
||||||
attributes:
|
attributes:
|
||||||
- xid
|
- 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[] = {
|
static const struct genl_split_ops nfsd_nl_ops[] = {
|
||||||
{
|
{
|
||||||
.cmd = NFSD_CMD_RPC_STATUS_GET,
|
.cmd = NFSD_CMD_RPC_STATUS_GET,
|
||||||
.start = nfsd_nl_rpc_status_get_start,
|
|
||||||
.dumpit = nfsd_nl_rpc_status_get_dumpit,
|
.dumpit = nfsd_nl_rpc_status_get_dumpit,
|
||||||
.done = nfsd_nl_rpc_status_get_done,
|
|
||||||
.flags = GENL_CMD_CAP_DUMP,
|
.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_sock_nl_policy[NFSD_A_SOCK_TRANSPORT_NAME + 1];
|
||||||
extern const struct nla_policy nfsd_version_nl_policy[NFSD_A_VERSION_ENABLED + 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,
|
int nfsd_nl_rpc_status_get_dumpit(struct sk_buff *skb,
|
||||||
struct netlink_callback *cb);
|
struct netlink_callback *cb);
|
||||||
int nfsd_nl_threads_set_doit(struct sk_buff *skb, struct genl_info *info);
|
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;
|
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,
|
static int nfsd_genl_rpc_status_compose_msg(struct sk_buff *skb,
|
||||||
struct netlink_callback *cb,
|
struct netlink_callback *cb,
|
||||||
struct nfsd_genl_rqstp *rqstp)
|
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,
|
int nfsd_nl_rpc_status_get_dumpit(struct sk_buff *skb,
|
||||||
struct netlink_callback *cb)
|
struct netlink_callback *cb)
|
||||||
{
|
{
|
||||||
struct nfsd_net *nn = net_generic(sock_net(skb->sk), nfsd_net_id);
|
|
||||||
int i, ret, rqstp_index = 0;
|
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();
|
rcu_read_lock();
|
||||||
|
|
||||||
|
@ -1636,22 +1622,10 @@ int nfsd_nl_rpc_status_get_dumpit(struct sk_buff *skb,
|
||||||
ret = skb->len;
|
ret = skb->len;
|
||||||
out:
|
out:
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
out_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)
|
|
||||||
{
|
|
||||||
mutex_unlock(&nfsd_mutex);
|
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);
|
dprintk("svc_pool_stats_start, *pidx=%u\n", pidx);
|
||||||
|
|
||||||
|
if (!si->serv)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
mutex_lock(si->mutex);
|
mutex_lock(si->mutex);
|
||||||
|
|
||||||
if (!pidx)
|
if (!pidx)
|
||||||
return SEQ_START_TOKEN;
|
return SEQ_START_TOKEN;
|
||||||
if (!si->serv)
|
|
||||||
return NULL;
|
|
||||||
return pidx > si->serv->sv_nrpools ? NULL
|
return pidx > si->serv->sv_nrpools ? NULL
|
||||||
: &si->serv->sv_pools[pidx - 1];
|
: &si->serv->sv_pools[pidx - 1];
|
||||||
}
|
}
|
||||||
|
@ -1458,6 +1459,7 @@ static void svc_pool_stats_stop(struct seq_file *m, void *p)
|
||||||
{
|
{
|
||||||
struct svc_info *si = m->private;
|
struct svc_info *si = m->private;
|
||||||
|
|
||||||
|
if (si->serv)
|
||||||
mutex_unlock(si->mutex);
|
mutex_unlock(si->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue