From e45b81bc27cf058b6015472725674e09f2e7c0bc Mon Sep 17 00:00:00 2001 From: MSVSphere Packaging Team Date: Fri, 22 Sep 2023 17:31:30 +0300 Subject: [PATCH] import fuse3-3.10.2-6.el9 --- .fuse3.metadata | 1 + .gitignore | 1 + SOURCES/fuse-3.10.4-fix-test-failure.patch | 36 +++ ...s-in-libfuse-to-handle-flags-beyond-.patch | 197 +++++++++++++ ...ovided-by-Miklos-Szeredi-mszeredi-re.patch | 121 ++++++++ ...and-capability-discovery-enum-for-fl.patch | 128 +++++++++ SOURCES/fuse.conf | 2 + SOURCES/fuse3-gcc11.patch | 12 + ...use-add-feature-flag-for-expire-only.patch | 45 +++ SPECS/fuse3.spec | 268 ++++++++++++++++++ 10 files changed, 811 insertions(+) create mode 100644 .fuse3.metadata create mode 100644 .gitignore create mode 100644 SOURCES/fuse-3.10.4-fix-test-failure.patch create mode 100644 SOURCES/fuse-3.11.0-Modify-structures-in-libfuse-to-handle-flags-beyond-.patch create mode 100644 SOURCES/fuse-3.13.0-Initial-patch-provided-by-Miklos-Szeredi-mszeredi-re.patch create mode 100644 SOURCES/fuse-3.13.0-adding-comments-and-capability-discovery-enum-for-fl.patch create mode 100644 SOURCES/fuse.conf create mode 100644 SOURCES/fuse3-gcc11.patch create mode 100644 SOURCES/rhel-only-bz2188182-libfuse-add-feature-flag-for-expire-only.patch create mode 100644 SPECS/fuse3.spec diff --git a/.fuse3.metadata b/.fuse3.metadata new file mode 100644 index 0000000..02d58ac --- /dev/null +++ b/.fuse3.metadata @@ -0,0 +1 @@ +97e7affc42039ea8a98adc606278fb0593462c7e SOURCES/fuse-3.10.2.tar.gz diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7d4f427 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/fuse-3.10.2.tar.gz diff --git a/SOURCES/fuse-3.10.4-fix-test-failure.patch b/SOURCES/fuse-3.10.4-fix-test-failure.patch new file mode 100644 index 0000000..d70f85d --- /dev/null +++ b/SOURCES/fuse-3.10.4-fix-test-failure.patch @@ -0,0 +1,36 @@ +From 8852a22399b015c784b509308bc9dd25b65a539f Mon Sep 17 00:00:00 2001 +From: Amir Goldstein +Date: Wed, 2 Jun 2021 12:23:06 +0300 +Subject: [PATCH] test/test_syscalls.c: fix test failure on xfs src dir (#611) + +rename dir loop test fails when test tmp dir is xfs with an error + test_rename_dir_loop() - rename : File exists + +That is because xfs returns EEXIST for the case of renaming over +a non-empty directory. + +According to rename(2) man page, EEXIST and ENOTEMPTY are both valid +error code in this case. + +Signed-off-by: Amir Goldstein +Signed-off-by: Pavel Reichl +--- + test/test_syscalls.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/test/test_syscalls.c b/test/test_syscalls.c +index 4fa5c87..cd799ce 100644 +--- a/test/test_syscalls.c ++++ b/test/test_syscalls.c +@@ -1624,7 +1624,7 @@ static int test_rename_dir_loop(void) + + errno = 0; + res = rename(PATH("a/b"), PATH2("a/d")); +- if (res == 0 || errno != ENOTEMPTY) { ++ if (res == 0 || (errno != ENOTEMPTY && errno != EEXIST)) { + PERROR("rename"); + goto fail; + } +-- +2.35.1 + diff --git a/SOURCES/fuse-3.11.0-Modify-structures-in-libfuse-to-handle-flags-beyond-.patch b/SOURCES/fuse-3.11.0-Modify-structures-in-libfuse-to-handle-flags-beyond-.patch new file mode 100644 index 0000000..51bc230 --- /dev/null +++ b/SOURCES/fuse-3.11.0-Modify-structures-in-libfuse-to-handle-flags-beyond-.patch @@ -0,0 +1,197 @@ +From 4df08719f3415cde6f802a755922b7f76e198cd7 Mon Sep 17 00:00:00 2001 +From: Dharmendra Singh +Date: Mon, 28 Feb 2022 11:15:06 +0000 +Subject: [PATCH] Modify structures in libfuse to handle flags beyond 32 bits. + +In fuse kernel, 'commit 53db28933e95 ("fuse: extend init flags")' +made the changes to handle flags going beyond 32 bits but i think +changes were not done in libfuse to handle the same. + +This patch prepares the ground in libfuse for incoming FUSE kernel +patches (Atomic open + lookup) where flags went beyond 32 bits. +It makes struct same as in fuse kernel resulting in name change of +few fields. + +Signed-off-by: Pavel Reichl +--- + include/fuse_kernel.h | 8 +++-- + lib/fuse_lowlevel.c | 81 ++++++++++++++++++++++++------------------- + 2 files changed, 51 insertions(+), 38 deletions(-) + +diff --git a/include/fuse_kernel.h b/include/fuse_kernel.h +index 48f2000..4762c9e 100644 +--- a/include/fuse_kernel.h ++++ b/include/fuse_kernel.h +@@ -303,6 +303,7 @@ struct fuse_file_lock { + #define FUSE_CACHE_SYMLINKS (1 << 23) + #define FUSE_NO_OPENDIR_SUPPORT (1 << 24) + #define FUSE_EXPLICIT_INVAL_DATA (1 << 25) ++#define FUSE_INIT_EXT (1 << 30) + + /** + * CUSE INIT request/reply flags +@@ -639,6 +640,8 @@ struct fuse_init_in { + uint32_t minor; + uint32_t max_readahead; + uint32_t flags; ++ uint32_t flags2; ++ uint32_t unused[11]; + }; + + #define FUSE_COMPAT_INIT_OUT_SIZE 8 +@@ -654,8 +657,9 @@ struct fuse_init_out { + uint32_t max_write; + uint32_t time_gran; + uint16_t max_pages; +- uint16_t padding; +- uint32_t unused[8]; ++ uint16_t map_alignment; ++ uint32_t flags2; ++ uint32_t unused[7]; + }; + + #define CUSE_INIT_INFO_MAX 4096 +diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c +index 3a1e7d8..1d75724 100644 +--- a/lib/fuse_lowlevel.c ++++ b/lib/fuse_lowlevel.c +@@ -1906,7 +1906,8 @@ void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg) + struct fuse_session *se = req->se; + size_t bufsize = se->bufsize; + size_t outargsize = sizeof(outarg); +- ++ uint64_t inargflags = 0; ++ uint64_t outargflags = 0; + (void) nodeid; + if (se->debug) { + fuse_log(FUSE_LOG_DEBUG, "INIT: %u.%u\n", arg->major, arg->minor); +@@ -1941,43 +1942,46 @@ void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg) + if (arg->minor >= 6) { + if (arg->max_readahead < se->conn.max_readahead) + se->conn.max_readahead = arg->max_readahead; +- if (arg->flags & FUSE_ASYNC_READ) ++ inargflags = arg->flags; ++ if (inargflags & FUSE_INIT_EXT) ++ inargflags = inargflags | (uint64_t) arg->flags2 << 32; ++ if (inargflags & FUSE_ASYNC_READ) + se->conn.capable |= FUSE_CAP_ASYNC_READ; +- if (arg->flags & FUSE_POSIX_LOCKS) ++ if (inargflags & FUSE_POSIX_LOCKS) + se->conn.capable |= FUSE_CAP_POSIX_LOCKS; +- if (arg->flags & FUSE_ATOMIC_O_TRUNC) ++ if (inargflags & FUSE_ATOMIC_O_TRUNC) + se->conn.capable |= FUSE_CAP_ATOMIC_O_TRUNC; +- if (arg->flags & FUSE_EXPORT_SUPPORT) ++ if (inargflags & FUSE_EXPORT_SUPPORT) + se->conn.capable |= FUSE_CAP_EXPORT_SUPPORT; +- if (arg->flags & FUSE_DONT_MASK) ++ if (inargflags & FUSE_DONT_MASK) + se->conn.capable |= FUSE_CAP_DONT_MASK; +- if (arg->flags & FUSE_FLOCK_LOCKS) ++ if (inargflags & FUSE_FLOCK_LOCKS) + se->conn.capable |= FUSE_CAP_FLOCK_LOCKS; +- if (arg->flags & FUSE_AUTO_INVAL_DATA) ++ if (inargflags & FUSE_AUTO_INVAL_DATA) + se->conn.capable |= FUSE_CAP_AUTO_INVAL_DATA; +- if (arg->flags & FUSE_DO_READDIRPLUS) ++ if (inargflags & FUSE_DO_READDIRPLUS) + se->conn.capable |= FUSE_CAP_READDIRPLUS; +- if (arg->flags & FUSE_READDIRPLUS_AUTO) ++ if (inargflags & FUSE_READDIRPLUS_AUTO) + se->conn.capable |= FUSE_CAP_READDIRPLUS_AUTO; +- if (arg->flags & FUSE_ASYNC_DIO) ++ if (inargflags & FUSE_ASYNC_DIO) + se->conn.capable |= FUSE_CAP_ASYNC_DIO; +- if (arg->flags & FUSE_WRITEBACK_CACHE) ++ if (inargflags & FUSE_WRITEBACK_CACHE) + se->conn.capable |= FUSE_CAP_WRITEBACK_CACHE; +- if (arg->flags & FUSE_NO_OPEN_SUPPORT) ++ if (inargflags & FUSE_NO_OPEN_SUPPORT) + se->conn.capable |= FUSE_CAP_NO_OPEN_SUPPORT; +- if (arg->flags & FUSE_PARALLEL_DIROPS) ++ if (inargflags & FUSE_PARALLEL_DIROPS) + se->conn.capable |= FUSE_CAP_PARALLEL_DIROPS; +- if (arg->flags & FUSE_POSIX_ACL) ++ if (inargflags & FUSE_POSIX_ACL) + se->conn.capable |= FUSE_CAP_POSIX_ACL; +- if (arg->flags & FUSE_HANDLE_KILLPRIV) ++ if (inargflags & FUSE_HANDLE_KILLPRIV) + se->conn.capable |= FUSE_CAP_HANDLE_KILLPRIV; +- if (arg->flags & FUSE_CACHE_SYMLINKS) ++ if (inargflags & FUSE_CACHE_SYMLINKS) + se->conn.capable |= FUSE_CAP_CACHE_SYMLINKS; +- if (arg->flags & FUSE_NO_OPENDIR_SUPPORT) ++ if (inargflags & FUSE_NO_OPENDIR_SUPPORT) + se->conn.capable |= FUSE_CAP_NO_OPENDIR_SUPPORT; +- if (arg->flags & FUSE_EXPLICIT_INVAL_DATA) ++ if (inargflags & FUSE_EXPLICIT_INVAL_DATA) + se->conn.capable |= FUSE_CAP_EXPLICIT_INVAL_DATA; +- if (!(arg->flags & FUSE_MAX_PAGES)) { ++ if (!(inargflags & FUSE_MAX_PAGES)) { + size_t max_bufsize = + FUSE_DEFAULT_MAX_PAGES_PER_REQ * getpagesize() + + FUSE_BUFFER_HEADER_SIZE; +@@ -2068,39 +2072,44 @@ void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg) + outarg.flags |= FUSE_MAX_PAGES; + outarg.max_pages = (se->conn.max_write - 1) / getpagesize() + 1; + } +- ++ outargflags = outarg.flags; + /* Always enable big writes, this is superseded + by the max_write option */ +- outarg.flags |= FUSE_BIG_WRITES; ++ outargflags |= FUSE_BIG_WRITES; + + if (se->conn.want & FUSE_CAP_ASYNC_READ) +- outarg.flags |= FUSE_ASYNC_READ; ++ outargflags |= FUSE_ASYNC_READ; + if (se->conn.want & FUSE_CAP_POSIX_LOCKS) +- outarg.flags |= FUSE_POSIX_LOCKS; ++ outargflags |= FUSE_POSIX_LOCKS; + if (se->conn.want & FUSE_CAP_ATOMIC_O_TRUNC) +- outarg.flags |= FUSE_ATOMIC_O_TRUNC; ++ outargflags |= FUSE_ATOMIC_O_TRUNC; + if (se->conn.want & FUSE_CAP_EXPORT_SUPPORT) +- outarg.flags |= FUSE_EXPORT_SUPPORT; ++ outargflags |= FUSE_EXPORT_SUPPORT; + if (se->conn.want & FUSE_CAP_DONT_MASK) +- outarg.flags |= FUSE_DONT_MASK; ++ outargflags |= FUSE_DONT_MASK; + if (se->conn.want & FUSE_CAP_FLOCK_LOCKS) +- outarg.flags |= FUSE_FLOCK_LOCKS; ++ outargflags |= FUSE_FLOCK_LOCKS; + if (se->conn.want & FUSE_CAP_AUTO_INVAL_DATA) +- outarg.flags |= FUSE_AUTO_INVAL_DATA; ++ outargflags |= FUSE_AUTO_INVAL_DATA; + if (se->conn.want & FUSE_CAP_READDIRPLUS) +- outarg.flags |= FUSE_DO_READDIRPLUS; ++ outargflags |= FUSE_DO_READDIRPLUS; + if (se->conn.want & FUSE_CAP_READDIRPLUS_AUTO) +- outarg.flags |= FUSE_READDIRPLUS_AUTO; ++ outargflags |= FUSE_READDIRPLUS_AUTO; + if (se->conn.want & FUSE_CAP_ASYNC_DIO) +- outarg.flags |= FUSE_ASYNC_DIO; ++ outargflags |= FUSE_ASYNC_DIO; + if (se->conn.want & FUSE_CAP_WRITEBACK_CACHE) +- outarg.flags |= FUSE_WRITEBACK_CACHE; ++ outargflags |= FUSE_WRITEBACK_CACHE; + if (se->conn.want & FUSE_CAP_POSIX_ACL) +- outarg.flags |= FUSE_POSIX_ACL; ++ outargflags |= FUSE_POSIX_ACL; + if (se->conn.want & FUSE_CAP_CACHE_SYMLINKS) +- outarg.flags |= FUSE_CACHE_SYMLINKS; ++ outargflags |= FUSE_CACHE_SYMLINKS; + if (se->conn.want & FUSE_CAP_EXPLICIT_INVAL_DATA) +- outarg.flags |= FUSE_EXPLICIT_INVAL_DATA; ++ outargflags |= FUSE_EXPLICIT_INVAL_DATA; ++ ++ outarg.flags = outargflags; ++ ++ if (inargflags & FUSE_INIT_EXT) ++ outarg.flags2 = outargflags >> 32; + outarg.max_readahead = se->conn.max_readahead; + outarg.max_write = se->conn.max_write; + if (se->conn.proto_minor >= 13) { +-- +2.41.0 + diff --git a/SOURCES/fuse-3.13.0-Initial-patch-provided-by-Miklos-Szeredi-mszeredi-re.patch b/SOURCES/fuse-3.13.0-Initial-patch-provided-by-Miklos-Szeredi-mszeredi-re.patch new file mode 100644 index 0000000..403ef38 --- /dev/null +++ b/SOURCES/fuse-3.13.0-Initial-patch-provided-by-Miklos-Szeredi-mszeredi-re.patch @@ -0,0 +1,121 @@ +From 8fd95ab0a62a753896fdd3b5fcb68603f0e41ad3 Mon Sep 17 00:00:00 2001 +From: HereThereBeDragons +Date: Thu, 27 Oct 2022 17:52:10 +0200 +Subject: [PATCH] Initial patch provided by Miklos Szeredi + + +Signed-off-by: Pavel Reichl +--- + include/fuse_kernel.h | 8 +++++++- + include/fuse_lowlevel.h | 8 ++++++++ + lib/fuse_lowlevel.c | 18 ++++++++++++++---- + lib/fuse_versionscript | 1 + + 4 files changed, 30 insertions(+), 5 deletions(-) + +diff --git a/include/fuse_kernel.h b/include/fuse_kernel.h +index 09da620..e0666a1 100644 +--- a/include/fuse_kernel.h ++++ b/include/fuse_kernel.h +@@ -387,6 +387,12 @@ struct fuse_file_lock { + */ + #define FUSE_FSYNC_FDATASYNC (1 << 0) + ++/** ++ * notify_inval_entry flags ++ * FUSE_EXPIRE_ONLY ++ */ ++#define FUSE_EXPIRE_ONLY (1 << 0) ++ + enum fuse_opcode { + FUSE_LOOKUP = 1, + FUSE_FORGET = 2, /* no reply */ +@@ -800,7 +806,7 @@ struct fuse_notify_inval_inode_out { + struct fuse_notify_inval_entry_out { + uint64_t parent; + uint32_t namelen; +- uint32_t padding; ++ uint32_t flags; + }; + + struct fuse_notify_delete_out { +diff --git a/include/fuse_lowlevel.h b/include/fuse_lowlevel.h +index b76be71..cceb9be 100644 +--- a/include/fuse_lowlevel.h ++++ b/include/fuse_lowlevel.h +@@ -1675,6 +1675,14 @@ int fuse_lowlevel_notify_inval_inode(struct fuse_session *se, fuse_ino_t ino, + int fuse_lowlevel_notify_inval_entry(struct fuse_session *se, fuse_ino_t parent, + const char *name, size_t namelen); + ++enum fuse_expire_flags { ++ FUSE_LL_EXPIRE_ONLY = (1 << 0), ++}; ++ ++int fuse_lowlevel_notify_expire_entry(struct fuse_session *se, fuse_ino_t parent, ++ const char *name, size_t namelen, ++ enum fuse_expire_flags flags); ++ + /** + * This function behaves like fuse_lowlevel_notify_inval_entry() with + * the following additional effect (at least as of Linux kernel 4.8): +diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c +index e82cd9e..7b9d710 100644 +--- a/lib/fuse_lowlevel.c ++++ b/lib/fuse_lowlevel.c +@@ -2268,21 +2268,24 @@ int fuse_lowlevel_notify_inval_inode(struct fuse_session *se, fuse_ino_t ino, + return send_notify_iov(se, FUSE_NOTIFY_INVAL_INODE, iov, 2); + } + +-int fuse_lowlevel_notify_inval_entry(struct fuse_session *se, fuse_ino_t parent, +- const char *name, size_t namelen) ++int fuse_lowlevel_notify_expire_entry(struct fuse_session *se, fuse_ino_t parent, ++ const char *name, size_t namelen, ++ enum fuse_expire_flags flags) + { + struct fuse_notify_inval_entry_out outarg; + struct iovec iov[3]; + + if (!se) + return -EINVAL; +- ++ + if (se->conn.proto_minor < 12) + return -ENOSYS; + + outarg.parent = parent; + outarg.namelen = namelen; +- outarg.padding = 0; ++ outarg.flags = 0; ++ if (flags & FUSE_LL_EXPIRE_ONLY) ++ outarg.flags |= FUSE_EXPIRE_ONLY; + + iov[1].iov_base = &outarg; + iov[1].iov_len = sizeof(outarg); +@@ -2292,6 +2295,13 @@ int fuse_lowlevel_notify_inval_entry(struct fuse_session *se, fuse_ino_t parent, + return send_notify_iov(se, FUSE_NOTIFY_INVAL_ENTRY, iov, 3); + } + ++int fuse_lowlevel_notify_inval_entry(struct fuse_session *se, fuse_ino_t parent, ++ const char *name, size_t namelen) ++{ ++ return fuse_lowlevel_notify_expire_entry(se, parent, name, namelen, 0); ++} ++ ++ + int fuse_lowlevel_notify_delete(struct fuse_session *se, + fuse_ino_t parent, fuse_ino_t child, + const char *name, size_t namelen) +diff --git a/lib/fuse_versionscript b/lib/fuse_versionscript +index a1e9ed8..114f592 100644 +--- a/lib/fuse_versionscript ++++ b/lib/fuse_versionscript +@@ -166,6 +166,7 @@ + global: + fuse_set_log_func; + fuse_log; ++ fuse_lowlevel_notify_expire_entry; + } FUSE_3.4; + + # Local Variables: +-- +2.41.0 + diff --git a/SOURCES/fuse-3.13.0-adding-comments-and-capability-discovery-enum-for-fl.patch b/SOURCES/fuse-3.13.0-adding-comments-and-capability-discovery-enum-for-fl.patch new file mode 100644 index 0000000..3f253bf --- /dev/null +++ b/SOURCES/fuse-3.13.0-adding-comments-and-capability-discovery-enum-for-fl.patch @@ -0,0 +1,128 @@ +From 91083df90eadc0e69e4ce6956f823a2acb602f25 Mon Sep 17 00:00:00 2001 +From: HereThereBeDragons +Date: Thu, 27 Oct 2022 17:52:10 +0200 +Subject: [PATCH] adding comments and capability discovery, enum for flags + moved to top of file + +Signed-off-by: Pavel Reichl +--- + example/printcap.c | 2 ++ + include/fuse_common.h | 16 ++++++++++++++++ + include/fuse_lowlevel.h | 40 ++++++++++++++++++++++++++++++++++++---- + lib/fuse_lowlevel.c | 2 ++ + 4 files changed, 56 insertions(+), 4 deletions(-) + +diff --git a/example/printcap.c b/example/printcap.c +index edfd8f5..4867988 100644 +--- a/example/printcap.c ++++ b/example/printcap.c +@@ -81,6 +81,8 @@ static void pc_init(void *userdata, + printf("\tFUSE_CAP_NO_OPENDIR_SUPPORT\n"); + if(conn->capable & FUSE_CAP_EXPLICIT_INVAL_DATA) + printf("\tFUSE_CAP_EXPLICIT_INVAL_DATA\n"); ++ if(conn->capable & FUSE_CAP_EXPIRE_ONLY) ++ printf("\tFUSE_CAP_EXPIRE_ONLY\n"); + fuse_session_exit(se); + } + +diff --git a/include/fuse_common.h b/include/fuse_common.h +index e9d8745..dbba05a 100644 +--- a/include/fuse_common.h ++++ b/include/fuse_common.h +@@ -408,6 +408,22 @@ struct fuse_loop_config_v1 { + */ + #define FUSE_CAP_EXPLICIT_INVAL_DATA (1 << 25) + ++/** ++ * Indicates support that dentries can be expired or invalidated. ++ * ++ * Expiring dentries, instead of invalidating them, makes a difference for ++ * overmounted dentries, where plain invalidation would detach all submounts ++ * before dropping the dentry from the cache. If only expiry is set on the ++ * dentry, then any overmounts are left alone and until ->d_revalidate() ++ * is called. ++ * ++ * Note: ->d_revalidate() is not called for the case of following a submount, ++ * so invalidation will only be triggered for the non-overmounted case. ++ * The dentry could also be mounted in a different mount instance, in which case ++ * any submounts will still be detached. ++*/ ++#define FUSE_CAP_EXPIRE_ONLY (1 << 26) ++ + /** + * Ioctl flags + * +diff --git a/include/fuse_lowlevel.h b/include/fuse_lowlevel.h +index cceb9be..6bad70e 100644 +--- a/include/fuse_lowlevel.h ++++ b/include/fuse_lowlevel.h +@@ -127,6 +127,15 @@ struct fuse_forget_data { + uint64_t nlookup; + }; + ++/** ++ * Flags for fuse_lowlevel_notify_expire_entry() ++ * 0 = invalidate entry ++ * FUSE_LL_EXPIRE_ONLY = expire entry ++*/ ++enum fuse_expire_flags { ++ FUSE_LL_EXPIRE_ONLY = (1 << 0), ++}; ++ + /* 'to_set' flags in setattr */ + #define FUSE_SET_ATTR_MODE (1 << 0) + #define FUSE_SET_ATTR_UID (1 << 1) +@@ -1675,10 +1684,33 @@ int fuse_lowlevel_notify_inval_inode(struct fuse_session *se, fuse_ino_t ino, + int fuse_lowlevel_notify_inval_entry(struct fuse_session *se, fuse_ino_t parent, + const char *name, size_t namelen); + +-enum fuse_expire_flags { +- FUSE_LL_EXPIRE_ONLY = (1 << 0), +-}; +- ++/** ++ * Notify to expire or invalidate parent attributes and the dentry ++ * matching parent/name ++ * ++ * Underlying function for fuse_lowlevel_notify_inval_entry(). ++ * ++ * In addition to invalidating an entry, it also allows to expire an entry. ++ * In that case, the entry is not forcefully removed from kernel cache ++ * but instead the next access to it forces a lookup from the filesystem. ++ * ++ * This makes a difference for overmounted dentries, where plain invalidation ++ * would detach all submounts before dropping the dentry from the cache. ++ * If only expiry is set on the dentry, then any overmounts are left alone and ++ * until ->d_revalidate() is called. ++ * ++ * Note: ->d_revalidate() is not called for the case of following a submount, ++ * so invalidation will only be triggered for the non-overmounted case. ++ * The dentry could also be mounted in a different mount instance, in which case ++ * any submounts will still be detached. ++ * ++ * @param se the session object ++ * @param parent inode number ++ * @param name file name ++ * @param namelen strlen() of file name ++ * @param flags flags to control if the entry should be expired or invalidated ++ * @return zero for success, -errno for failure ++*/ + int fuse_lowlevel_notify_expire_entry(struct fuse_session *se, fuse_ino_t parent, + const char *name, size_t namelen, + enum fuse_expire_flags flags); +diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c +index 7b9d710..7d76309 100644 +--- a/lib/fuse_lowlevel.c ++++ b/lib/fuse_lowlevel.c +@@ -1991,6 +1991,8 @@ void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg) + bufsize = max_bufsize; + } + } ++ if (arg->minor >= 38) ++ se->conn.capable |= FUSE_CAP_EXPIRE_ONLY; + } else { + se->conn.max_readahead = 0; + } +-- +2.41.0 + diff --git a/SOURCES/fuse.conf b/SOURCES/fuse.conf new file mode 100644 index 0000000..cd4c6bd --- /dev/null +++ b/SOURCES/fuse.conf @@ -0,0 +1,2 @@ +# mount_max = 1000 +# user_allow_other diff --git a/SOURCES/fuse3-gcc11.patch b/SOURCES/fuse3-gcc11.patch new file mode 100644 index 0000000..ec03bc7 --- /dev/null +++ b/SOURCES/fuse3-gcc11.patch @@ -0,0 +1,12 @@ +diff --git a/example/cxxopts.hpp b/example/cxxopts.hpp +index 6fd170d..6906e3b 100644 +--- a/example/cxxopts.hpp ++++ b/example/cxxopts.hpp +@@ -37,6 +37,7 @@ THE SOFTWARE. + #include + #include + #include ++#include + + #ifdef __cpp_lib_optional + #include diff --git a/SOURCES/rhel-only-bz2188182-libfuse-add-feature-flag-for-expire-only.patch b/SOURCES/rhel-only-bz2188182-libfuse-add-feature-flag-for-expire-only.patch new file mode 100644 index 0000000..d40cfd0 --- /dev/null +++ b/SOURCES/rhel-only-bz2188182-libfuse-add-feature-flag-for-expire-only.patch @@ -0,0 +1,45 @@ +From: Miklos Szeredi +Subject: libfuse: add feature flag for expire-only + +Add the FUSE_HAS_EXPIRE_ONLY flag. This should be used to set the +FUSE_CAP_EXPIRE_ONLY capability flag on the low level API instead of +checking for the version. + +Checking the version doesn't work if the feature is backported to an +earlier kernel. + +Signed-off-by: Miklos Szeredi +--- + include/fuse_kernel.h | 2 ++ + lib/fuse_lowlevel.c | 2 +- + 2 files changed, 3 insertions(+), 1 deletion(-) + +--- a/include/fuse_kernel.h ++++ b/include/fuse_kernel.h +@@ -274,6 +274,7 @@ + * FUSE_CACHE_SYMLINKS: cache READLINK responses + * FUSE_NO_OPENDIR_SUPPORT: kernel supports zero-message opendir + * FUSE_EXPLICIT_INVAL_DATA: only invalidate cached pages on explicit request ++ * FUSE_HAS_EXPIRE_ONLY: kernel supports expiry-only entry invalidation + */ + #define FUSE_ASYNC_READ (1 << 0) + #define FUSE_POSIX_LOCKS (1 << 1) +@@ -302,6 +303,7 @@ + #define FUSE_NO_OPENDIR_SUPPORT (1 << 24) + #define FUSE_EXPLICIT_INVAL_DATA (1 << 25) + #define FUSE_INIT_EXT (1 << 30) ++#define FUSE_HAS_EXPIRE_ONLY (1ULL << 35) + + /** + * CUSE INIT request/reply flags +--- a/lib/fuse_lowlevel.c ++++ b/lib/fuse_lowlevel.c +@@ -2008,7 +2008,7 @@ void do_init(fuse_req_t req, fuse_ino_t + bufsize = max_bufsize; + } + } +- if (arg->minor >= 38) ++ if (inargflags & FUSE_HAS_EXPIRE_ONLY) + se->conn.capable |= FUSE_CAP_EXPIRE_ONLY; + } else { + se->conn.max_readahead = 0; diff --git a/SPECS/fuse3.spec b/SPECS/fuse3.spec new file mode 100644 index 0000000..410f19f --- /dev/null +++ b/SPECS/fuse3.spec @@ -0,0 +1,268 @@ +Name: fuse3 +Version: 3.10.2 +Release: 6%{?dist} +Summary: File System in Userspace (FUSE) v3 utilities +License: GPL+ +URL: http://fuse.sf.net +Source0: https://github.com/libfuse/libfuse/archive/fuse-%{version}.tar.gz +Source1: fuse.conf +Patch0: fuse3-gcc11.patch +Patch1: fuse-3.10.4-fix-test-failure.patch +Patch2: fuse-3.11.0-Modify-structures-in-libfuse-to-handle-flags-beyond-.patch +Patch3: fuse-3.13.0-Initial-patch-provided-by-Miklos-Szeredi-mszeredi-re.patch +Patch4: fuse-3.13.0-adding-comments-and-capability-discovery-enum-for-fl.patch +Patch5: rhel-only-bz2188182-libfuse-add-feature-flag-for-expire-only.patch + +BuildRequires: which +%if ! 0%{?el6} +Conflicts: filesystem < 3 +%endif +BuildRequires: libselinux-devel +BuildRequires: meson, ninja-build, gcc, gcc-c++ +%if ! 0%{?el6} && ! 0%{?el7} +BuildRequires: systemd-udev +%endif +%if 0%{?el6} +BuildRequires: udev, kernel-devel +%else +Requires: %{_sysconfdir}/fuse.conf +%endif + +Requires: %{name}-libs = %{version}-%{release} +# fuse-common 3.4.2-3 had the fuse & fuse3 man pages in it +Conflicts: fuse-common < 3.4.2-4 + +%description +With FUSE it is possible to implement a fully functional filesystem in a +userspace program. This package contains the FUSE v3 userspace tools to +mount a FUSE filesystem. + +%package libs +Summary: File System in Userspace (FUSE) v3 libraries +License: LGPLv2+ +%if ! 0%{?el6} +Conflicts: filesystem < 3 +%endif + +%description libs +Devel With FUSE it is possible to implement a fully functional filesystem in a +userspace program. This package contains the FUSE v3 libraries. + +%package devel +Summary: File System in Userspace (FUSE) v3 devel files +Requires: %{name}-libs = %{version}-%{release} +Requires: pkgconfig +License: LGPLv2+ +%if ! 0%{?el6} +Conflicts: filesystem < 3 +%endif + +%description devel +With FUSE it is possible to implement a fully functional filesystem in a +userspace program. This package contains development files (headers, +pgk-config) to develop FUSE v3 based applications/filesystems. + +%if ! 0%{?el6} && ! 0%{?el7} +%package -n fuse-common +Summary: Common files for File System in Userspace (FUSE) v2 and v3 +License: GPL+ + +%description -n fuse-common +Common files for FUSE v2 and FUSE v3. +%endif + +%prep +%setup -n libfuse-fuse-%{version} +%patch0 -p1 +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 + +%build +export LC_ALL=en_US.UTF-8 +%if ! 0%{?_vpath_srcdir:1} +%global _vpath_srcdir . +%endif +%if ! 0%{?_vpath_builddir:1} +%global _vpath_builddir build +%endif +%if 0%{?el6} +%if ! 0%{?__global_ldflags:1} +%global __global_ldflags "" +%endif +%meson -D udevrulesdir=/etc/udev/rules.d +%else +%meson +%endif + +(cd %{_vpath_builddir} +%if 0%{?el6} +meson configure -D c_args=-I"`ls -d /usr/src/kernels/*/include|head -1`" +%endif +%if 0%{?el6} || 0%{?el7} +meson configure -D examples=false +%endif +# don't have root for installation +meson configure -D useroot=false +ninja-build reconfigure +) +%meson_build + +%install +export MESON_INSTALL_DESTDIR_PREFIX=%{buildroot}/usr %meson_install +find %{buildroot} . +find %{buildroot} -type f -name "*.la" -exec rm -f {} ';' +# change from 4755 to 0755 to allow stripping -- fixed later in files +chmod 0755 %{buildroot}/%{_bindir}/fusermount3 + +# Get rid of static libs +rm -f %{buildroot}/%{_libdir}/*.a +# No need to create init-script +rm -f %{buildroot}%{_sysconfdir}/init.d/fuse3 + +%if 0%{?el6} || 0%{?el7} +# This is in the fuse package on el7 and there's no default on el6 +rm -f %{buildroot}%{_sysconfdir}/fuse.conf +%else +# Install config-file +install -p -m 0644 %{SOURCE1} %{buildroot}%{_sysconfdir} +%endif + +# Delete pointless udev rules, which do not belong in /usr/lib (brc#748204) +rm -f %{buildroot}/usr/lib/udev/rules.d/99-fuse3.rules + +%if 0%{?el6} || 0%{?el7} +%post -p /sbin/ldconfig libs +%postun -p /sbin/ldconfig libs +%else +%ldconfig_scriptlets libs +%endif + +%{!?_licensedir:%global license %%doc} + +%files +%license LICENSE GPL2.txt +%doc AUTHORS ChangeLog.rst README.md +%{_sbindir}/mount.fuse3 +%attr(4755,root,root) %{_bindir}/fusermount3 +%{_mandir}/man1/* +%{_mandir}/man8/* +%if 0%{?el6} +%{_sysconfdir}/udev/rules.d/* +%endif + +%files libs +%license LGPL2.txt +%{_libdir}/libfuse3.so.* + +%files devel +%{_libdir}/libfuse3.so +%{_libdir}/pkgconfig/fuse3.pc +%{_includedir}/fuse3/ + +%if ! 0%{?el6} && ! 0%{?el7} +%files -n fuse-common +%config(noreplace) %{_sysconfdir}/fuse.conf +%endif + +%changelog +* Fri Sep 22 2023 MSVSphere Packaging Team - 3.10.2-6 +- Rebuilt for MSVSphere 9.3 beta + +* Thu Jul 13 2023 Pavel Reichl - 3.10.2-6 +- Fix feature_notify_inode_expire_only related(rhbz#2188182) + +* Wed Feb 16 2022 Pavel Reichl - 3.10.2-5 +- Fix test failure +- Fix missing dependency + +* Tue Feb 15 2022 Pavel Reichl - 3.10.2-4 +- Add gating.yaml file + +* Mon Aug 09 2021 Mohan Boddu - 3.10.2-3 +- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags + Related: rhbz#1991688 + +* Thu Apr 15 2021 Mohan Boddu - 3.10.2-2 +- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937 + +* Fri Feb 5 2021 Tom Callaway - 3.10.2-1 +- update to 3.10.2 + +* Tue Jan 26 2021 Fedora Release Engineering - 3.10.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Mon Dec 7 2020 Tom Callaway - 3.10.1-1 +- update to 3.10.1 + +* Wed Oct 14 2020 Jeff Law - 3.10.0-2 +- Add missing #include for gcc-11 + +* Mon Oct 12 2020 Tom Callaway - 3.10.0-1 +- update to 3.10.0 +- enable lto + +* Mon Aug 10 2020 Tom Callaway - 3.9.4-1 +- update to 3.9.4 + +* Mon Jul 27 2020 Fedora Release Engineering - 3.9.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Wed Jul 1 2020 Jeff Law - 3.9.2-2 +- Disable LTO + +* Thu Jun 18 2020 Tom Callaway - 3.9.2-1 +- update to 3.9.2 + +* Thu Mar 19 2020 Tom Callaway - 3.9.1-1 +- update to 3.9.1 + +* Tue Jan 28 2020 Fedora Release Engineering - 3.9.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Mon Dec 16 2019 Tom Callaway - 3.9.0-1 +- update to 3.9.0 + +* Mon Nov 4 2019 Tom Callaway - 3.8.0-1 +- update to 3.8.0 + +* Fri Sep 27 2019 Tom Callaway - 3.7.0-1 +- update to 3.7.0 + +* Sun Sep 1 2019 Peter Lemenkov - 3.6.2-1 +- Update to 3.6.2 + +* Thu Jul 25 2019 Fedora Release Engineering - 3.6.1-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Wed Jul 03 2019 Dave Dykstra - 3.6.1-3 +- Update to the final version of pr #421 + +* Wed Jul 03 2019 Dave Dykstra - 3.6.1-2 +- Update to newer version of pr #421 +- Disable building examples on el7 + +* Thu Jun 13 2019 Tom Callaway - 3.6.1-1 +- Update to 3.6.1 + +* Fri May 24 2019 Dave Dykstra - 3.5.0-1 +- Upgrade to upstream 3.5.0 + +* Sat May 04 2019 Dave Dykstra - 3.4.2-7 +- Fix building on el6 + +* Wed May 01 2019 Dave Dykstra - 3.4.2-6 +- Need Conflicts: fuse-common < 3.4.2-4, because <= 3.4.2-3 isn't quite + enough. + +* Wed May 01 2019 Dave Dykstra - 3.4.2-5 +- Update the Conflicts: fuse-common <= version to 3.4.2-3 + +* Wed May 01 2019 Dave Dykstra - 3.4.2-4 +- Bump release number in order to larger than a rebuild of fuse package + done before separation pull request was merged. + +* Mon Apr 08 2019 Dave Dykstra - 3.4.2-3 +- Separate out from fuse package