From c45863318889fa6344534537c7ef91a37b3fba32 Mon Sep 17 00:00:00 2001 From: yangyun Date: Fri, 23 Feb 2024 14:16:05 +0800 Subject: Enable direct IO for passthrough examples when open has flag O_DIRECT Shared locks (parallel_direct_writes) cannot be enabled for O_DIRECT, as O_DIRECT may be set past file open time with fcntl(fd, F_SETFD, ...). Kernel side fuse has precautions for shared lock direct-IO (direct_io in libfuse), as it needs an exclusive inode lock when direct and page cache IO happend at the same time. In order to enjoy the parallel_direct_writes feature (i.e., get a shared lock, not exclusive lock) for writes to the same file), direct_io is needed. The feature direct_io is corresponding to FOPEN_DIRECT_IO in fuse kernel. FOPEN_DIRECT_IO and O_DIRECT are not entirely the same as described above. So enable direct_io (i.e., FOPEN_DIRECT_IO in fuse kernel) to enjoy parallel direct_writes. Some patches related to FOPEN_DIRECT_IO and O_DIRECT are below: https://lore.kernel.org/all/753d6823-e984-4730-a126-d66b65ea772c@ddn.com --- example/passthrough.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'example/passthrough.c') diff --git a/example/passthrough.c b/example/passthrough.c index 5a0d6d7..30a8ad5 100644 --- a/example/passthrough.c +++ b/example/passthrough.c @@ -303,6 +303,14 @@ static int xmp_open(const char *path, struct fuse_file_info *fi) if (res == -1) return -errno; + /* Enable direct_io when open has flags O_DIRECT to enjoy the feature + parallel_direct_writes (i.e., to get a shared lock, not exclusive lock, + for writes to the same file). */ + if (fi->flags & O_DIRECT) { + fi->direct_io = 1; + fi->parallel_direct_writes = 1; + } + fi->fh = res; return 0; } -- cgit v1.2.3