Skip to content

Commit 14c741d

Browse files
committed
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()
2 parents 65ae689 + 01f2f5b commit 14c741d

File tree

6 files changed

+21
-10
lines changed

6 files changed

+21
-10
lines changed

fs/lockd/host.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,12 +290,11 @@ void nlmclnt_release_host(struct nlm_host *host)
290290

291291
WARN_ON_ONCE(host->h_server);
292292

293-
if (refcount_dec_and_test(&host->h_count)) {
293+
if (refcount_dec_and_mutex_lock(&host->h_count, &nlm_host_mutex)) {
294294
WARN_ON_ONCE(!list_empty(&host->h_lockowners));
295295
WARN_ON_ONCE(!list_empty(&host->h_granted));
296296
WARN_ON_ONCE(!list_empty(&host->h_reclaim));
297297

298-
mutex_lock(&nlm_host_mutex);
299298
nlm_destroy_host_locked(host);
300299
mutex_unlock(&nlm_host_mutex);
301300
}

fs/nfs/client.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ void nfs_init_timeout_values(struct rpc_timeout *to, int proto,
453453
case XPRT_TRANSPORT_RDMA:
454454
if (retrans == NFS_UNSPEC_RETRANS)
455455
to->to_retries = NFS_DEF_TCP_RETRANS;
456-
if (timeo == NFS_UNSPEC_TIMEO || to->to_retries == 0)
456+
if (timeo == NFS_UNSPEC_TIMEO || to->to_initval == 0)
457457
to->to_initval = NFS_DEF_TCP_TIMEO * HZ / 10;
458458
if (to->to_initval > NFS_MAX_TCP_TIMEOUT)
459459
to->to_initval = NFS_MAX_TCP_TIMEOUT;

fs/nfs/flexfilelayout/flexfilelayout.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1289,6 +1289,7 @@ static void ff_layout_io_track_ds_error(struct pnfs_layout_segment *lseg,
12891289
static int ff_layout_read_done_cb(struct rpc_task *task,
12901290
struct nfs_pgio_header *hdr)
12911291
{
1292+
int new_idx = hdr->pgio_mirror_idx;
12921293
int err;
12931294

12941295
trace_nfs4_pnfs_read(hdr, task->tk_status);
@@ -1307,7 +1308,7 @@ static int ff_layout_read_done_cb(struct rpc_task *task,
13071308
case -NFS4ERR_RESET_TO_PNFS:
13081309
if (ff_layout_choose_best_ds_for_read(hdr->lseg,
13091310
hdr->pgio_mirror_idx + 1,
1310-
&hdr->pgio_mirror_idx))
1311+
&new_idx))
13111312
goto out_layouterror;
13121313
set_bit(NFS_IOHDR_RESEND_PNFS, &hdr->flags);
13131314
return task->tk_status;
@@ -1320,7 +1321,9 @@ static int ff_layout_read_done_cb(struct rpc_task *task,
13201321

13211322
return 0;
13221323
out_layouterror:
1324+
ff_layout_read_record_layoutstats_done(task, hdr);
13231325
ff_layout_send_layouterror(hdr->lseg);
1326+
hdr->pgio_mirror_idx = new_idx;
13241327
out_eagain:
13251328
rpc_restart_call_prepare(task);
13261329
return -EAGAIN;

fs/nfs/nfs4proc.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2933,7 +2933,8 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,
29332933
}
29342934

29352935
out:
2936-
nfs4_sequence_free_slot(&opendata->o_res.seq_res);
2936+
if (!opendata->cancelled)
2937+
nfs4_sequence_free_slot(&opendata->o_res.seq_res);
29372938
return ret;
29382939
}
29392940

@@ -6301,7 +6302,6 @@ static struct nfs4_unlockdata *nfs4_alloc_unlockdata(struct file_lock *fl,
63016302
p->arg.seqid = seqid;
63026303
p->res.seqid = seqid;
63036304
p->lsp = lsp;
6304-
refcount_inc(&lsp->ls_count);
63056305
/* Ensure we don't close file until we're done freeing locks! */
63066306
p->ctx = get_nfs_open_context(ctx);
63076307
p->l_ctx = nfs_get_lock_context(ctx);
@@ -6526,7 +6526,6 @@ static struct nfs4_lockdata *nfs4_alloc_lockdata(struct file_lock *fl,
65266526
p->res.lock_seqid = p->arg.lock_seqid;
65276527
p->lsp = lsp;
65286528
p->server = server;
6529-
refcount_inc(&lsp->ls_count);
65306529
p->ctx = get_nfs_open_context(ctx);
65316530
locks_init_lock(&p->fl);
65326531
locks_copy_lock(&p->fl, fl);

net/sunrpc/clnt.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2311,6 +2311,15 @@ call_status(struct rpc_task *task)
23112311
rpc_exit(task, status);
23122312
}
23132313

2314+
static bool
2315+
rpc_check_connected(const struct rpc_rqst *req)
2316+
{
2317+
/* No allocated request or transport? return true */
2318+
if (!req || !req->rq_xprt)
2319+
return true;
2320+
return xprt_connected(req->rq_xprt);
2321+
}
2322+
23142323
static void
23152324
rpc_check_timeout(struct rpc_task *task)
23162325
{
@@ -2322,10 +2331,11 @@ rpc_check_timeout(struct rpc_task *task)
23222331
dprintk("RPC: %5u call_timeout (major)\n", task->tk_pid);
23232332
task->tk_timeouts++;
23242333

2325-
if (RPC_IS_SOFTCONN(task)) {
2334+
if (RPC_IS_SOFTCONN(task) && !rpc_check_connected(task->tk_rqstp)) {
23262335
rpc_exit(task, -ETIMEDOUT);
23272336
return;
23282337
}
2338+
23292339
if (RPC_IS_SOFT(task)) {
23302340
if (clnt->cl_chatty) {
23312341
printk(KERN_NOTICE "%s: server %s not responding, timed out\n",

net/sunrpc/xprtsock.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -495,8 +495,8 @@ xs_read_stream_request(struct sock_xprt *transport, struct msghdr *msg,
495495
int flags, struct rpc_rqst *req)
496496
{
497497
struct xdr_buf *buf = &req->rq_private_buf;
498-
size_t want, read;
499-
ssize_t ret;
498+
size_t want, uninitialized_var(read);
499+
ssize_t uninitialized_var(ret);
500500

501501
xs_read_header(transport, buf);
502502

0 commit comments

Comments
 (0)