Skip to content

Commit b60bc06

Browse files
committed
Merge tag 'nfs-for-5.1-4' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
Pull NFS client bugfixes from Trond Myklebust: "Highlights include: Stable fix: - Fix a deadlock in close() due to incorrect draining of RDMA queues Bugfixes: - Revert "SUNRPC: Micro-optimise when the task is known not to be sleeping" as it is causing stack overflows - Fix a regression where NFSv4 getacl and fs_locations stopped working - Forbid setting AF_INET6 to "struct sockaddr_in"->sin_family. - Fix xfstests failures due to incorrect copy_file_range() return values" * tag 'nfs-for-5.1-4' of git://git.linux-nfs.org/projects/trondmy/linux-nfs: Revert "SUNRPC: Micro-optimise when the task is known not to be sleeping" NFSv4.1 fix incorrect return value in copy_file_range xprtrdma: Fix helper that drains the transport NFS: Fix handling of reply page vector NFS: Forbid setting AF_INET6 to "struct sockaddr_in"->sin_family.
2 parents 87af0c3 + af6b61d commit b60bc06

File tree

7 files changed

+16
-53
lines changed

7 files changed

+16
-53
lines changed

fs/nfs/nfs42proc.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -329,9 +329,6 @@ ssize_t nfs42_proc_copy(struct file *src, loff_t pos_src,
329329
};
330330
ssize_t err, err2;
331331

332-
if (!nfs_server_capable(file_inode(dst), NFS_CAP_COPY))
333-
return -EOPNOTSUPP;
334-
335332
src_lock = nfs_get_lock_context(nfs_file_open_context(src));
336333
if (IS_ERR(src_lock))
337334
return PTR_ERR(src_lock);

fs/nfs/nfs4file.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,10 @@ static ssize_t nfs4_copy_file_range(struct file *file_in, loff_t pos_in,
133133
struct file *file_out, loff_t pos_out,
134134
size_t count, unsigned int flags)
135135
{
136+
if (!nfs_server_capable(file_inode(file_out), NFS_CAP_COPY))
137+
return -EOPNOTSUPP;
136138
if (file_inode(file_in) == file_inode(file_out))
137-
return -EINVAL;
139+
return -EOPNOTSUPP;
138140
return nfs42_proc_copy(file_in, pos_in, file_out, pos_out, count);
139141
}
140142

fs/nfs/nfs4xdr.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2589,7 +2589,7 @@ static void nfs4_xdr_enc_getacl(struct rpc_rqst *req, struct xdr_stream *xdr,
25892589
ARRAY_SIZE(nfs4_acl_bitmap), &hdr);
25902590

25912591
rpc_prepare_reply_pages(req, args->acl_pages, 0,
2592-
args->acl_len, replen);
2592+
args->acl_len, replen + 1);
25932593
encode_nops(&hdr);
25942594
}
25952595

@@ -2811,7 +2811,7 @@ static void nfs4_xdr_enc_fs_locations(struct rpc_rqst *req,
28112811
}
28122812

28132813
rpc_prepare_reply_pages(req, (struct page **)&args->page, 0,
2814-
PAGE_SIZE, replen);
2814+
PAGE_SIZE, replen + 1);
28152815
encode_nops(&hdr);
28162816
}
28172817

fs/nfs/super.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2041,7 +2041,8 @@ static int nfs23_validate_mount_data(void *options,
20412041
memcpy(sap, &data->addr, sizeof(data->addr));
20422042
args->nfs_server.addrlen = sizeof(data->addr);
20432043
args->nfs_server.port = ntohs(data->addr.sin_port);
2044-
if (!nfs_verify_server_address(sap))
2044+
if (sap->sa_family != AF_INET ||
2045+
!nfs_verify_server_address(sap))
20452046
goto out_no_address;
20462047

20472048
if (!(data->flags & NFS_MOUNT_TCP))

include/linux/sunrpc/sched.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -304,12 +304,4 @@ rpc_clnt_swap_deactivate(struct rpc_clnt *clnt)
304304
}
305305
#endif /* CONFIG_SUNRPC_SWAP */
306306

