diff options
| -rw-r--r-- | fs/nfs/file.c | 14 | ||||
| -rw-r--r-- | net/sunrpc/sched.c | 2 | ||||
| -rw-r--r-- | net/sunrpc/xprtrdma/transport.c | 2 | ||||
| -rw-r--r-- | net/sunrpc/xprtsock.c | 10 |
4 files changed, 6 insertions, 22 deletions
diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 24832d040eb8..6920127c5eb7 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c | |||
| @@ -476,20 +476,18 @@ static int nfs_release_page(struct page *page, gfp_t gfp) | |||
| 476 | dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page); | 476 | dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page); |
| 477 | 477 | ||
| 478 | /* Always try to initiate a 'commit' if relevant, but only | 478 | /* Always try to initiate a 'commit' if relevant, but only |
| 479 | * wait for it if __GFP_WAIT is set and the calling process is | 479 | * wait for it if __GFP_WAIT is set. Even then, only wait 1 |
| 480 | * allowed to block. Even then, only wait 1 second and only | 480 | * second and only if the 'bdi' is not congested. |
| 481 | * if the 'bdi' is not congested. | ||
| 482 | * Waiting indefinitely can cause deadlocks when the NFS | 481 | * Waiting indefinitely can cause deadlocks when the NFS |
| 483 | * server is on this machine, and there is no particular need | 482 | * server is on this machine, when a new TCP connection is |
| 484 | * to wait extensively here. A short wait has the benefit | 483 | * needed and in other rare cases. There is no particular |
| 485 | * that someone else can worry about the freezer. | 484 | * need to wait extensively here. A short wait has the |
| 485 | * benefit that someone else can worry about the freezer. | ||
| 486 | */ | 486 | */ |
| 487 | if (mapping) { | 487 | if (mapping) { |
| 488 | struct nfs_server *nfss = NFS_SERVER(mapping->host); | 488 | struct nfs_server *nfss = NFS_SERVER(mapping->host); |
| 489 | nfs_commit_inode(mapping->host, 0); | 489 | nfs_commit_inode(mapping->host, 0); |
| 490 | if ((gfp & __GFP_WAIT) && | 490 | if ((gfp & __GFP_WAIT) && |
| 491 | !current_is_kswapd() && | ||
| 492 | !(current->flags & PF_FSTRANS) && | ||
| 493 | !bdi_write_congested(&nfss->backing_dev_info)) { | 491 | !bdi_write_congested(&nfss->backing_dev_info)) { |
| 494 | wait_on_page_bit_killable_timeout(page, PG_private, | 492 | wait_on_page_bit_killable_timeout(page, PG_private, |
| 495 | HZ); | 493 | HZ); |
diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c index 9358c79fd589..fe3441abdbe5 100644 --- a/net/sunrpc/sched.c +++ b/net/sunrpc/sched.c | |||
| @@ -821,9 +821,7 @@ void rpc_execute(struct rpc_task *task) | |||
| 821 | 821 | ||
| 822 | static void rpc_async_schedule(struct work_struct *work) | 822 | static void rpc_async_schedule(struct work_struct *work) |
| 823 | { | 823 | { |
| 824 | current->flags |= PF_FSTRANS; | ||
| 825 | __rpc_execute(container_of(work, struct rpc_task, u.tk_work)); | 824 | __rpc_execute(container_of(work, struct rpc_task, u.tk_work)); |
| 826 | current->flags &= ~PF_FSTRANS; | ||
| 827 | } | 825 | } |
| 828 | 826 | ||
| 829 | /** | 827 | /** |
diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c index 2faac4940563..6a4615dd0261 100644 --- a/net/sunrpc/xprtrdma/transport.c +++ b/net/sunrpc/xprtrdma/transport.c | |||
| @@ -205,7 +205,6 @@ xprt_rdma_connect_worker(struct work_struct *work) | |||
| 205 | struct rpc_xprt *xprt = &r_xprt->xprt; | 205 | struct rpc_xprt *xprt = &r_xprt->xprt; |
| 206 | int rc = 0; | 206 | int rc = 0; |
| 207 | 207 | ||
| 208 | current->flags |= PF_FSTRANS; | ||
| 209 | xprt_clear_connected(xprt); | 208 | xprt_clear_connected(xprt); |
| 210 | 209 | ||
| 211 | dprintk("RPC: %s: %sconnect\n", __func__, | 210 | dprintk("RPC: %s: %sconnect\n", __func__, |
| @@ -216,7 +215,6 @@ xprt_rdma_connect_worker(struct work_struct *work) | |||
| 216 | 215 | ||
| 217 | dprintk("RPC: %s: exit\n", __func__); | 216 | dprintk("RPC: %s: exit\n", __func__); |
| 218 | xprt_clear_connecting(xprt); | 217 | xprt_clear_connecting(xprt); |
| 219 | current->flags &= ~PF_FSTRANS; | ||
| 220 | } | 218 | } |
| 221 | 219 | ||
| 222 | /* | 220 | /* |
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 02603ec2460a..3b305ab17afe 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
| @@ -1954,8 +1954,6 @@ static int xs_local_setup_socket(struct sock_xprt *transport) | |||
| 1954 | struct socket *sock; | 1954 | struct socket *sock; |
| 1955 | int status = -EIO; | 1955 | int status = -EIO; |
| 1956 | 1956 | ||
| 1957 | current->flags |= PF_FSTRANS; | ||
| 1958 | |||
| 1959 | clear_bit(XPRT_CONNECTION_ABORT, &xprt->state); | 1957 | clear_bit(XPRT_CONNECTION_ABORT, &xprt->state); |
| 1960 | status = __sock_create(xprt->xprt_net, AF_LOCAL, | 1958 | status = __sock_create(xprt->xprt_net, AF_LOCAL, |
| 1961 | SOCK_STREAM, 0, &sock, 1); | 1959 | SOCK_STREAM, 0, &sock, 1); |
| @@ -1995,7 +1993,6 @@ static int xs_local_setup_socket(struct sock_xprt *transport) | |||
| 1995 | out: | 1993 | out: |
| 1996 | xprt_clear_connecting(xprt); | 1994 | xprt_clear_connecting(xprt); |
| 1997 | xprt_wake_pending_tasks(xprt, status); | 1995 | xprt_wake_pending_tasks(xprt, status); |
| 1998 | current->flags &= ~PF_FSTRANS; | ||
| 1999 | return status; | 1996 | return status; |
| 2000 | } | 1997 | } |
| 2001 | 1998 | ||
| @@ -2098,8 +2095,6 @@ static void xs_udp_setup_socket(struct work_struct *work) | |||
| 2098 | struct socket *sock = transport->sock; | 2095 | struct socket *sock = transport->sock; |
| 2099 | int status = -EIO; | 2096 | int status = -EIO; |
| 2100 | 2097 | ||
| 2101 | current->flags |= PF_FSTRANS; | ||
| 2102 | |||
| 2103 | /* Start by resetting any existing state */ | 2098 | /* Start by resetting any existing state */ |
| 2104 | xs_reset_transport(transport); | 2099 | xs_reset_transport(transport); |
| 2105 | sock = xs_create_sock(xprt, transport, | 2100 | sock = xs_create_sock(xprt, transport, |
| @@ -2119,7 +2114,6 @@ static void xs_udp_setup_socket(struct work_struct *work) | |||
| 2119 | out: | 2114 | out: |
| 2120 | xprt_clear_connecting(xprt); | 2115 | xprt_clear_connecting(xprt); |
| 2121 | xprt_wake_pending_tasks(xprt, status); | 2116 | xprt_wake_pending_tasks(xprt, status); |
| 2122 | current->flags &= ~PF_FSTRANS; | ||
| 2123 | } | 2117 | } |
| 2124 | 2118 | ||
| 2125 | /* | 2119 | /* |
| @@ -2256,8 +2250,6 @@ static void xs_tcp_setup_socket(struct work_struct *work) | |||
| 2256 | struct rpc_xprt *xprt = &transport->xprt; | 2250 | struct rpc_xprt *xprt = &transport->xprt; |
| 2257 | int status = -EIO; | 2251 | int status = -EIO; |
| 2258 | 2252 | ||
| 2259 | current->flags |= PF_FSTRANS; | ||
| 2260 | |||
| 2261 | if (!sock) { | 2253 | if (!sock) { |
| 2262 | clear_bit(XPRT_CONNECTION_ABORT, &xprt->state); | 2254 | clear_bit(XPRT_CONNECTION_ABORT, &xprt->state); |
| 2263 | sock = xs_create_sock(xprt, transport, | 2255 | sock = xs_create_sock(xprt, transport, |
| @@ -2305,7 +2297,6 @@ static void xs_tcp_setup_socket(struct work_struct *work) | |||
| 2305 | case -EINPROGRESS: | 2297 | case -EINPROGRESS: |
| 2306 | case -EALREADY: | 2298 | case -EALREADY: |
| 2307 | xprt_clear_connecting(xprt); | 2299 | xprt_clear_connecting(xprt); |
| 2308 | current->flags &= ~PF_FSTRANS; | ||
| 2309 | return; | 2300 | return; |
| 2310 | case -EINVAL: | 2301 | case -EINVAL: |
| 2311 | /* Happens, for instance, if the user specified a link | 2302 | /* Happens, for instance, if the user specified a link |
| @@ -2323,7 +2314,6 @@ out_eagain: | |||
| 2323 | out: | 2314 | out: |
| 2324 | xprt_clear_connecting(xprt); | 2315 | xprt_clear_connecting(xprt); |
| 2325 | xprt_wake_pending_tasks(xprt, status); | 2316 | xprt_wake_pending_tasks(xprt, status); |
| 2326 | current->flags &= ~PF_FSTRANS; | ||
| 2327 | } | 2317 | } |
| 2328 | 2318 | ||
| 2329 | /** | 2319 | /** |
