aboutsummaryrefslogtreecommitdiffstats
path: root/lib/fuse_lowlevel.c
diff options
context:
space:
mode:
authorJosef Bacik <josef@toxicpanda.com>2024-05-10 11:52:20 -0400
committerGitHub <noreply@github.com>2024-05-10 17:52:20 +0200
commit2bdec0bc22ce39b307e299ee9ec19d1c58b640de (patch)
treec1595664c90b2012ce97e6e8290d9b221a51e0c3 /lib/fuse_lowlevel.c
parent0128f5efe8d4bdf1256a358358dd0ac3098a66ee (diff)
downloadlibfuse-2bdec0bc22ce39b307e299ee9ec19d1c58b640de.tar.gz
Handle NO_OPEN/NO_OPENDIR support automatically (#949)
If the file system doesn't provide a ->open or an ->opendir, and the kernel supports FUSE_CAP_NO_OPEN_SUPPORT or FUSE_CAP_NO_OPENDIR_SUPPORT, allow the implementation to set FUSE_CAP_NO_OPEN*_SUPPORT on conn->want in order to automatically get this behavior. Expand the documentation to be more explicit about the behavior of libfuse in the different cases WRT this capability. Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Diffstat (limited to 'lib/fuse_lowlevel.c')
-rw-r--r--lib/fuse_lowlevel.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
index 5129a3b..46aef98 100644
--- a/lib/fuse_lowlevel.c
+++ b/lib/fuse_lowlevel.c
@@ -1351,6 +1351,8 @@ static void do_open(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
if (req->se->op.open)
req->se->op.open(req, nodeid, &fi);
+ else if (req->se->conn.want & FUSE_CAP_NO_OPEN_SUPPORT)
+ fuse_reply_err(req, ENOSYS);
else
fuse_reply_open(req, &fi);
}
@@ -1507,6 +1509,8 @@ static void do_opendir(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
if (req->se->op.opendir)
req->se->op.opendir(req, nodeid, &fi);
+ else if (req->se->conn.want & FUSE_CAP_NO_OPENDIR_SUPPORT)
+ fuse_reply_err(req, ENOSYS);
else
fuse_reply_open(req, &fi);
}