Linux CIFS filesystem development
 help / color / mirror / Atom feed
From: Tom Talpey <tom@talpey.com>
To: Enzo Matsumiya <ematsumiya@suse.de>,
	Shyam Prasad N <nspmangalore@gmail.com>
Cc: CIFS <linux-cifs@vger.kernel.org>,
	Steve French <smfrench@gmail.com>, Paulo Alcantara <pc@cjr.nz>,
	ronnie sahlberg <ronniesahlberg@gmail.com>
Subject: Re: [PATCH] cifs: introduce dns_interval mount option
Date: Mon, 13 Jun 2022 13:16:00 -0400	[thread overview]
Message-ID: <4e69d335-491a-a9f5-9bf7-e5f8bdd9dccd@talpey.com> (raw)
In-Reply-To: <20220610171616.op43k3b76o4wqna3@cyberdelia>

This change looks good to me. I'm not usually a fan of mount
options, but it's entirely logical here, and the option can
easily be no-oped or tweaked in the future in compatible ways
when the upcall is fully implemented.

Reviewed-by: Tom Talpey <tom@talpey.com>

On 6/10/2022 1:16 PM, Enzo Matsumiya wrote:
> On 06/10, Shyam Prasad N wrote:
>> On Fri, Jun 10, 2022 at 4:14 AM Enzo Matsumiya <ematsumiya@suse.de> 
>> wrote:
>>>
>>> This patch introduces a `dns_interval' mount option, used to configure
>>> the interval that the DNS resolve worker should be run.
>>>
>>> Enforces the minimum value SMB_DNS_RESOLVE_INTERVAL_MIN (currently 
>>> 120s),
>>> or uses the default SMB_DNS_RESOLVE_INTERVAL_DEFAULT (currently 600s).
>>>
>>> Since this is a mount option, each derived connection from it, e.g. DFS
>>> root targets, will share the same DNS interval from the primary server
>>> since the TCP session options are passed down to them.
>>>
>>> Signed-off-by: Enzo Matsumiya <ematsumiya@suse.de>
>>> ---
>>>  fs/cifs/cifsfs.c     |  3 +++
>>>  fs/cifs/cifsglob.h   |  1 +
>>>  fs/cifs/connect.c    | 20 ++++++++++++++------
>>>  fs/cifs/fs_context.c | 11 +++++++++++
>>>  fs/cifs/fs_context.h |  2 ++
>>>  fs/cifs/sess.c       |  1 +
>>>  6 files changed, 32 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
>>> index 325423180fd2..ad980b235699 100644
>>> --- a/fs/cifs/cifsfs.c
>>> +++ b/fs/cifs/cifsfs.c
>>> @@ -665,6 +665,9 @@ cifs_show_options(struct seq_file *s, struct 
>>> dentry *root)
>>>         if (tcon->ses->server->max_credits != 
>>> SMB2_MAX_CREDITS_AVAILABLE)
>>>                 seq_printf(s, ",max_credits=%u", 
>>> tcon->ses->server->max_credits);
>>>
>>> +       if (tcon->ses->server->dns_interval != 
>>> SMB_DNS_RESOLVE_INTERVAL_DEFAULT)
>>> +               seq_printf(s, ",dns_interval=%u", 
>>> tcon->ses->server->dns_interval);
>>> +
>>>         if (tcon->snapshot_time)
>>>                 seq_printf(s, ",snapshot=%llu", tcon->snapshot_time);
>>>         if (tcon->handle_timeout)
>>> diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
>>> index f873379066c7..e28a23b617ef 100644
>>> --- a/fs/cifs/cifsglob.h
>>> +++ b/fs/cifs/cifsglob.h
>>> @@ -679,6 +679,7 @@ struct TCP_Server_Info {
>>>         struct smbd_connection *smbd_conn;
>>>         struct delayed_work     echo; /* echo ping workqueue job */
>>>         struct delayed_work     resolve; /* dns resolution workqueue 
>>> job */
>>> +       unsigned int dns_interval; /* interval for resolve worker */
>>>         char    *smallbuf;      /* pointer to current "small" buffer */
>>>         char    *bigbuf;        /* pointer to current "big" buffer */
>>>         /* Total size of this PDU. Only valid from 
>>> cifs_demultiplex_thread */
>>> diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
>>> index 06bafba9c3ff..e6bedced576a 100644
>>> --- a/fs/cifs/connect.c
>>> +++ b/fs/cifs/connect.c
>>> @@ -92,7 +92,7 @@ static int reconn_set_ipaddr_from_hostname(struct 
>>> TCP_Server_Info *server)
>>>         int len;
>>>         char *unc, *ipaddr = NULL;
>>>         time64_t expiry, now;
>>> -       unsigned long ttl = SMB_DNS_RESOLVE_INTERVAL_DEFAULT;
>>> +       unsigned int ttl = server->dns_interval;
>>>
>>>         if (!server->hostname ||
>>>             server->hostname[0] == '\0')
>>> @@ -129,13 +129,15 @@ static int 
>>> reconn_set_ipaddr_from_hostname(struct TCP_Server_Info *server)
>>>                         /*
>>>                          * To make sure we don't use the cached 
>>> entry, retry 1s
>>>                          * after expiry.
>>> +                        *
>>> +                        * dns_interval is guaranteed to be >= 
>>> SMB_DNS_RESOLVE_INTERVAL_MIN
>>>                          */
>>> -                       ttl = max_t(unsigned long, expiry - now, 
>>> SMB_DNS_RESOLVE_INTERVAL_MIN) + 1;
>>> +                       ttl = max_t(unsigned long, expiry - now, 
>>> server->dns_interval) + 1;
>>>         }
>>>         rc = !rc ? -1 : 0;
>>>
>>>  requeue_resolve:
>>> -       cifs_dbg(FYI, "%s: next dns resolution scheduled for %lu 
>>> seconds in the future\n",
>>> +       cifs_dbg(FYI, "%s: next dns resolution scheduled for %u 
>>> seconds in the future\n",
>>>                  __func__, ttl);
>>>         mod_delayed_work(cifsiod_wq, &server->resolve, (ttl * HZ));
>>>
>>> @@ -1608,6 +1610,12 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx,
>>>                 tcp_ses->echo_interval = ctx->echo_interval * HZ;
>>>         else
>>>                 tcp_ses->echo_interval = SMB_ECHO_INTERVAL_DEFAULT * HZ;
>>> +
>>> +       if (ctx->dns_interval >= SMB_DNS_RESOLVE_INTERVAL_MIN)
>>> +               tcp_ses->dns_interval = ctx->dns_interval;
>>> +       else
>>> +               tcp_ses->dns_interval = 
>>> SMB_DNS_RESOLVE_INTERVAL_DEFAULT;
>>> +
>> Hi Enzo,
>>
>> Is the above line a mistake? Shouldn't that be set to
>> SMB_DNS_RESOLVE_INTERVAL_MIN value in the else case?
>> Rest looks good to me. You can add my RB.
> 
> Hy Shyam,
> 
> SMB_DNS_RESOLVE_INTERVAL_MIN is just for boundary-checking. In case
> dns_interval is < than that, we fallback to the default value (I've copied
> echo_interval behaviour, and also the current behaviour).
> 
> IMHO we shouldn't use SMB_DNS_RESOLVE_INTERVAL_MIN as a fallback value
> because it's too far from the default values used by the servers I've
> checked (Windows Server 2019, 600s, samba "name cache timeout" = 660s).
> 
> 
> Thanks,
> 
> Enzo
> 

      reply	other threads:[~2022-06-13 19:19 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-09 22:43 [PATCH] cifs: introduce dns_interval mount option Enzo Matsumiya
2022-06-10  6:50 ` Shyam Prasad N
2022-06-10 17:16   ` Enzo Matsumiya
2022-06-13 17:16     ` Tom Talpey [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4e69d335-491a-a9f5-9bf7-e5f8bdd9dccd@talpey.com \
    --to=tom@talpey.com \
    --cc=ematsumiya@suse.de \
    --cc=linux-cifs@vger.kernel.org \
    --cc=nspmangalore@gmail.com \
    --cc=pc@cjr.nz \
    --cc=ronniesahlberg@gmail.com \
    --cc=smfrench@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox