smb: client: do not start laundromat thread on nohandlecache
authorPaulo Alcantara <pc@manguebit.com>
Wed, 4 Oct 2023 20:28:38 +0000 (17:28 -0300)
committerSteve French <stfrench@microsoft.com>
Wed, 4 Oct 2023 21:21:15 +0000 (16:21 -0500)
Honor 'nohandlecache' mount option by not starting laundromat thread
even when SMB server supports directory leases. Do not waste system
resources by having laundromat thread running with no directory
caching at all.

Fixes: 2da338ff752a ("smb3: do not start laundromat thread when dir leases disabled")
Signed-off-by: Paulo Alcantara (SUSE) <pc@manguebit.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/connect.c

index ce11165446cfb671e23ed1b41eafed3a0d5c04ea..7b923e36501b0bb09f7a1339004ab23f335510e0 100644 (file)
@@ -2474,8 +2474,9 @@ cifs_put_tcon(struct cifs_tcon *tcon)
 static struct cifs_tcon *
 cifs_get_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx)
 {
-       int rc, xid;
        struct cifs_tcon *tcon;
+       bool nohandlecache;
+       int rc, xid;
 
        tcon = cifs_find_tcon(ses, ctx);
        if (tcon) {
@@ -2493,14 +2494,17 @@ cifs_get_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx)
                goto out_fail;
        }
 
-       if (ses->server->capabilities & SMB2_GLOBAL_CAP_DIRECTORY_LEASING)
-               tcon = tcon_info_alloc(true);
+       if (ses->server->dialect >= SMB20_PROT_ID &&
+           (ses->server->capabilities & SMB2_GLOBAL_CAP_DIRECTORY_LEASING))
+               nohandlecache = ctx->nohandlecache;
        else
-               tcon = tcon_info_alloc(false);
+               nohandlecache = true;
+       tcon = tcon_info_alloc(!nohandlecache);
        if (tcon == NULL) {
                rc = -ENOMEM;
                goto out_fail;
        }
+       tcon->nohandlecache = nohandlecache;
 
        if (ctx->snapshot_time) {
                if (ses->server->vals->protocol_id == 0) {
@@ -2662,10 +2666,6 @@ cifs_get_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx)
        tcon->nocase = ctx->nocase;
        tcon->broken_sparse_sup = ctx->no_sparse;
        tcon->max_cached_dirs = ctx->max_cached_dirs;
-       if (ses->server->capabilities & SMB2_GLOBAL_CAP_DIRECTORY_LEASING)
-               tcon->nohandlecache = ctx->nohandlecache;
-       else
-               tcon->nohandlecache = true;
        tcon->nodelete = ctx->nodelete;
        tcon->local_lease = ctx->local_lease;
        INIT_LIST_HEAD(&tcon->pending_opens);