Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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.

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