aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Nikolaus Rath <Nikolaus@rath.org>2016-10-20 15:45:32 -0700
committerGravatar Nikolaus Rath <Nikolaus@rath.org>2016-10-20 15:45:32 -0700
commit1d9f26f3736cc4703c2e988d87f5dd119bcd736d (patch)
treea2e7aabb5ce872585d0005eed196de9c0fdb029c
parent8ee553dac0297cfd75cbdd2d9cfdce37e22ef4ee (diff)
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.rst4
-rw-r--r--example/passthrough_fh.c1
-rw-r--r--include/fuse.h38
-rw-r--r--lib/fuse.c8
-rw-r--r--lib/modules/iconv.c4
-rw-r--r--lib/modules/subdir.c4
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
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[] = {