From: Brian F. <bf...@re...> - 2012-07-10 14:39:11
|
Several caching logic changes have been made on the kernel side to better support network-based fuse filesystems. These include kernel side mtime checking and read path cache revalidation. The original caching logic is preserved through the FUSE_LEGACY_CACHE init flag. Export this to the user via the 'legacy_cache' mount option. --- include/fuse_common.h | 1 + include/fuse_kernel.h | 1 + lib/fuse_i.h | 1 + lib/fuse_lowlevel.c | 8 ++++++++ 4 files changed, 11 insertions(+), 0 deletions(-) diff --git a/include/fuse_common.h b/include/fuse_common.h index a4d980d..1262911 100644 --- a/include/fuse_common.h +++ b/include/fuse_common.h @@ -112,6 +112,7 @@ struct fuse_file_info { #define FUSE_CAP_SPLICE_READ (1 << 9) #define FUSE_CAP_FLOCK_LOCKS (1 << 10) #define FUSE_CAP_IOCTL_DIR (1 << 11) +#define FUSE_CAP_LEGACY_CACHE (1 << 12) /** * Ioctl flags diff --git a/include/fuse_kernel.h b/include/fuse_kernel.h index c632b58..715b3b5 100644 --- a/include/fuse_kernel.h +++ b/include/fuse_kernel.h @@ -207,6 +207,7 @@ struct fuse_file_lock { #define FUSE_BIG_WRITES (1 << 5) #define FUSE_DONT_MASK (1 << 6) #define FUSE_FLOCK_LOCKS (1 << 10) +#define FUSE_LEGACY_CACHE (1 << 12) /** * CUSE INIT request/reply flags diff --git a/lib/fuse_i.h b/lib/fuse_i.h index 78f1467..05a8d1f 100644 --- a/lib/fuse_i.h +++ b/lib/fuse_i.h @@ -71,6 +71,7 @@ struct fuse_ll { int no_splice_write; int no_splice_move; int no_splice_read; + int legacy_cache; struct fuse_lowlevel_ops op; int got_init; struct cuse_data *cuse_data; diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c index a259f37..80b3913 100644 --- a/lib/fuse_lowlevel.c +++ b/lib/fuse_lowlevel.c @@ -1788,6 +1788,8 @@ static void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg) f->conn.capable |= FUSE_CAP_DONT_MASK; if (arg->flags & FUSE_FLOCK_LOCKS) f->conn.capable |= FUSE_CAP_FLOCK_LOCKS; + if (arg->flags & FUSE_LEGACY_CACHE) + f->conn.capable |= FUSE_CAP_LEGACY_CACHE; } else { f->conn.async_read = 0; f->conn.max_readahead = 0; @@ -1818,6 +1820,8 @@ static void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg) f->conn.want |= FUSE_CAP_FLOCK_LOCKS; if (f->big_writes) f->conn.want |= FUSE_CAP_BIG_WRITES; + if (f->legacy_cache) + f->conn.want |= FUSE_CAP_LEGACY_CACHE; if (bufsize < FUSE_MIN_READ_BUFFER) { fprintf(stderr, "fuse: warning: buffer size too small: %zu\n", @@ -1854,6 +1858,8 @@ static void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg) outarg.flags |= FUSE_DONT_MASK; if (f->conn.want & FUSE_CAP_FLOCK_LOCKS) outarg.flags |= FUSE_FLOCK_LOCKS; + if (f->conn.want & FUSE_CAP_LEGACY_CACHE) + outarg.flags |= FUSE_LEGACY_CACHE; outarg.max_readahead = f->conn.max_readahead; outarg.max_write = f->conn.max_write; if (f->conn.proto_minor >= 13) { @@ -2490,6 +2496,7 @@ static const struct fuse_opt fuse_ll_opts[] = { { "no_splice_move", offsetof(struct fuse_ll, no_splice_move), 1}, { "splice_read", offsetof(struct fuse_ll, splice_read), 1}, { "no_splice_read", offsetof(struct fuse_ll, no_splice_read), 1}, + { "legacy_cache", offsetof(struct fuse_ll, legacy_cache), 1}, FUSE_OPT_KEY("max_read=", FUSE_OPT_KEY_DISCARD), FUSE_OPT_KEY("-h", KEY_HELP), FUSE_OPT_KEY("--help", KEY_HELP), @@ -2521,6 +2528,7 @@ static void fuse_ll_help(void) " -o [no_]splice_write use splice to write to the fuse device\n" " -o [no_]splice_move move data while splicing to the fuse device\n" " -o [no_]splice_read use splice to read from the fuse device\n" +" -o legacy_cache use legacy cache invalidation logic\n" ); } -- 1.7.7.6 |