NFS client bugfixes for Linux 5.1
Highlights include: Stable fixes: - Fix nfs4_lock_state refcounting in nfs4_alloc_{lock,unlock}data() - fix mount/umount race in nlmclnt. - NFSv4.1 don't free interrupted slot on open Bugfixes: - Don't let RPC_SOFTCONN tasks time out if the transport is connected - Fix a typo in nfs_init_timeout_values() - Fix layoutstats handling during read failovers - fix uninitialized variable warning -----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJcmobMAAoJEA4mA3inWBJc/7cP+wR19SPLnbPAFnA09LyT2wDu wZI/y4KYcqGX4kW+ZfhvtR91Zy+UzF685NlbY+kH74JH9Wp9o9DJHW6DC//oxAM5 bzMKH4FIY5IEYN6R554QzHHvIzDzJADgdmjwaSjZyYiNQMJ5xnYClkAWBqU4zG4c luTLcYg2cHYic/2bYCVI/SvSSH4Rq93MhttxWgmP0yUm2l3ed+r+ZydQiAyxBFRv 0DN8dM7gltHnbOapKVxttmdNpK7EIDlTdUFupiwZMvsm5OCGcLm09DUUE0oE0d+s bZflhWNtV/0P7zjx0SZTfd3/XKo5PRIzAB2sx4KsqzbnC5kR9fl3royZ0CUgPJYa n7Bb9PJd8AJV+0FK5cyH3KQwL5UokpU7g1pD7MNxUuIM8iDbpZcOfsiKN/ZWVInJ E/eot9/D4kaDvTWQ+EmCzb7bI6yjVo6B27KFVC+ZNunfP1hFz+CrybUHpbraMw+7 okvE9x+qCeeHRKTNGhcFTAEjGFPQX6nomS6MyFUXUriKSy29Fiq9kUem1qFFsPxk c79pYQdu/TUX3sUxjVsOaOr1sS+VJZOrUzGe2/IAZKM86Mu0fQ8W4PTKhqv/ZG+4 oxC4ukHI39cDYcjyUMnpOGgZ3k1w7UcttVKy0fcsfHQJCTfa5kfd+s9mPpCBV3JG GN9QQkWPLud8uoR/85rR =d5ft -----END PGP SIGNATURE----- Merge tag 'nfs-for-5.1-3' of git://git.linux-nfs.org/projects/trondmy/linux-nfs Pull NFS client bugfixes from Trond Myklebust: "Highlights include: Stable fixes: - Fix nfs4_lock_state refcounting in nfs4_alloc_{lock,unlock}data() - fix mount/umount race in nlmclnt. - NFSv4.1 don't free interrupted slot on open Bugfixes: - Don't let RPC_SOFTCONN tasks time out if the transport is connected - Fix a typo in nfs_init_timeout_values() - Fix layoutstats handling during read failovers - fix uninitialized variable warning" * tag 'nfs-for-5.1-3' of git://git.linux-nfs.org/projects/trondmy/linux-nfs: SUNRPC: fix uninitialized variable warning pNFS/flexfiles: Fix layoutstats handling during read failovers NFS: Fix a typo in nfs_init_timeout_values() SUNRPC: Don't let RPC_SOFTCONN tasks time out if the transport is connected NFSv4.1 don't free interrupted slot on open NFS: fix mount/umount race in nlmclnt. NFS: Fix nfs4_lock_state refcounting in nfs4_alloc_{lock,unlock}data()
This commit is contained in:
Коммит
14c741de93
|
@ -290,12 +290,11 @@ void nlmclnt_release_host(struct nlm_host *host)
|
|||
|
||||
WARN_ON_ONCE(host->h_server);
|
||||
|
||||
if (refcount_dec_and_test(&host->h_count)) {
|
||||
if (refcount_dec_and_mutex_lock(&host->h_count, &nlm_host_mutex)) {
|
||||
WARN_ON_ONCE(!list_empty(&host->h_lockowners));
|
||||
WARN_ON_ONCE(!list_empty(&host->h_granted));
|
||||
WARN_ON_ONCE(!list_empty(&host->h_reclaim));
|
||||
|
||||
mutex_lock(&nlm_host_mutex);
|
||||
nlm_destroy_host_locked(host);
|
||||
mutex_unlock(&nlm_host_mutex);
|
||||
}
|
||||
|
|
|
@ -453,7 +453,7 @@ void nfs_init_timeout_values(struct rpc_timeout *to, int proto,
|
|||
case XPRT_TRANSPORT_RDMA:
|
||||
if (retrans == NFS_UNSPEC_RETRANS)
|
||||
to->to_retries = NFS_DEF_TCP_RETRANS;
|
||||
if (timeo == NFS_UNSPEC_TIMEO || to->to_retries == 0)
|
||||
if (timeo == NFS_UNSPEC_TIMEO || to->to_initval == 0)
|
||||
to->to_initval = NFS_DEF_TCP_TIMEO * HZ / 10;
|
||||
if (to->to_initval > NFS_MAX_TCP_TIMEOUT)
|
||||
to->to_initval = NFS_MAX_TCP_TIMEOUT;
|
||||
|
|
|
@ -1289,6 +1289,7 @@ static void ff_layout_io_track_ds_error(struct pnfs_layout_segment *lseg,
|
|||
static int ff_layout_read_done_cb(struct rpc_task *task,
|
||||
struct nfs_pgio_header *hdr)
|
||||
{
|
||||
int new_idx = hdr->pgio_mirror_idx;
|
||||
int err;
|
||||
|
||||
trace_nfs4_pnfs_read(hdr, task->tk_status);
|
||||
|
@ -1307,7 +1308,7 @@ static int ff_layout_read_done_cb(struct rpc_task *task,
|
|||
case -NFS4ERR_RESET_TO_PNFS:
|
||||
if (ff_layout_choose_best_ds_for_read(hdr->lseg,
|
||||
hdr->pgio_mirror_idx + 1,
|
||||
&hdr->pgio_mirror_idx))
|
||||
&new_idx))
|
||||
goto out_layouterror;
|
||||
set_bit(NFS_IOHDR_RESEND_PNFS, &hdr->flags);
|
||||
return task->tk_status;
|
||||
|
@ -1320,7 +1321,9 @@ static int ff_layout_read_done_cb(struct rpc_task *task,
|
|||
|
||||
return 0;
|
||||
out_layouterror:
|
||||
ff_layout_read_record_layoutstats_done(task, hdr);
|
||||
ff_layout_send_layouterror(hdr->lseg);
|
||||
hdr->pgio_mirror_idx = new_idx;
|
||||
out_eagain:
|
||||
rpc_restart_call_prepare(task);
|
||||
return -EAGAIN;
|
||||
|
|
|
@ -2933,7 +2933,8 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,
|
|||
}
|
||||
|
||||
out:
|
||||
nfs4_sequence_free_slot(&opendata->o_res.seq_res);
|
||||
if (!opendata->cancelled)
|
||||
nfs4_sequence_free_slot(&opendata->o_res.seq_res);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -6301,7 +6302,6 @@ static struct nfs4_unlockdata *nfs4_alloc_unlockdata(struct file_lock *fl,
|
|||
p->arg.seqid = seqid;
|
||||
p->res.seqid = seqid;
|
||||
p->lsp = lsp;
|
||||
refcount_inc(&lsp->ls_count);
|
||||
/* Ensure we don't close file until we're done freeing locks! */
|
||||
p->ctx = get_nfs_open_context(ctx);
|
||||
p->l_ctx = nfs_get_lock_context(ctx);
|
||||
|
@ -6526,7 +6526,6 @@ static struct nfs4_lockdata *nfs4_alloc_lockdata(struct file_lock *fl,
|
|||
p->res.lock_seqid = p->arg.lock_seqid;
|
||||
p->lsp = lsp;
|
||||
p->server = server;
|
||||
refcount_inc(&lsp->ls_count);
|
||||
p->ctx = get_nfs_open_context(ctx);
|
||||
locks_init_lock(&p->fl);
|
||||
locks_copy_lock(&p->fl, fl);
|
||||
|
|
|
@ -2311,6 +2311,15 @@ out_exit:
|
|||
rpc_exit(task, status);
|
||||
}
|
||||
|
||||
static bool
|
||||
rpc_check_connected(const struct rpc_rqst *req)
|
||||
{
|
||||
/* No allocated request or transport? return true */
|
||||
if (!req || !req->rq_xprt)
|
||||
return true;
|
||||
return xprt_connected(req->rq_xprt);
|
||||
}
|
||||
|
||||
static void
|
||||
rpc_check_timeout(struct rpc_task *task)
|
||||
{
|
||||
|
@ -2322,10 +2331,11 @@ rpc_check_timeout(struct rpc_task *task)
|
|||
dprintk("RPC: %5u call_timeout (major)\n", task->tk_pid);
|
||||
task->tk_timeouts++;
|
||||
|
||||
if (RPC_IS_SOFTCONN(task)) {
|
||||
if (RPC_IS_SOFTCONN(task) && !rpc_check_connected(task->tk_rqstp)) {
|
||||
rpc_exit(task, -ETIMEDOUT);
|
||||
return;
|
||||
}
|
||||
|
||||
if (RPC_IS_SOFT(task)) {
|
||||
if (clnt->cl_chatty) {
|
||||
printk(KERN_NOTICE "%s: server %s not responding, timed out\n",
|
||||
|
|
|
@ -495,8 +495,8 @@ xs_read_stream_request(struct sock_xprt *transport, struct msghdr *msg,
|
|||
int flags, struct rpc_rqst *req)
|
||||
{
|
||||
struct xdr_buf *buf = &req->rq_private_buf;
|
||||
size_t want, read;
|
||||
ssize_t ret;
|
||||
size_t want, uninitialized_var(read);
|
||||
ssize_t uninitialized_var(ret);
|
||||
|
||||
xs_read_header(transport, buf);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче