From: Chengen Du <chengen.du@canonical.com>
To: trond.myklebust@hammerspace.com
Cc: anna@kernel.org, linux-nfs@vger.kernel.org,
linux-kernel@vger.kernel.org,
Chengen Du <chengen.du@canonical.com>
Subject: [PATCH] NFS: Add mount option 'nofasc'
Date: Tue, 11 Apr 2023 11:02:48 +0800 [thread overview]
Message-ID: <20230411030248.53356-1-chengen.du@canonical.com> (raw)
This mount option is used to skip clearing the file access cache
upon login. Some users or applications switch to other privileged
users via commands such as 'su' to operate on NFS-mounted folders.
In such cases, the privileged user's login time will be renewed,
and NFS ACCESS operations will need to be re-sent, potentially
leading to performance degradation.
In some production environments where the access cache can be
trusted due to stable group membership, this option could be
particularly useful.
Signed-off-by: Chengen Du <chengen.du@canonical.com>
---
fs/nfs/dir.c | 21 ++++++++++++---------
fs/nfs/fs_context.c | 8 ++++++++
fs/nfs/super.c | 1 +
include/linux/nfs_fs_sb.h | 1 +
4 files changed, 22 insertions(+), 9 deletions(-)
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index 6fbcbb8d6587..9a6d86e2044e 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -2953,12 +2953,14 @@ static struct nfs_access_entry *nfs_access_search_rbtree(struct inode *inode, co
return NULL;
}
-static u64 nfs_access_login_time(const struct task_struct *task,
- const struct cred *cred)
+static inline
+bool nfs_check_access_stale(const struct task_struct *task,
+ const struct cred *cred,
+ const struct nfs_access_entry *cache)
{
const struct task_struct *parent;
const struct cred *pcred;
- u64 ret;
+ u64 login_time;
rcu_read_lock();
for (;;) {
@@ -2968,15 +2970,15 @@ static u64 nfs_access_login_time(const struct task_struct *task,
break;
task = parent;
}
- ret = task->start_time;
+ login_time = task->start_time;
rcu_read_unlock();
- return ret;
+
+ return ((s64)(login_time - cache->timestamp) > 0);
}
static int nfs_access_get_cached_locked(struct inode *inode, const struct cred *cred, u32 *mask, bool may_block)
{
struct nfs_inode *nfsi = NFS_I(inode);
- u64 login_time = nfs_access_login_time(current, cred);
struct nfs_access_entry *cache;
bool retry = true;
int err;
@@ -3005,7 +3007,8 @@ static int nfs_access_get_cached_locked(struct inode *inode, const struct cred *
retry = false;
}
err = -ENOENT;
- if ((s64)(login_time - cache->timestamp) > 0)
+ if (!(NFS_SERVER(inode)->flags & NFS_MOUNT_NOFASC) &&
+ nfs_check_access_stale(current, cred, cache))
goto out;
*mask = cache->mask;
list_move_tail(&cache->lru, &nfsi->access_cache_entry_lru);
@@ -3025,7 +3028,6 @@ static int nfs_access_get_cached_rcu(struct inode *inode, const struct cred *cre
* but do it without locking.
*/
struct nfs_inode *nfsi = NFS_I(inode);
- u64 login_time = nfs_access_login_time(current, cred);
struct nfs_access_entry *cache;
int err = -ECHILD;
struct list_head *lh;
@@ -3040,7 +3042,8 @@ static int nfs_access_get_cached_rcu(struct inode *inode, const struct cred *cre
cache = NULL;
if (cache == NULL)
goto out;
- if ((s64)(login_time - cache->timestamp) > 0)
+ if (!(NFS_SERVER(inode)->flags & NFS_MOUNT_NOFASC) &&
+ nfs_check_access_stale(current, cred, cache))
goto out;
if (nfs_check_cache_invalid(inode, NFS_INO_INVALID_ACCESS))
goto out;
diff --git a/fs/nfs/fs_context.c b/fs/nfs/fs_context.c
index 9bcd53d5c7d4..5cd9b2882c79 100644
--- a/fs/nfs/fs_context.c
+++ b/fs/nfs/fs_context.c
@@ -88,6 +88,7 @@ enum nfs_param {
Opt_vers,
Opt_wsize,
Opt_write,
+ Opt_fasc,
};
enum {
@@ -194,6 +195,7 @@ static const struct fs_parameter_spec nfs_fs_parameters[] = {
fsparam_string("vers", Opt_vers),
fsparam_enum ("write", Opt_write, nfs_param_enums_write),
fsparam_u32 ("wsize", Opt_wsize),
+ fsparam_flag_no("fasc", Opt_fasc),
{}
};
@@ -861,6 +863,12 @@ static int nfs_fs_context_parse_param(struct fs_context *fc,
case Opt_sloppy:
ctx->sloppy = true;
break;
+ case Opt_fasc:
+ if (result.negated)
+ ctx->flags |= NFS_MOUNT_NOFASC;
+ else
+ ctx->flags &= ~NFS_MOUNT_NOFASC;
+ break;
}
return 0;
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index 05ae23657527..059513d403f8 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -444,6 +444,7 @@ static void nfs_show_mount_options(struct seq_file *m, struct nfs_server *nfss,
{ NFS_MOUNT_NORDIRPLUS, ",nordirplus", "" },
{ NFS_MOUNT_UNSHARED, ",nosharecache", "" },
{ NFS_MOUNT_NORESVPORT, ",noresvport", "" },
+ { NFS_MOUNT_NOFASC, ",nofasc", "" },
{ 0, NULL, NULL }
};
const struct proc_nfs_info *nfs_infop;
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h
index ea2f7e6b1b0b..a39ae1bd2217 100644
--- a/include/linux/nfs_fs_sb.h
+++ b/include/linux/nfs_fs_sb.h
@@ -153,6 +153,7 @@ struct nfs_server {
#define NFS_MOUNT_WRITE_EAGER 0x01000000
#define NFS_MOUNT_WRITE_WAIT 0x02000000
#define NFS_MOUNT_TRUNK_DISCOVERY 0x04000000
+#define NFS_MOUNT_NOFASC 0x08000000
unsigned int fattr_valid; /* Valid attributes */
unsigned int caps; /* server capabilities */
--
2.37.2
next reply other threads:[~2023-04-11 3:03 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-11 3:02 Chengen Du [this message]
2023-04-19 7:17 ` Daire Byrne
2023-04-25 1:41 ` Chengen Du
2023-05-09 2:31 ` Chengen Du
2023-05-09 11:53 ` Jan Ingvoldstad
2023-05-09 15:16 ` Benjamin Coddington
2023-05-10 2:26 ` Chengen Du
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=20230411030248.53356-1-chengen.du@canonical.com \
--to=chengen.du@canonical.com \
--cc=anna@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=trond.myklebust@hammerspace.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
all inboxes | Powered by JetHome®