307-
static inline bool
308-
rpc_task_need_resched(const struct rpc_task *task)
309-
{
310-
if (RPC_IS_QUEUED(task) || task->tk_callback)
311-
return true;
312-
return false;
313-
}
314-
315307
#endif /* _LINUX_SUNRPC_SCHED_H_ */

net/sunrpc/clnt.c

Lines changed: 8 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1540,7 +1540,6 @@ call_start(struct rpc_task *task)
15401540
clnt->cl_stats->rpccnt++;
15411541
task->tk_action = call_reserve;
15421542
rpc_task_set_transport(task, clnt);
1543-
call_reserve(task);
15441543
}
15451544

15461545
/*
@@ -1554,9 +1553,6 @@ call_reserve(struct rpc_task *task)
15541553
task->tk_status = 0;
15551554
task->tk_action = call_reserveresult;
15561555
xprt_reserve(task);
1557-
if (rpc_task_need_resched(task))
1558-
return;
1559-
call_reserveresult(task);
15601556
}
15611557

15621558
static void call_retry_reserve(struct rpc_task *task);
@@ -1579,7 +1575,6 @@ call_reserveresult(struct rpc_task *task)
15791575
if (status >= 0) {
15801576
if (task->tk_rqstp) {
15811577
task->tk_action = call_refresh;
1582-
call_refresh(task);
15831578
return;
15841579
}
15851580

@@ -1605,7 +1600,6 @@ call_reserveresult(struct rpc_task *task)
16051600
/* fall through */
16061601
case -EAGAIN: /* woken up; retry */
16071602
task->tk_action = call_retry_reserve;
1608-
call_retry_reserve(task);
16091603
return;
16101604
case -EIO: /* probably a shutdown */
16111605
break;
@@ -1628,9 +1622,6 @@ call_retry_reserve(struct rpc_task *task)
16281622
task->tk_status = 0;
16291623
task->tk_action = call_reserveresult;
16301624
xprt_retry_reserve(task);
1631-
if (rpc_task_need_resched(task))
1632-
return;
1633-
call_reserveresult(task);
16341625
}
16351626

16361627
/*
@@ -1645,9 +1636,6 @@ call_refresh(struct rpc_task *task)
16451636
task->tk_status = 0;
16461637
task->tk_client->cl_stats->rpcauthrefresh++;
16471638
rpcauth_refreshcred(task);
1648-
if (rpc_task_need_resched(task))
1649-
return;
1650-
call_refreshresult(task);
16511639
}
16521640

16531641
/*
@@ -1666,7 +1654,6 @@ call_refreshresult(struct rpc_task *task)
16661654
case 0:
16671655
if (rpcauth_uptodatecred(task)) {
16681656
task->tk_action = call_allocate;
1669-
call_allocate(task);
16701657
return;
16711658
}
16721659
/* Use rate-limiting and a max number of retries if refresh
@@ -1685,7 +1672,6 @@ call_refreshresult(struct rpc_task *task)
16851672
task->tk_cred_retry--;
16861673
dprintk("RPC: %5u %s: retry refresh creds\n",
16871674
task->tk_pid, __func__);
1688-
call_refresh(task);
16891675
return;
16901676
}
16911677
dprintk("RPC: %5u %s: refresh creds failed with error %d\n",
@@ -1711,10 +1697,8 @@ call_allocate(struct rpc_task *task)
17111697
task->tk_status = 0;
17121698
task->tk_action = call_encode;
17131699

1714-
if (req->rq_buffer) {
1715-
call_encode(task);
1700+
if (req->rq_buffer)
17161701
return;
1717-
}
17181702

17191703
if (proc->p_proc != 0) {
17201704
BUG_ON(proc->p_arglen == 0);
@@ -1740,12 +1724,8 @@ call_allocate(struct rpc_task *task)
17401724

17411725
status = xprt->ops->buf_alloc(task);
17421726
xprt_inject_disconnect(xprt);
1743-
if (status == 0) {
1744-
if (rpc_task_need_resched(task))
1745-
return;
1746-
call_encode(task);
1727+
if (status == 0)
17471728
return;
1748-
}
17491729
if (status != -ENOMEM) {
17501730
rpc_exit(task, status);
17511731
return;
@@ -1828,8 +1808,12 @@ call_encode(struct rpc_task *task)
18281808
xprt_request_enqueue_receive(task);
18291809
xprt_request_enqueue_transmit(task);
18301810
out:
1831-
task->tk_action = call_bind;
1832-
call_bind(task);
1811+
task->tk_action = call_transmit;
1812+
/* Check that the connection is OK */
1813+
if (!xprt_bound(task->tk_xprt))
1814+
task->tk_action = call_bind;
1815+
else if (!xprt_connected(task->tk_xprt))
1816+
task->tk_action = call_connect;
18331817
}
18341818

