aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJeff Layton <jlayton@redhat.com>2011-06-21 07:18:26 -0400
committerSteve French <sfrench@us.ibm.com>2011-07-01 12:15:30 -0400
commitee1b3ea9e6171d7a842527a44873f9f51e6f239b (patch)
tree550a4d42bcf0d3e7f70caada1605171fd6e832ad /fs
parentdaf54f1f363a61c618662ef66d4bf09d2b090941 (diff)
cifs: set socket send and receive timeouts before attempting connect
Benjamin S. reported that he was unable to suspend his machine while it had a cifs share mounted. The freezer caused this to spew when he tried it: -----------------------[snip]------------------ PM: Syncing filesystems ... done. Freezing user space processes ... (elapsed 0.01 seconds) done. Freezing remaining freezable tasks ... Freezing of tasks failed after 20.01 seconds (1 tasks refusing to freeze, wq_busy=0): cifsd S ffff880127f7b1b0 0 1821 2 0x00800000 ffff880127f7b1b0 0000000000000046 ffff88005fe008a8 ffff8800ffffffff ffff880127cee6b0 0000000000011100 ffff880127737fd8 0000000000004000 ffff880127737fd8 0000000000011100 ffff880127f7b1b0 ffff880127736010 Call Trace: [<ffffffff811e85dd>] ? sk_reset_timer+0xf/0x19 [<ffffffff8122cf3f>] ? tcp_connect+0x43c/0x445 [<ffffffff8123374e>] ? tcp_v4_connect+0x40d/0x47f [<ffffffff8126ce41>] ? schedule_timeout+0x21/0x1ad [<ffffffff8126e358>] ? _raw_spin_lock_bh+0x9/0x1f [<ffffffff811e81c7>] ? release_sock+0x19/0xef [<ffffffff8123e8be>] ? inet_stream_connect+0x14c/0x24a [<ffffffff8104485b>] ? autoremove_wake_function+0x0/0x2a [<ffffffffa02ccfe2>] ? ipv4_connect+0x39c/0x3b5 [cifs] [<ffffffffa02cd7b7>] ? cifs_reconnect+0x1fc/0x28a [cifs] [<ffffffffa02cdbdc>] ? cifs_demultiplex_thread+0x397/0xb9f [cifs] [<ffffffff81076afc>] ? perf_event_exit_task+0xb9/0x1bf [<ffffffffa02cd845>] ? cifs_demultiplex_thread+0x0/0xb9f [cifs] [<ffffffffa02cd845>] ? cifs_demultiplex_thread+0x0/0xb9f [cifs] [<ffffffff810444a1>] ? kthread+0x7a/0x82 [<ffffffff81002d14>] ? kernel_thread_helper+0x4/0x10 [<ffffffff81044427>] ? kthread+0x0/0x82 [<ffffffff81002d10>] ? kernel_thread_helper+0x0/0x10 Restarting tasks ... done. -----------------------[snip]------------------ We do attempt to perform a try_to_freeze in cifs_reconnect, but the connection attempt itself seems to be taking longer than 20s to time out. The connect timeout is governed by the socket send and receive timeouts, so we can shorten that period by setting those timeouts before attempting the connect instead of after. Adam Williamson tested the patch and said that it seems to have fixed suspending on his laptop when a cifs share is mounted. Reported-by: Benjamin S <da_joind@gmx.net> Tested-by: Adam Williamson <awilliam@redhat.com> Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/cifs/connect.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index 7f540df52527..c8cb83ef6f6f 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -2474,14 +2474,6 @@ generic_ip_connect(struct TCP_Server_Info *server)
2474 if (rc < 0) 2474 if (rc < 0)
2475 return rc; 2475 return rc;
2476 2476
2477 rc = socket->ops->connect(socket, saddr, slen, 0);
2478 if (rc < 0) {
2479 cFYI(1, "Error %d connecting to server", rc);
2480 sock_release(socket);
2481 server->ssocket = NULL;
2482 return rc;
2483 }
2484
2485 /* 2477 /*
2486 * Eventually check for other socket options to change from 2478 * Eventually check for other socket options to change from
2487 * the default. sock_setsockopt not used because it expects 2479 * the default. sock_setsockopt not used because it expects
@@ -2510,6 +2502,14 @@ generic_ip_connect(struct TCP_Server_Info *server)
2510 socket->sk->sk_sndbuf, 2502 socket->sk->sk_sndbuf,
2511 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo); 2503 socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo);
2512 2504
2505 rc = socket->ops->connect(socket, saddr, slen, 0);
2506 if (rc < 0) {
2507 cFYI(1, "Error %d connecting to server", rc);
2508 sock_release(socket);
2509 server->ssocket = NULL;
2510 return rc;
2511 }
2512
2513 if (sport == htons(RFC1001_PORT)) 2513 if (sport == htons(RFC1001_PORT))
2514 rc = ip_rfc1001_connect(server); 2514 rc = ip_rfc1001_connect(server);
2515 2515