diff options
author | Miklos Szeredi <mszeredi@redhat.com> | 2018-10-01 10:07:05 +0200 |
---|---|---|
committer | Miklos Szeredi <mszeredi@redhat.com> | 2018-10-01 10:07:05 +0200 |
commit | 261aaba72fdba17b74a3a434d9f925b43d90e958 (patch) | |
tree | 88700d029d1bdf476b8f23e6adb46e3acb2c4b2b /fs/fuse/readdir.c | |
parent | 7118883b44b8edfea732aadeb0d4424da3f152b2 (diff) | |
download | linux-261aaba72fdba17b74a3a434d9f925b43d90e958.tar.bz2 |
fuse: use iversion for readdir cache verification
Use the internal iversion counter to make sure modifications of the
directory through this filesystem are not missed by the mtime check (due to
mtime granularity).
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Diffstat (limited to 'fs/fuse/readdir.c')
-rw-r--r-- | fs/fuse/readdir.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/fs/fuse/readdir.c b/fs/fuse/readdir.c index dafd6543cca2..ab18b78f4755 100644 --- a/fs/fuse/readdir.c +++ b/fs/fuse/readdir.c @@ -8,6 +8,7 @@ #include "fuse_i.h" +#include <linux/iversion.h> #include <linux/posix_acl.h> #include <linux/pagemap.h> #include <linux/highmem.h> @@ -447,6 +448,7 @@ retry_locked: /* Starting cache? Set cache mtime. */ if (!ctx->pos && !fi->rdc.size) { fi->rdc.mtime = inode->i_mtime; + fi->rdc.iversion = inode_query_iversion(inode); } spin_unlock(&fi->rdc.lock); return UNCACHED; @@ -457,7 +459,8 @@ retry_locked: * changed, and reset the cache if so. */ if (!ctx->pos) { - if (!timespec64_equal(&fi->rdc.mtime, &inode->i_mtime)) { + if (inode_peek_iversion(inode) != fi->rdc.iversion || + !timespec64_equal(&fi->rdc.mtime, &inode->i_mtime)) { fuse_rdc_reset(inode); goto retry_locked; } |