diff mbox series

NFS: Judge the file access cache's timestamp in rcu path

Message ID 20221230030432.38908-1-chengen.du@canonical.com (mailing list archive)
State New, archived
Headers show
Series NFS: Judge the file access cache's timestamp in rcu path | expand

Commit Message

Chengen Du Dec. 30, 2022, 3:04 a.m. UTC
If the user's login time is newer than the cache's timestamp,
we expect the cache may be stale and need to clear.
The stale cache will remain in the list's tail if no other
users operate on that inode.
Once the user accesses the inode, the stale cache will be
returned in rcu path.

Signed-off-by: Chengen Du <chengen.du@canonical.com>
---
 fs/nfs/dir.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Chengen Du Jan. 12, 2023, 1:26 a.m. UTC | #1
Hi,

The patch follows the commit 0eb43812c027 but handles the stale cache
in rcu path.
The stale cache will remain in the list's tail if no other users
operate on that inode.
May I ask if this patch has any other concerns or drawbacks that need
to be considered?

Best regards,
Chengen Du

On Fri, Dec 30, 2022 at 11:05 AM Chengen Du <chengen.du@canonical.com> wrote:
>
> If the user's login time is newer than the cache's timestamp,
> we expect the cache may be stale and need to clear.
> The stale cache will remain in the list's tail if no other
> users operate on that inode.
> Once the user accesses the inode, the stale cache will be
> returned in rcu path.
>
> Signed-off-by: Chengen Du <chengen.du@canonical.com>
> ---
>  fs/nfs/dir.c | 3 +++
>  1 file changed, 3 insertions(+)
>
> diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
> index ea1ceffa1d3a..d490d64a9ebd 100644
> --- a/fs/nfs/dir.c
> +++ b/fs/nfs/dir.c
> @@ -3023,6 +3023,7 @@ 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;
> @@ -3037,6 +3038,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)
> +               goto out;
>         if (nfs_check_cache_invalid(inode, NFS_INO_INVALID_ACCESS))
>                 goto out;
>         *mask = cache->mask;
> --
> 2.37.2
>
Trond Myklebust Jan. 12, 2023, 2:48 a.m. UTC | #2
On Thu, 2023-01-12 at 09:26 +0800, Chengen Du wrote:
> Hi,
> 
> The patch follows the commit 0eb43812c027 but handles the stale cache
> in rcu path.
> The stale cache will remain in the list's tail if no other users
> operate on that inode.
> May I ask if this patch has any other concerns or drawbacks that need
> to be considered?
> 
> Best regards,
> Chengen Du

No complaints. The patch has already been merged into 6.2-rc3.

Thanks!
  Trond

> 
> On Fri, Dec 30, 2022 at 11:05 AM Chengen Du
> <chengen.du@canonical.com> wrote:
> > 
> > If the user's login time is newer than the cache's timestamp,
> > we expect the cache may be stale and need to clear.
> > The stale cache will remain in the list's tail if no other
> > users operate on that inode.
> > Once the user accesses the inode, the stale cache will be
> > returned in rcu path.
> > 
> > Signed-off-by: Chengen Du <chengen.du@canonical.com>
> > ---
> >  fs/nfs/dir.c | 3 +++
> >  1 file changed, 3 insertions(+)
> > 
> > diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
> > index ea1ceffa1d3a..d490d64a9ebd 100644
> > --- a/fs/nfs/dir.c
> > +++ b/fs/nfs/dir.c
> > @@ -3023,6 +3023,7 @@ 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;
> > @@ -3037,6 +3038,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)
> > +               goto out;
> >         if (nfs_check_cache_invalid(inode, NFS_INO_INVALID_ACCESS))
> >                 goto out;
> >         *mask = cache->mask;
> > --
> > 2.37.2
> >
diff mbox series

Patch

diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index ea1ceffa1d3a..d490d64a9ebd 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -3023,6 +3023,7 @@  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;
@@ -3037,6 +3038,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)
+		goto out;
 	if (nfs_check_cache_invalid(inode, NFS_INO_INVALID_ACCESS))
 		goto out;
 	*mask = cache->mask;