Acked-by: Shirish Pargaonkar <shirishpargaonkar@xxxxxxxxx> On Tue, Dec 15, 2015 at 4:21 AM, Sachin Prabhu <sprabhu@xxxxxxxxxx> wrote: > On Mon, 2015-12-14 at 21:58 -0600, Shirish Pargaonkar wrote: >> Looks correct. Only comment would be to keep one definition of >> echo_interval, >> preferably unsigned int (instead of unsigned long also). > > Sirish, > > The event_timeout defined in struct smb_vol contains the timeout value > in seconds while the one defined in struct TCP_Server_Info multiplies > the value from the smb_vol by HZ to get the time in ticks. > > Sachin Prabhu > >> >> On Mon, Dec 14, 2015 at 6:54 AM, Sachin Prabhu <sprabhu@xxxxxxxxxx> >> wrote: >> > Another approach as pointed to by Jeff Layton is to make it a >> > module >> > parameter which is then set for all shares mounted on the client. >> > >> > Any comments on the patch are welcome. >> > >> > Sachin Prabhu >> > >> > On Mon, 2015-12-14 at 18:17 +0530, Sachin Prabhu wrote: >> > > Currently the echo interval is set to 60 seconds using a macro. >> > > This >> > > setting determines the interval at which echo requests are sent >> > > to >> > > the >> > > server on an idling connection. This setting also affects the >> > > time >> > > required for a connection to an unresponsive server to timeout. >> > > >> > > Making this setting a tunable allows users to control the echo >> > > interval >> > > times as well as control the time after which the connecting to >> > > an >> > > unresponsive server times out. >> > > >> > > Signed-off-by: Sachin Prabhu <sprabhu@xxxxxxxxxx> >> > > --- >> > > fs/cifs/cifsfs.c | 2 ++ >> > > fs/cifs/cifsglob.h | 8 ++++++-- >> > > fs/cifs/connect.c | 33 +++++++++++++++++++++++++++------ >> > > 3 files changed, 35 insertions(+), 8 deletions(-) >> > > >> > > diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c >> > > index cbc0f4b..eab2de6 100644 >> > > --- a/fs/cifs/cifsfs.c >> > > +++ b/fs/cifs/cifsfs.c >> > > @@ -507,6 +507,8 @@ cifs_show_options(struct seq_file *s, struct >> > > dentry *root) >> > > >> > > seq_printf(s, ",rsize=%u", cifs_sb->rsize); >> > > seq_printf(s, ",wsize=%u", cifs_sb->wsize); >> > > + seq_printf(s, ",echo_interval=%lu", >> > > + tcon->ses->server->echo_interval / HZ); >> > > /* convert actimeo and display it in seconds */ >> > > seq_printf(s, ",actimeo=%lu", cifs_sb->actimeo / HZ); >> > > >> > > diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h >> > > index 2b510c5..56d3698 100644 >> > > --- a/fs/cifs/cifsglob.h >> > > +++ b/fs/cifs/cifsglob.h >> > > @@ -70,8 +70,10 @@ >> > > #define SERVER_NAME_LENGTH 40 >> > > #define SERVER_NAME_LEN_WITH_NULL (SERVER_NAME_LENGTH + 1) >> > > >> > > -/* SMB echo "timeout" -- FIXME: tunable? */ >> > > -#define SMB_ECHO_INTERVAL (60 * HZ) >> > > +/* echo interval in seconds */ >> > > +#define SMB_ECHO_INTERVAL_MIN 10 >> > > +#define SMB_ECHO_INTERVAL_MAX 120 >> > > +#define SMB_ECHO_INTERVAL_DEFAULT 60 >> > > >> > > #include "cifspdu.h" >> > > >> > > @@ -507,6 +509,7 @@ struct smb_vol { >> > > struct sockaddr_storage dstaddr; /* destination address */ >> > > struct sockaddr_storage srcaddr; /* allow binding to a >> > > local >> > > IP */ >> > > struct nls_table *local_nls; >> > > + unsigned int echo_interval; /* echo interval in secs */ >> > > }; >> > > >> > > #define CIFS_MOUNT_MASK (CIFS_MOUNT_NO_PERM | CIFS_MOUNT_SET_UID >> > > | \ >> > > @@ -628,6 +631,7 @@ struct TCP_Server_Info { >> > > unsigned int max_read; >> > > unsigned int max_write; >> > > #endif /* CONFIG_CIFS_SMB2 */ >> > > + unsigned long echo_interval; >> > > }; >> > > >> > > static inline unsigned int >> > > diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c >> > > index ecb0803..3b44e9e 100644 >> > > --- a/fs/cifs/connect.c >> > > +++ b/fs/cifs/connect.c >> > > @@ -95,6 +95,7 @@ enum { >> > > Opt_cruid, Opt_gid, Opt_file_mode, >> > > Opt_dirmode, Opt_port, >> > > Opt_rsize, Opt_wsize, Opt_actimeo, >> > > + Opt_echo_interval, >> > > >> > > /* Mount options which take string value */ >> > > Opt_user, Opt_pass, Opt_ip, >> > > @@ -188,6 +189,7 @@ static const match_table_t >> > > cifs_mount_option_tokens = { >> > > { Opt_rsize, "rsize=%s" }, >> > > { Opt_wsize, "wsize=%s" }, >> > > { Opt_actimeo, "actimeo=%s" }, >> > > + { Opt_echo_interval, "echo_interval=%s" }, >> > > >> > > { Opt_blank_user, "user=" }, >> > > { Opt_blank_user, "username=" }, >> > > @@ -418,6 +420,7 @@ cifs_echo_request(struct work_struct *work) >> > > int rc; >> > > struct TCP_Server_Info *server = container_of(work, >> > > struct TCP_Server_Info, >> > > echo.work); >> > > + unsigned long echo_interval = server->echo_interval; >> > > >> > > /* >> > > * We cannot send an echo if it is disabled or until the >> > > @@ -427,7 +430,7 @@ cifs_echo_request(struct work_struct *work) >> > > */ >> > > if (!server->ops->need_neg || server->ops->need_neg(server) >> > > > > >> > > (server->ops->can_echo && !server->ops >> > > ->can_echo(server)) || >> > > - time_before(jiffies, server->lstrp + SMB_ECHO_INTERVAL >> > > - >> > > HZ)) >> > > + time_before(jiffies, server->lstrp + echo_interval - >> > > HZ)) >> > > goto requeue_echo; >> > > >> > > rc = server->ops->echo ? server->ops->echo(server) : >> > > -ENOSYS; >> > > @@ -436,7 +439,7 @@ cifs_echo_request(struct work_struct *work) >> > > server->hostname); >> > > >> > > requeue_echo: >> > > - queue_delayed_work(cifsiod_wq, &server->echo, >> > > SMB_ECHO_INTERVAL); >> > > + queue_delayed_work(cifsiod_wq, &server->echo, >> > > echo_interval); >> > > } >> > > >> > > static bool >> > > @@ -487,9 +490,9 @@ server_unresponsive(struct TCP_Server_Info >> > > *server) >> > > * a response in >60s. >> > > */ >> > > if (server->tcpStatus == CifsGood && >> > > - time_after(jiffies, server->lstrp + 2 * >> > > SMB_ECHO_INTERVAL)) { >> > > - cifs_dbg(VFS, "Server %s has not responded in %d >> > > seconds. Reconnecting...\n", >> > > - server->hostname, (2 * SMB_ECHO_INTERVAL) >> > > / >> > > HZ); >> > > + time_after(jiffies, server->lstrp + 2 * server >> > > ->echo_interval)) { >> > > + cifs_dbg(VFS, "Server %s has not responded in %lu >> > > seconds. Reconnecting...\n", >> > > + server->hostname, (2 * server >> > > ->echo_interval) / HZ); >> > > cifs_reconnect(server); >> > > wake_up(&server->response_q); >> > > return true; >> > > @@ -1624,6 +1627,14 @@ cifs_parse_mount_options(const char >> > > *mountdata, const char *devname, >> > > goto cifs_parse_mount_err; >> > > } >> > > break; >> > > + case Opt_echo_interval: >> > > + if (get_option_ul(args, &option)) { >> > > + cifs_dbg(VFS, "%s: Invalid echo >> > > interval value\n", >> > > + __func__); >> > > + goto cifs_parse_mount_err; >> > > + } >> > > + vol->echo_interval = option; >> > > + break; >> > > >> > > /* String Arguments */ >> > > >> > > @@ -2089,6 +2100,9 @@ static int match_server(struct >> > > TCP_Server_Info >> > > *server, struct smb_vol *vol) >> > > if (!match_security(server, vol)) >> > > return 0; >> > > >> > > + if (server->echo_interval != vol->echo_interval) >> > > + return 0; >> > > + >> > > return 1; >> > > } >> > > >> > > @@ -2208,6 +2222,13 @@ cifs_get_tcp_session(struct smb_vol >> > > *volume_info) >> > > tcp_ses->tcpStatus = CifsNew; >> > > ++tcp_ses->srv_count; >> > > >> > > + /* echo interval should be between 10 and 120 secs */ >> > > + if (volume_info->echo_interval > SMB_ECHO_INTERVAL_MIN || >> > > + volume_info->echo_interval < SMB_ECHO_INTERVAL_MAX) >> > > + tcp_ses->echo_interval = volume_info->echo_interval >> > > * HZ; >> > > + else >> > > + tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT >> > > * >> > > HZ; >> > > + >> > > rc = ip_connect(tcp_ses); >> > > if (rc < 0) { >> > > cifs_dbg(VFS, "Error connecting to socket. Aborting >> > > operation.\n"); >> > > @@ -2237,7 +2258,7 @@ cifs_get_tcp_session(struct smb_vol >> > > *volume_info) >> > > cifs_fscache_get_client_cookie(tcp_ses); >> > > >> > > /* queue echo request delayed work */ >> > > - queue_delayed_work(cifsiod_wq, &tcp_ses->echo, >> > > SMB_ECHO_INTERVAL); >> > > + queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses >> > > ->echo_interval); >> > > >> > > return tcp_ses; >> > > >> > >> > -- >> > To unsubscribe from this list: send the line "unsubscribe linux- >> > cifs" in >> > the body of a message to majordomo@xxxxxxxxxxxxxxx >> > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html