18351819
/*
@@ -1847,7 +1831,6 @@ rpc_task_handle_transmitted(struct rpc_task *task)
18471831
{
18481832
xprt_end_transmit(task);
18491833
task->tk_action = call_transmit_status;
1850-
call_transmit_status(task);
18511834
}
18521835

18531836
/*
@@ -1865,7 +1848,6 @@ call_bind(struct rpc_task *task)
18651848

18661849
if (xprt_bound(xprt)) {
18671850
task->tk_action = call_connect;
1868-
call_connect(task);
18691851
return;
18701852
}
18711853

@@ -1896,7 +1878,6 @@ call_bind_status(struct rpc_task *task)
18961878
dprint_status(task);
18971879
task->tk_status = 0;
18981880
task->tk_action = call_connect;
1899-
call_connect(task);
19001881
return;
19011882
}
19021883

@@ -1981,7 +1962,6 @@ call_connect(struct rpc_task *task)
19811962

19821963
if (xprt_connected(xprt)) {
19831964
task->tk_action = call_transmit;
1984-
call_transmit(task);
19851965
return;
19861966
}
19871967

@@ -2051,7 +2031,6 @@ call_connect_status(struct rpc_task *task)
20512031
case 0:
20522032
clnt->cl_stats->netreconn++;
20532033
task->tk_action = call_transmit;
2054-
call_transmit(task);
20552034
return;
20562035
}
20572036
rpc_exit(task, status);
@@ -2087,9 +2066,6 @@ call_transmit(struct rpc_task *task)
20872066
xprt_transmit(task);
20882067
}
20892068
xprt_end_transmit(task);
2090-
if (rpc_task_need_resched(task))
2091-
return;
2092-
call_transmit_status(task);
20932069
}
20942070

20952071
/*
@@ -2107,9 +2083,6 @@ call_transmit_status(struct rpc_task *task)
21072083
if (rpc_task_transmitted(task)) {
21082084
if (task->tk_status == 0)
21092085
xprt_request_wait_receive(task);
2110-
if (rpc_task_need_resched(task))
2111-
return;
2112-
call_status(task);
21132086
return;
21142087
}
21152088

@@ -2170,7 +2143,6 @@ call_bc_encode(struct rpc_task *task)
21702143
{
21712144
xprt_request_enqueue_transmit(task);
21722145
task->tk_action = call_bc_transmit;
2173-
call_bc_transmit(task);
21742146
}
21752147

21762148
/*
@@ -2261,7 +2233,6 @@ call_status(struct rpc_task *task)
22612233
status = task->tk_status;
22622234
if (status >= 0) {
22632235
task->tk_action = call_decode;
2264-
call_decode(task);
22652236
return;
22662237
}
22672238

net/sunrpc/xprtrdma/verbs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ static void rpcrdma_xprt_drain(struct rpcrdma_xprt *r_xprt)
9090
/* Flush Receives, then wait for deferred Reply work
9191
* to complete.
9292
*/
93-
ib_drain_qp(ia->ri_id->qp);
93+
ib_drain_rq(ia->ri_id->qp);
9494
drain_workqueue(buf->rb_completion_wq);
9595

9696
/* Deferred Reply processing might have scheduled

0 commit comments

Comments
 (0)