From: Nikolaus Rath Date: Thu, 20 Oct 2016 22:45:32 +0000 (-0700) Subject: Turn fuse_operations.nopath_flag into fuse_config.nullpath_ok X-Git-Tag: fuse-3.0.0rc1~16 X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=1d9f26f3736cc4703c2e988d87f5dd119bcd736d;p=qemu-gpiodev%2Flibfuse.git 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. --- 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 @@ -243,6 +243,19 @@ struct fuse_config { int ac_attr_timeout_set; 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. @@ -250,7 +263,6 @@ struct fuse_config { 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 diff --git a/lib/fuse.c b/lib/fuse.c index 1595cc8..df6e3a0 100644 --- a/lib/fuse.c +++ b/lib/fuse.c @@ -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[] = {