cifs: get rid of dns resolve worker
authorPaulo Alcantara <pc@manguebit.com>
Mon, 20 Feb 2023 19:36:54 +0000 (16:36 -0300)
committerSteve French <stfrench@microsoft.com>
Mon, 20 Feb 2023 23:25:43 +0000 (17:25 -0600)
We already upcall to resolve hostnames during reconnect by calling
reconn_set_ipaddr_from_hostname(), so there is no point in having a
worker to periodically call it.

Signed-off-by: Paulo Alcantara (SUSE) <pc@manguebit.com>
Reviewed-by <lsahlber@redhat.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/cifsglob.h
fs/cifs/connect.c
fs/cifs/sess.c

index b26e824d6a0cada346b4bc8a30119dffd84677b5..00ee5e7f79c6dd680335b9dd3fdd40351c17709a 100644 (file)
 #define SMB_ECHO_INTERVAL_MAX 600
 #define SMB_ECHO_INTERVAL_DEFAULT 60
 
-/* dns resolution intervals in seconds */
-#define SMB_DNS_RESOLVE_INTERVAL_MIN     120
-#define SMB_DNS_RESOLVE_INTERVAL_DEFAULT 600
-
 /* smb multichannel query server interfaces interval in seconds */
 #define SMB_INTERFACE_POLL_INTERVAL    600
 
@@ -691,7 +687,6 @@ struct TCP_Server_Info {
        /* point to the SMBD connection if RDMA is used instead of socket */
        struct smbd_connection *smbd_conn;
        struct delayed_work     echo; /* echo ping workqueue job */
-       struct delayed_work     resolve; /* dns resolution workqueue job */
        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 */
index af49ae53aaf40088d7221768cdca3023d0cb270c..150666e143ce9942cdbb279e27945c16aec561cf 100644 (file)
@@ -79,8 +79,6 @@ static int reconn_set_ipaddr_from_hostname(struct TCP_Server_Info *server)
        int len;
        char *unc;
        struct sockaddr_storage ss;
-       time64_t expiry, now;
-       unsigned long ttl = SMB_DNS_RESOLVE_INTERVAL_DEFAULT;
 
        if (!server->hostname)
                return -EINVAL;
@@ -102,29 +100,19 @@ static int reconn_set_ipaddr_from_hostname(struct TCP_Server_Info *server)
        ss = server->dstaddr;
        spin_unlock(&server->srv_lock);
 
-       rc = dns_resolve_server_name_to_ip(unc, (struct sockaddr *)&ss, &expiry);
+       rc = dns_resolve_server_name_to_ip(unc, (struct sockaddr *)&ss, NULL);
        kfree(unc);
 
        if (rc < 0) {
                cifs_dbg(FYI, "%s: failed to resolve server part of %s to IP: %d\n",
                         __func__, server->hostname, rc);
-               goto requeue_resolve;
+       } else {
+               spin_lock(&server->srv_lock);
+               memcpy(&server->dstaddr, &ss, sizeof(server->dstaddr));
+               spin_unlock(&server->srv_lock);
+               rc = 0;
        }
 
-       spin_lock(&server->srv_lock);
-       memcpy(&server->dstaddr, &ss, sizeof(server->dstaddr));
-       spin_unlock(&server->srv_lock);
-
-       now = ktime_get_real_seconds();
-       if (expiry && expiry > now)
-               /* To make sure we don't use the cached entry, retry 1s */
-               ttl = max_t(unsigned long, expiry - now, SMB_DNS_RESOLVE_INTERVAL_MIN) + 1;
-
-requeue_resolve:
-       cifs_dbg(FYI, "%s: next dns resolution scheduled for %lu seconds in the future\n",
-                __func__, ttl);
-       mod_delayed_work(cifsiod_wq, &server->resolve, (ttl * HZ));
-
        return rc;
 }
 
@@ -148,26 +136,6 @@ static void smb2_query_server_interfaces(struct work_struct *work)
                           (SMB_INTERFACE_POLL_INTERVAL * HZ));
 }
 
-static void cifs_resolve_server(struct work_struct *work)
-{
-       int rc;
-       struct TCP_Server_Info *server = container_of(work,
-                                       struct TCP_Server_Info, resolve.work);
-
-       cifs_server_lock(server);
-
-       /*
-        * Resolve the hostname again to make sure that IP address is up-to-date.
-        */
-       rc = reconn_set_ipaddr_from_hostname(server);
-       if (rc) {
-               cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
-                               __func__, rc);
-       }
-
-       cifs_server_unlock(server);
-}
-
 /*
  * Update the tcpStatus for the server.
  * This is used to signal the cifsd thread to call cifs_reconnect
@@ -925,7 +893,6 @@ static void clean_demultiplex_info(struct TCP_Server_Info *server)
        spin_unlock(&server->srv_lock);
 
        cancel_delayed_work_sync(&server->echo);
-       cancel_delayed_work_sync(&server->resolve);
 
        spin_lock(&server->srv_lock);
        server->tcpStatus = CifsExiting;
@@ -1549,7 +1516,6 @@ cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
                cifs_put_tcp_session(server->primary_server, from_reconnect);
 
        cancel_delayed_work_sync(&server->echo);
-       cancel_delayed_work_sync(&server->resolve);
 
        if (from_reconnect)
                /*
@@ -1655,7 +1621,6 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx,
        INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
        INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
        INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
-       INIT_DELAYED_WORK(&tcp_ses->resolve, cifs_resolve_server);
        INIT_DELAYED_WORK(&tcp_ses->reconnect, smb2_reconnect_server);
        mutex_init(&tcp_ses->reconnect_mutex);
 #ifdef CONFIG_CIFS_DFS_UPCALL
@@ -1744,12 +1709,6 @@ smbd_connected:
        /* queue echo request delayed work */
        queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
 
-       /* queue dns resolution delayed work */
-       cifs_dbg(FYI, "%s: next dns resolution scheduled for %d seconds in the future\n",
-                __func__, SMB_DNS_RESOLVE_INTERVAL_DEFAULT);
-
-       queue_delayed_work(cifsiod_wq, &tcp_ses->resolve, (SMB_DNS_RESOLVE_INTERVAL_DEFAULT * HZ));
-
        return tcp_ses;
 
 out_err_crypto_release:
index c47b254f0d1e276a312f0bcca25e3c1cbf09bd9c..d2cbae4b5d211933110f35f5b4fa48a49d0cee0b 100644 (file)
@@ -480,7 +480,6 @@ out:
                 * remove this channel
                 */
                cancel_delayed_work_sync(&chan->server->echo);
-               cancel_delayed_work_sync(&chan->server->resolve);
                cancel_delayed_work_sync(&chan->server->reconnect);
 
                spin_lock(&ses->chan_lock);