diff options
author | Nikolaus Rath <Nikolaus@rath.org> | 2016-10-20 15:45:32 -0700 |
---|---|---|
committer | Nikolaus Rath <Nikolaus@rath.org> | 2016-10-20 15:45:32 -0700 |
commit | 1d9f26f3736cc4703c2e988d87f5dd119bcd736d (patch) | |
tree | a2e7aabb5ce872585d0005eed196de9c0fdb029c | |
parent | 8ee553dac0297cfd75cbdd2d9cfdce37e22ef4ee (diff) | |
download | fuse-1d9f26f3736cc4703c2e988d87f5dd119bcd736d.tar.gz |
Turn fuse_operations.nopath_flag into fuse_config.nullpath_ok
Modifying struct fuse_config in the init() handler is the canonical way
to adjust file-system implementation specific settings. There is no need
to have flags in struct fuse_operations.
-rw-r--r-- | ChangeLog.rst | 4 | ||||
-rw-r--r-- | example/passthrough_fh.c | 1 | ||||
-rw-r--r-- | include/fuse.h | 38 | ||||
-rw-r--r-- | lib/fuse.c | 8 | ||||
-rw-r--r-- | lib/modules/iconv.c | 4 | ||||
-rw-r--r-- | lib/modules/subdir.c | 4 |
6 files changed, 25 insertions, 34 deletions
diff --git a/ChangeLog.rst b/ChangeLog.rst index 7d32ba6..e614e6b 100644 --- a/ChangeLog.rst +++ b/ChangeLog.rst @@ -5,6 +5,10 @@ Unreleased Changes fuse_config pointer that can be used to adjust high-level API specific configuration options. +* The `nopath_flag` field of struct fuse_operations has been + removed. Instead, a new `nullpath_ok` flag can now be set + in struct fuse_config. + * File systems that use the low-level API and support lookup requests for '.' and '..' should continue make sure to set the FUSE_CAP_EXPORT_SUPPORT bit in fuse_conn_info->want. diff --git a/example/passthrough_fh.c b/example/passthrough_fh.c index f74940d..781f717 100644 --- a/example/passthrough_fh.c +++ b/example/passthrough_fh.c @@ -57,6 +57,7 @@ static void *xmp_init(struct fuse_conn_info *conn, { (void) conn; cfg->use_ino = 1; + cfg->nullpath_ok = 1; return NULL; } diff --git a/include/fuse.h b/include/fuse.h index 3c13c14..e8ff936 100644 --- a/include/fuse.h +++ b/include/fuse.h @@ -244,13 +244,25 @@ struct fuse_config { double ac_attr_timeout; /** + * If this option is given the file-system handlers for the + * following operations will not receive path information: + * read, write, flush, release, fsync, readdir, releasedir, + * fsyncdir, lock, ioctl and poll. + * + * For the truncate, getattr, chmod, chown and utimens + * operations the path will be provided only if the file is + * not currently open (i.e., when the struct fuse_file_info + * argument is NULL). + */ + int nullpath_ok; + + /** * The remaining options are used by libfuse internally and * should not be touched. */ int show_help; char *modules; int debug; - int nopath; }; @@ -277,30 +289,6 @@ struct fuse_config { * is also a snapshot of the relevant wiki pages in the doc/ folder. */ struct fuse_operations { - /** - * Flag indicating that the path need not be calculated for - * the following operations: - * - * read, write, flush, release, fsync, readdir, releasedir, - * fsyncdir, lock, ioctl and poll - * - * For the following operations, the path will not be - * calculated only if the file is currently open (i.e., the - * struct fuse_file_info argument is non-NULL): - * - * truncate, getattr, chmod, chown, utimens - * - * If this flag is set then the path will not be calculaged even if the - * file wasn't unlinked. However the path can still be non-NULL if it - * needs to be calculated for some other reason. - */ - unsigned int flag_nopath:1; - - /** - * Reserved flags, don't set - */ - unsigned int flag_reserved:31; - /** Get file attributes. * * Similar to stat(). The 'st_dev' and 'st_blksize' fields are @@ -1193,7 +1193,7 @@ static int get_path_nullok(struct fuse *f, fuse_ino_t nodeid, char **path) { int err = 0; - if (f->conf.nopath) { + if (f->conf.nullpath_ok) { *path = NULL; } else { err = get_path_common(f, nodeid, NULL, path, NULL); @@ -2958,7 +2958,7 @@ static void fuse_do_release(struct fuse *f, fuse_ino_t ino, const char *path, if(unlink_hidden) { if (path) { fuse_fs_unlink(f->fs, path); - } else if (f->conf.nopath) { + } else if (f->conf.nullpath_ok) { char *unlinkpath; if (get_path(f, ino, &unlinkpath) == 0) @@ -4480,7 +4480,6 @@ static int fuse_push_module(struct fuse *f, const char *module, } newfs->m = m; f->fs = newfs; - f->conf.nopath = newfs->op.flag_nopath && f->conf.nopath; return 0; } @@ -4596,7 +4595,6 @@ struct fuse *fuse_new(struct fuse_args *args, goto out_delete_context_key; f->fs = fs; - f->conf.nopath = fs->op.flag_nopath; /* Oh f**k, this is ugly! */ if (!fs->op.lock) { @@ -4650,7 +4648,7 @@ struct fuse *fuse_new(struct fuse_args *args, goto out_free_fs; if (f->conf.debug) { - fprintf(stderr, "nopath: %i\n", f->conf.nopath); + fprintf(stderr, "nullpath_ok: %i\n", f->conf.nullpath_ok); } /* Trace topmost layer by default */ diff --git a/lib/modules/iconv.c b/lib/modules/iconv.c index b0453be..5d1e959 100644 --- a/lib/modules/iconv.c +++ b/lib/modules/iconv.c @@ -561,6 +561,8 @@ static void *iconv_init(struct fuse_conn_info *conn, { struct iconv *ic = iconv_get(); fuse_fs_init(ic->next, conn, cfg); + /* Don't touch cfg->nullpath_ok, we can work with + either */ return ic; } @@ -612,8 +614,6 @@ static const struct fuse_operations iconv_oper = { .lock = iconv_lock, .flock = iconv_flock, .bmap = iconv_bmap, - - .flag_nopath = 1, }; static const struct fuse_opt iconv_opts[] = { diff --git a/lib/modules/subdir.c b/lib/modules/subdir.c index 708edf3..9478e4e 100644 --- a/lib/modules/subdir.c +++ b/lib/modules/subdir.c @@ -547,6 +547,8 @@ static void *subdir_init(struct fuse_conn_info *conn, { struct subdir *d = subdir_get(); fuse_fs_init(d->next, conn, cfg); + /* Don't touch cfg->nullpath_ok, we can work with + either */ return d; } @@ -594,8 +596,6 @@ static const struct fuse_operations subdir_oper = { .lock = subdir_lock, .flock = subdir_flock, .bmap = subdir_bmap, - - .flag_nopath = 1, }; static const struct fuse_opt subdir_opts[] = { |