From patchwork Wed Aug 28 05:02:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve French X-Patchwork-Id: 11117781 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9FAB81399 for ; Wed, 28 Aug 2019 05:03:07 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 7084720673 for ; Wed, 28 Aug 2019 05:03:07 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="GefnAJXe" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726101AbfH1FDH (ORCPT ); Wed, 28 Aug 2019 01:03:07 -0400 Received: from mail-io1-f51.google.com ([209.85.166.51]:42677 "EHLO mail-io1-f51.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725865AbfH1FDG (ORCPT ); Wed, 28 Aug 2019 01:03:06 -0400 Received: by mail-io1-f51.google.com with SMTP id e20so3314101iob.9 for ; Tue, 27 Aug 2019 22:03:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=4j9z9y9SvcPz2jQyvlQNFgNY7UjeD0bmv7SSxcLtAiU=; b=GefnAJXemNU6AaZnvQXw9kifehOZZUGZotQZuHhMWDqOwLgJP13amdeoqA8YPOsAV2 Ar8+PwgKJi6jiA+otTtvStBUgB80igyJIt6A2YE1o2imQZqgHNOCYGmsLuXbkA47LHmz SYBmcWT272JsBjU7pysSS+CdLiPvrGX+QVMSILzMs/q/Uy2bfsEht6gWRT688nQYZiiL z6WQZ+3d79w/vkJnRRZsermmuWVgh7+BacCU0bN2UmFhTYIaTefPyVuAq0GlVlDJ8AmG BWtW8YDlkJEqEjZL0sBPN4Z3rTG6ilIq5PEi8mJ44pg9b6DaLmiJcTXO2pWlGURjSRGp oSww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=4j9z9y9SvcPz2jQyvlQNFgNY7UjeD0bmv7SSxcLtAiU=; b=YTBmb++v/BOtAYqo9Em5BQxXww95fSUQcxRa81cRbYMmlAPETobffeEFB9ymezQEUw W0rWkkITzkKxZ6KBWk9vW2y8jFwl5c8UACoC2wWnmq2eYuaRRKvFhEDEPjVQW5PRNxDF nfUWQhOYHizkV0W+B0egue2t2dWnszk+t1ebc2yZb9YopwdmOgyhC4douB9D48ozkVXX Y4sayvmCVKP6Abx48/420AnMTAFeGbtCGIlUOioXQ8pF0ZG4OZybi/BKkmyR8rMocNs9 slrmLu9prnP+CK9onu3BJbh+aa/At9fAsRlC13oXnlwLx3qD8aezMDkGaXxkQB5VqA0T FGcw== X-Gm-Message-State: APjAAAVUqQ+UKQybXw22G8poo2vv7m9cqT4fi44HH4E2ZonhUWA14DQF sXai7vnMfvFadmz4mH5bl/nmjLgIEWDicjQeY0+U2fQn X-Google-Smtp-Source: APXvYqxQO4f4j9fFb9mawkMhlcEYrTeHetqTgpyJeB+E4/NPj0jYfwBKxOpzC2lNiyXT8UudxIzk2dcHSeNF7WpNxoo= X-Received: by 2002:a5d:8591:: with SMTP id f17mr2201689ioj.5.1566968585427; Tue, 27 Aug 2019 22:03:05 -0700 (PDT) MIME-Version: 1.0 From: Steve French Date: Wed, 28 Aug 2019 00:02:53 -0500 Message-ID: Subject: [RFC][SMB3][PATCH] Allow share to be mounted with "cache=ro" if immutable share To: CIFS Sender: linux-cifs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-cifs@vger.kernel.org Increases performance a lot in cases where we know that the share is not changing From a2c56fa07718ec7de30866919c7ae442a72f8a5f Mon Sep 17 00:00:00 2001 From: Steve French Date: Tue, 27 Aug 2019 23:58:54 -0500 Subject: [PATCH] smb3: add mount option to allow forced caching of read only share If a share is immutable (at least for the period that it will be mounted) it would be helpful to not have to revalidate dentries repeatedly that we know can not be changed remotely. Add "cache=" option (cache=ro) for mounting read only shares in order to improve performance in cases in which we know that the share will not be changing while it is in use. Signed-off-by: Steve French --- fs/cifs/cifs_fs_sb.h | 1 + fs/cifs/cifsfs.c | 2 ++ fs/cifs/cifsglob.h | 3 ++- fs/cifs/connect.c | 14 ++++++++++++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/fs/cifs/cifs_fs_sb.h b/fs/cifs/cifs_fs_sb.h index b326d2ca3765..286a104c4761 100644 --- a/fs/cifs/cifs_fs_sb.h +++ b/fs/cifs/cifs_fs_sb.h @@ -53,6 +53,7 @@ #define CIFS_MOUNT_NO_HANDLE_CACHE 0x4000000 /* disable caching dir handles */ #define CIFS_MOUNT_NO_DFS 0x8000000 /* disable DFS resolving */ #define CIFS_MOUNT_MODE_FROM_SID 0x10000000 /* retrieve mode from special ACE */ +#define CIFS_MOUNT_RO_CACHE 0x20000000 /* assumes share will not change */ struct cifs_sb_info { struct rb_root tlink_tree; diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 3289b566463f..970251bc0661 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c @@ -400,6 +400,8 @@ cifs_show_cache_flavor(struct seq_file *s, struct cifs_sb_info *cifs_sb) seq_puts(s, "strict"); else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) seq_puts(s, "none"); + else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) + seq_puts(s, "ro"); /* read only caching assumed */ else seq_puts(s, "loose"); } diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h index fe610e7e3670..f2ee201ec98a 100644 --- a/fs/cifs/cifsglob.h +++ b/fs/cifs/cifsglob.h @@ -559,6 +559,7 @@ struct smb_vol { bool server_ino:1; /* use inode numbers from server ie UniqueId */ bool direct_io:1; bool strict_io:1; /* strict cache behavior */ + bool cache_ro:1; bool remap:1; /* set to remap seven reserved chars in filenames */ bool sfu_remap:1; /* remap seven reserved chars ala SFU */ bool posix_paths:1; /* unset to not ask for posix pathnames. */ @@ -1366,7 +1367,7 @@ void cifsFileInfo_put(struct cifsFileInfo *cifs_file); #define CIFS_CACHE_RW_FLG (CIFS_CACHE_READ_FLG | CIFS_CACHE_WRITE_FLG) #define CIFS_CACHE_RHW_FLG (CIFS_CACHE_RW_FLG | CIFS_CACHE_HANDLE_FLG) -#define CIFS_CACHE_READ(cinode) (cinode->oplock & CIFS_CACHE_READ_FLG) +#define CIFS_CACHE_READ(cinode) ((cinode->oplock & CIFS_CACHE_READ_FLG) || (CIFS_SB(cinode->vfs_inode.i_sb)->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE)) #define CIFS_CACHE_HANDLE(cinode) (cinode->oplock & CIFS_CACHE_HANDLE_FLG) #define CIFS_CACHE_WRITE(cinode) (cinode->oplock & CIFS_CACHE_WRITE_FLG) diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 4fe559821aff..81cebf4c2269 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -298,6 +298,7 @@ enum { Opt_cache_loose, Opt_cache_strict, Opt_cache_none, + Opt_cache_ro, Opt_cache_err }; @@ -305,6 +306,7 @@ static const match_table_t cifs_cacheflavor_tokens = { { Opt_cache_loose, "loose" }, { Opt_cache_strict, "strict" }, { Opt_cache_none, "none" }, + { Opt_cache_ro, "ro" }, { Opt_cache_err, NULL } }; @@ -1418,14 +1420,22 @@ cifs_parse_cache_flavor(char *value, struct smb_vol *vol) case Opt_cache_loose: vol->direct_io = false; vol->strict_io = false; + vol->cache_ro = false; break; case Opt_cache_strict: vol->direct_io = false; vol->strict_io = true; + vol->cache_ro = false; break; case Opt_cache_none: vol->direct_io = true; vol->strict_io = false; + vol->cache_ro = false; + break; + case Opt_cache_ro: + vol->direct_io = false; + vol->strict_io = false; + vol->cache_ro = true; break; default: cifs_dbg(VFS, "bad cache= option: %s\n", value); @@ -4040,6 +4050,10 @@ int cifs_setup_cifs_sb(struct smb_vol *pvolume_info, cifs_dbg(FYI, "mounting share using direct i/o\n"); cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO; } + if (pvolume_info->cache_ro) { + cifs_dbg(VFS, "mounting share with read only caching. Ensure that the share will not be modified while in use.\n"); + cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_RO_CACHE; + } if (pvolume_info->mfsymlinks) { if (pvolume_info->sfu_emul) { /* -- 2.20.1