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.

Changed files
+16 -53
fs
include
linux
sunrpc
net
sunrpc
xprtrdma
-3
fs/nfs/nfs42proc.c
··· 329 329 }; 330 330 ssize_t err, err2; 331 331 332 - if (!nfs_server_capable(file_inode(dst), NFS_CAP_COPY)) 333 - return -EOPNOTSUPP; 334 - 335 332 src_lock = nfs_get_lock_context(nfs_file_open_context(src)); 336 333 if (IS_ERR(src_lock)) 337 334 return PTR_ERR(src_lock);
+3 -1
fs/nfs/nfs4file.c
··· 133 133 struct file *file_out, loff_t pos_out, 134 134 size_t count, unsigned int flags) 135 135 { 136 + if (!nfs_server_capable(file_inode(file_out), NFS_CAP_COPY)) 137 + return -EOPNOTSUPP; 136 138 if (file_inode(file_in) == file_inode(file_out)) 137 - return -EINVAL; 139 + return -EOPNOTSUPP; 138 140 return nfs42_proc_copy(file_in, pos_in, file_out, pos_out, count); 139 141 } 140 142
+2 -2
fs/nfs/nfs4xdr.c
··· 2589 2589 ARRAY_SIZE(nfs4_acl_bitmap), &hdr); 2590 2590 2591 2591 rpc_prepare_reply_pages(req, args->acl_pages, 0, 2592 - args->acl_len, replen); 2592 + args->acl_len, replen + 1); 2593 2593 encode_nops(&hdr); 2594 2594 } 2595 2595 ··· 2811 2811 } 2812 2812 2813 2813 rpc_prepare_reply_pages(req, (struct page **)&args->page, 0, 2814 - PAGE_SIZE, replen); 2814 + PAGE_SIZE, replen + 1); 2815 2815 encode_nops(&hdr); 2816 2816 } 2817 2817
+2 -1
fs/nfs/super.c
··· 2041 2041 memcpy(sap, &data->addr, sizeof(data->addr)); 2042 2042 args->nfs_server.addrlen = sizeof(data->addr); 2043 2043 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)) 2045 2046 goto out_no_address; 2046 2047 2047 2048 if (!(data->flags & NFS_MOUNT_TCP))
-8
include/linux/sunrpc/sched.h
··· 304 304 } 305 305 #endif /* CONFIG_SUNRPC_SWAP */ 306 306 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 - 315 307 #endif /* _LINUX_SUNRPC_SCHED_H_ */
+8 -37
net/sunrpc/clnt.c
··· 1540 1540 clnt->cl_stats->rpccnt++; 1541 1541 task->tk_action = call_reserve; 1542 1542 rpc_task_set_transport(task, clnt); 1543 - call_reserve(task); 1544 1543 } 1545 1544 1546 1545 /* ··· 1553 1554 task->tk_status = 0; 1554 1555 task->tk_action = call_reserveresult; 1555 1556 xprt_reserve(task); 1556 - if (rpc_task_need_resched(task)) 1557 - return; 1558 - call_reserveresult(task); 1559 1557 } 1560 1558 1561 1559 static void call_retry_reserve(struct rpc_task *task); ··· 1575 1579 if (status >= 0) { 1576 1580 if (task->tk_rqstp) { 1577 1581 task->tk_action = call_refresh; 1578 - call_refresh(task); 1579 1582 return; 1580 1583 } 1581 1584 ··· 1600 1605 /* fall through */ 1601 1606 case -EAGAIN: /* woken up; retry */ 1602 1607 task->tk_action = call_retry_reserve; 1603 - call_retry_reserve(task); 1604 1608 return; 1605 1609 case -EIO: /* probably a shutdown */ 1606 1610 break; ··· 1622 1628 task->tk_status = 0; 1623 1629 task->tk_action = call_reserveresult; 1624 1630 xprt_retry_reserve(task); 1625 - if (rpc_task_need_resched(task)) 1626 - return; 1627 - call_reserveresult(task); 1628 1631 } 1629 1632 1630 1633 /* ··· 1636 1645 task->tk_status = 0; 1637 1646 task->tk_client->cl_stats->rpcauthrefresh++; 1638 1647 rpcauth_refreshcred(task); 1639 - if (rpc_task_need_resched(task)) 1640 - return; 1641 - call_refreshresult(task); 1642 1648 } 1643 1649 1644 1650 /* ··· 1654 1666 case 0: 1655 1667 if (rpcauth_uptodatecred(task)) { 1656 1668 task->tk_action = call_allocate; 1657 - call_allocate(task); 1658 1669 return; 1659 1670 } 1660 1671 /* Use rate-limiting and a max number of retries if refresh ··· 1672 1685 task->tk_cred_retry--; 1673 1686 dprintk("RPC: %5u %s: retry refresh creds\n", 1674 1687 task->tk_pid, __func__); 1675 - call_refresh(task); 1676 1688 return; 1677 1689 } 1678 1690 dprintk("RPC: %5u %s: refresh creds failed with error %d\n", ··· 1697 1711 task->tk_status = 0; 1698 1712 task->tk_action = call_encode; 1699 1713 1700 - if (req->rq_buffer) { 1701 - call_encode(task); 1714 + if (req->rq_buffer) 1702 1715 return; 1703 - } 1704 1716 1705 1717 if (proc->p_proc != 0) { 1706 1718 BUG_ON(proc->p_arglen == 0); ··· 1724 1740 1725 1741 status = xprt->ops->buf_alloc(task); 1726 1742 xprt_inject_disconnect(xprt); 1727 - if (status == 0) { 1728 - if (rpc_task_need_resched(task)) 1729 - return; 1730 - call_encode(task); 1743 + if (status == 0) 1731 1744 return; 1732 - } 1733 1745 if (status != -ENOMEM) { 1734 1746 rpc_exit(task, status); 1735 1747 return; ··· 1808 1828 xprt_request_enqueue_receive(task); 1809 1829 xprt_request_enqueue_transmit(task); 1810 1830 out: 1811 - task->tk_action = call_bind; 1812 - call_bind(task); 1831 + task->tk_action = call_transmit; 1832 + /* Check that the connection is OK */ 1833 + if (!xprt_bound(task->tk_xprt)) 1834 + task->tk_action = call_bind; 1835 + else if (!xprt_connected(task->tk_xprt)) 1836 + task->tk_action = call_connect; 1813 1837 } 1814 1838 1815 1839 /* ··· 1831 1847 { 1832 1848 xprt_end_transmit(task); 1833 1849 task->tk_action = call_transmit_status; 1834 - call_transmit_status(task); 1835 1850 } 1836 1851 1837 1852 /* ··· 1848 1865 1849 1866 if (xprt_bound(xprt)) { 1850 1867 task->tk_action = call_connect; 1851 - call_connect(task); 1852 1868 return; 1853 1869 } 1854 1870 ··· 1878 1896 dprint_status(task); 1879 1897 task->tk_status = 0; 1880 1898 task->tk_action = call_connect; 1881 - call_connect(task); 1882 1899 return; 1883 1900 } 1884 1901 ··· 1962 1981 1963 1982 if (xprt_connected(xprt)) { 1964 1983 task->tk_action = call_transmit; 1965 - call_transmit(task); 1966 1984 return; 1967 1985 } 1968 1986 ··· 2031 2051 case 0: 2032 2052 clnt->cl_stats->netreconn++; 2033 2053 task->tk_action = call_transmit; 2034 - call_transmit(task); 2035 2054 return; 2036 2055 } 2037 2056 rpc_exit(task, status); ··· 2066 2087 xprt_transmit(task); 2067 2088 } 2068 2089 xprt_end_transmit(task); 2069 - if (rpc_task_need_resched(task)) 2070 - return; 2071 - call_transmit_status(task); 2072 2090 } 2073 2091 2074 2092 /* ··· 2083 2107 if (rpc_task_transmitted(task)) { 2084 2108 if (task->tk_status == 0) 2085 2109 xprt_request_wait_receive(task); 2086 - if (rpc_task_need_resched(task)) 2087 - return; 2088 - call_status(task); 2089 2110 return; 2090 2111 } 2091 2112 ··· 2143 2170 { 2144 2171 xprt_request_enqueue_transmit(task); 2145 2172 task->tk_action = call_bc_transmit; 2146 - call_bc_transmit(task); 2147 2173 } 2148 2174 2149 2175 /* ··· 2233 2261 status = task->tk_status; 2234 2262 if (status >= 0) { 2235 2263 task->tk_action = call_decode; 2236 - call_decode(task); 2237 2264 return; 2238 2265 } 2239 2266
+1 -1
net/sunrpc/xprtrdma/verbs.c
··· 90 90 /* Flush Receives, then wait for deferred Reply work 91 91 * to complete. 92 92 */ 93 - ib_drain_qp(ia->ri_id->qp); 93 + ib_drain_rq(ia->ri_id->qp); 94 94 drain_workqueue(buf->rb_completion_wq); 95 95 96 96 /* Deferred Reply processing might have scheduled