aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--example/passthrough_hp.cc10
-rw-r--r--example/printcap.c4
-rw-r--r--include/fuse_common.h8
-rw-r--r--lib/fuse_lowlevel.c4
4 files changed, 25 insertions, 1 deletions
diff --git a/example/passthrough_hp.cc b/example/passthrough_hp.cc
index 1f6647f..c393f04 100644
--- a/example/passthrough_hp.cc
+++ b/example/passthrough_hp.cc
@@ -214,6 +214,16 @@ static void sfs_init(void *userdata, fuse_conn_info *conn) {
/* This is a local file system - no network coherency needed */
fuse_set_feature_flag(conn, FUSE_CAP_DIRECT_IO_ALLOW_MMAP);
+ /* Disable NFS export support, which also disabled name_to_handle_at.
+ * Goal is to make xfstests that test name_to_handle_at to fail with
+ * the right error code (EOPNOTSUPP) than to open_by_handle_at to fail with
+ * ESTALE and let those test fail.
+ * Perfect NFS export support is not possible with this FUSE filesystem needs
+ * more kernel work, in order to passthrough nfs handle encode/decode to
+ * fuse-server/daemon.
+ */
+ fuse_set_feature_flag(conn, FUSE_CAP_NO_EXPORT_SUPPORT);
+
/* Disable the receiving and processing of FUSE_INTERRUPT requests */
conn->no_interrupt = 1;
}
diff --git a/example/printcap.c b/example/printcap.c
index bbbc1b8..01b4d3f 100644
--- a/example/printcap.c
+++ b/example/printcap.c
@@ -88,7 +88,9 @@ static void pc_init(void *userdata,
if(conn->capable & FUSE_CAP_HANDLE_KILLPRIV_V2)
printf("\tFUSE_CAP_HANDLE_KILLPRIV_V2\n");
if(conn->capable & FUSE_CAP_DIRECT_IO_ALLOW_MMAP)
- printf("\tFUSE_CAP_DIRECT_IO_ALLOW_MMAP\n");
+ printf("\tFUSE_CAP_DIRECT_IO_ALLOW_MMAP\n");
+ if (conn->capable & FUSE_CAP_NO_EXPORT_SUPPORT)
+ printf("\tFUSE_CAP_NO_EXPORT_SUPPORT\n");
fuse_session_exit(se);
}
diff --git a/include/fuse_common.h b/include/fuse_common.h
index 1abac5a..85f0b23 100644
--- a/include/fuse_common.h
+++ b/include/fuse_common.h
@@ -495,6 +495,14 @@ struct fuse_loop_config_v1 {
#define FUSE_CAP_PASSTHROUGH (1 << 29)
/**
+ * Indicates that the file system cannot handle NFS export
+ *
+ * If this flag is set NFS export and name_to_handle_at
+ * is not going to work at all and will fail with EOPNOTSUPP.
+ */
+#define FUSE_CAP_NO_EXPORT_SUPPORT (1 << 30)
+
+/**
* Ioctl flags
*
* FUSE_IOCTL_COMPAT: 32bit compat ioctl on 64bit machine
diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
index 220a263..35dc3ca 100644
--- a/lib/fuse_lowlevel.c
+++ b/lib/fuse_lowlevel.c
@@ -2081,6 +2081,8 @@ void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
se->conn.capable |= FUSE_CAP_EXPIRE_ONLY;
if (inargflags & FUSE_PASSTHROUGH)
se->conn.capable |= FUSE_CAP_PASSTHROUGH;
+ if (inargflags & FUSE_NO_EXPORT_SUPPORT)
+ se->conn.capable |= FUSE_CAP_NO_EXPORT_SUPPORT;
} else {
se->conn.max_readahead = 0;
}
@@ -2217,6 +2219,8 @@ void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
*/
outarg.max_stack_depth = se->conn.max_backing_stack_depth + 1;
}
+ if (se->conn.want & FUSE_CAP_NO_EXPORT_SUPPORT)
+ outargflags |= FUSE_NO_EXPORT_SUPPORT;
if (inargflags & FUSE_INIT_EXT) {
outargflags |= FUSE_INIT_EXT;