Compare commits
No commits in common. 'i8c' and 'c9' have entirely different histories.
@ -1,2 +1 @@
|
||||
fcb3641d5297938f4e183296eccaf0ccc1a0f892 SOURCES/fuse-2.9.7.tar.gz
|
||||
413a2dcb4d274483893166c7894e1920ee61ab53 SOURCES/fuse-3.3.0.tar.gz
|
||||
943ba651b14bc4a3c6fd959ed4b8c04f4a59032d SOURCES/fuse-2.9.9.tar.gz
|
||||
|
@ -1,2 +1 @@
|
||||
SOURCES/fuse-2.9.7.tar.gz
|
||||
SOURCES/fuse-3.3.0.tar.gz
|
||||
SOURCES/fuse-2.9.9.tar.gz
|
||||
|
@ -1,59 +0,0 @@
|
||||
From 492d3a24c13babd103fb71d44adfb8e94687db52 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Reichl <preichl@redhat.com>
|
||||
Date: Tue, 7 Jun 2022 08:27:36 +0200
|
||||
Subject: [PATCH 1/4] Synchronize fuse_kernel.h
|
||||
|
||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
||||
---
|
||||
include/fuse_kernel.h | 10 +++++++++-
|
||||
1 file changed, 9 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/include/fuse_kernel.h b/include/fuse_kernel.h
|
||||
index 42fa977..b55fa8b 100644
|
||||
--- a/include/fuse_kernel.h
|
||||
+++ b/include/fuse_kernel.h
|
||||
@@ -215,10 +215,12 @@ struct fuse_file_lock {
|
||||
* FOPEN_DIRECT_IO: bypass page cache for this open file
|
||||
* FOPEN_KEEP_CACHE: don't invalidate the data cache on open
|
||||
* FOPEN_NONSEEKABLE: the file is not seekable
|
||||
+ * FOPEN_CACHE_DIR: allow caching this directory
|
||||
*/
|
||||
#define FOPEN_DIRECT_IO (1 << 0)
|
||||
#define FOPEN_KEEP_CACHE (1 << 1)
|
||||
#define FOPEN_NONSEEKABLE (1 << 2)
|
||||
+#define FOPEN_CACHE_DIR (1 << 3)
|
||||
|
||||
/**
|
||||
* INIT request/reply flags
|
||||
@@ -244,6 +246,8 @@ struct fuse_file_lock {
|
||||
* FUSE_PARALLEL_DIROPS: allow parallel lookups and readdir
|
||||
* FUSE_HANDLE_KILLPRIV: fs handles killing suid/sgid/cap on write/chown/trunc
|
||||
* FUSE_POSIX_ACL: filesystem supports posix acls
|
||||
+ * FUSE_MAX_PAGES: init_out.max_pages contains the max number of req pages
|
||||
+ * FUSE_CACHE_SYMLINKS: cache READLINK responses
|
||||
*/
|
||||
#define FUSE_ASYNC_READ (1 << 0)
|
||||
#define FUSE_POSIX_LOCKS (1 << 1)
|
||||
@@ -266,6 +270,8 @@ struct fuse_file_lock {
|
||||
#define FUSE_PARALLEL_DIROPS (1 << 18)
|
||||
#define FUSE_HANDLE_KILLPRIV (1 << 19)
|
||||
#define FUSE_POSIX_ACL (1 << 20)
|
||||
+#define FUSE_MAX_PAGES (1 << 22)
|
||||
+#define FUSE_CACHE_SYMLINKS (1 << 23)
|
||||
|
||||
/**
|
||||
* CUSE INIT request/reply flags
|
||||
@@ -604,7 +610,9 @@ struct fuse_init_out {
|
||||
uint16_t congestion_threshold;
|
||||
uint32_t max_write;
|
||||
uint32_t time_gran;
|
||||
- uint32_t unused[9];
|
||||
+ uint16_t max_pages;
|
||||
+ uint16_t padding;
|
||||
+ uint32_t unused[8];
|
||||
};
|
||||
|
||||
#define CUSE_INIT_INFO_MAX 4096
|
||||
--
|
||||
2.36.1
|
||||
|
@ -1,130 +0,0 @@
|
||||
From 5100bdc814435a1222fef6438cebcd81a3de6c73 Mon Sep 17 00:00:00 2001
|
||||
From: scosu <mpargmann@allfex.org>
|
||||
Date: Thu, 13 Jun 2019 13:59:10 +0200
|
||||
Subject: [PATCH 2/4] fuse_lowlevel: Add max_pages support (#384)
|
||||
|
||||
Starting with kernel version 4.20 fuse supports a new property
|
||||
'max_pages' which is the maximum number of pages that can be used per
|
||||
request. This can be set via an argument during initialization.
|
||||
This new property allows writes to be larger than 128k.
|
||||
|
||||
This patch sets the property if the matching capability is set
|
||||
(FUSE_MAX_PAGES). It will also set max_write to 1MiB. Filesystems have
|
||||
the possibility to decrease this size by setting max_write to a smaller
|
||||
size. The max_pages and bufsize fields are adjusted accordingly.
|
||||
|
||||
Cc: Constantine Shulyupin <const@MakeLinux.com>
|
||||
Signed-off-by: Markus Pargmann <scosu@quobyte.com>
|
||||
(cherry picked from commit 027d0d17c8a4605109f09d9c988e255b64a2c19a)
|
||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
||||
---
|
||||
ChangeLog.rst | 7 +++++++
|
||||
lib/fuse_i.h | 6 ++++++
|
||||
lib/fuse_lowlevel.c | 30 +++++++++++++++++++++---------
|
||||
3 files changed, 34 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/ChangeLog.rst b/ChangeLog.rst
|
||||
index 8ea9397..411cd4a 100644
|
||||
--- a/ChangeLog.rst
|
||||
+++ b/ChangeLog.rst
|
||||
@@ -1,6 +1,13 @@
|
||||
libfuse 3.3.0 (2018-11-06)
|
||||
==========================
|
||||
|
||||
+* Added support for fuse kernel feature `max_pages` which allows to increase
|
||||
+ the maximum number of pages that can be used per request. This feature was
|
||||
+ introduced in kernel 4.20. `max_pages` is set based on the value in
|
||||
+ `max_write`. By default `max_write` will be 1MiB now for kernels that support
|
||||
+ `max_pages`. If you want smaller buffers or writes you have to set
|
||||
+ `max_write` manually.
|
||||
+
|
||||
* The `auto_unmount` mode now works correctly in combination with
|
||||
autofs.
|
||||
|
||||
diff --git a/lib/fuse_i.h b/lib/fuse_i.h
|
||||
index cf35551..d38b630 100644
|
||||
--- a/lib/fuse_i.h
|
||||
+++ b/lib/fuse_i.h
|
||||
@@ -131,3 +131,9 @@ struct fuse *fuse_new_31(struct fuse_args *args, const struct fuse_operations *o
|
||||
int fuse_loop_mt_32(struct fuse *f, struct fuse_loop_config *config);
|
||||
int fuse_session_loop_mt_32(struct fuse_session *se, struct fuse_loop_config *config);
|
||||
|
||||
+#define FUSE_MAX_MAX_PAGES 256
|
||||
+#define FUSE_DEFAULT_MAX_PAGES_PER_REQ 32
|
||||
+
|
||||
+/* room needed in buffer to accommodate header */
|
||||
+#define FUSE_BUFFER_HEADER_SIZE 0x1000
|
||||
+
|
||||
diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
|
||||
index 844e797..60195e0 100644
|
||||
--- a/lib/fuse_lowlevel.c
|
||||
+++ b/lib/fuse_lowlevel.c
|
||||
@@ -1882,6 +1882,14 @@ static void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
|
||||
se->conn.capable |= FUSE_CAP_POSIX_ACL;
|
||||
if (arg->flags & FUSE_HANDLE_KILLPRIV)
|
||||
se->conn.capable |= FUSE_CAP_HANDLE_KILLPRIV;
|
||||
+ if (!(arg->flags & FUSE_MAX_PAGES)) {
|
||||
+ size_t max_bufsize =
|
||||
+ FUSE_DEFAULT_MAX_PAGES_PER_REQ * getpagesize()
|
||||
+ + FUSE_BUFFER_HEADER_SIZE;
|
||||
+ if (bufsize > max_bufsize) {
|
||||
+ bufsize = max_bufsize;
|
||||
+ }
|
||||
+ }
|
||||
} else {
|
||||
se->conn.max_readahead = 0;
|
||||
}
|
||||
@@ -1928,10 +1936,10 @@ static void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
|
||||
bufsize);
|
||||
bufsize = FUSE_MIN_READ_BUFFER;
|
||||
}
|
||||
+ se->bufsize = bufsize;
|
||||
|
||||
- bufsize -= 4096;
|
||||
- if (bufsize < se->conn.max_write)
|
||||
- se->conn.max_write = bufsize;
|
||||
+ if (se->conn.max_write > bufsize - FUSE_BUFFER_HEADER_SIZE)
|
||||
+ se->conn.max_write = bufsize - FUSE_BUFFER_HEADER_SIZE;
|
||||
|
||||
se->got_init = 1;
|
||||
if (se->op.init)
|
||||
@@ -1958,6 +1966,14 @@ static void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
|
||||
return;
|
||||
}
|
||||
|
||||
+ if (se->conn.max_write < bufsize - FUSE_BUFFER_HEADER_SIZE) {
|
||||
+ se->bufsize = se->conn.max_write + FUSE_BUFFER_HEADER_SIZE;
|
||||
+ }
|
||||
+ if (arg->flags & FUSE_MAX_PAGES) {
|
||||
+ outarg.flags |= FUSE_MAX_PAGES;
|
||||
+ outarg.max_pages = (se->conn.max_write - 1) / getpagesize() + 1;
|
||||
+ }
|
||||
+
|
||||
/* Always enable big writes, this is superseded
|
||||
by the max_write option */
|
||||
outarg.flags |= FUSE_BIG_WRITES;
|
||||
@@ -2779,11 +2795,6 @@ restart:
|
||||
return res;
|
||||
}
|
||||
|
||||
-#define KERNEL_BUF_PAGES 32
|
||||
-
|
||||
-/* room needed in buffer to accommodate header */
|
||||
-#define HEADER_SIZE 0x1000
|
||||
-
|
||||
struct fuse_session *fuse_session_new(struct fuse_args *args,
|
||||
const struct fuse_lowlevel_ops *op,
|
||||
size_t op_size, void *userdata)
|
||||
@@ -2844,7 +2855,8 @@ struct fuse_session *fuse_session_new(struct fuse_args *args,
|
||||
if (se->debug)
|
||||
fprintf(stderr, "FUSE library version: %s\n", PACKAGE_VERSION);
|
||||
|
||||
- se->bufsize = KERNEL_BUF_PAGES * getpagesize() + HEADER_SIZE;
|
||||
+ se->bufsize = FUSE_MAX_MAX_PAGES * getpagesize() +
|
||||
+ FUSE_BUFFER_HEADER_SIZE;
|
||||
|
||||
list_init_req(&se->list);
|
||||
list_init_req(&se->interrupts);
|
||||
--
|
||||
2.36.1
|
||||
|
@ -1,83 +0,0 @@
|
||||
From be7f19b21c84004c5a0705f040b957fd1c609e2e Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Etienne=20Dubl=C3=A9?= <etienne.duble@imag.fr>
|
||||
Date: Sun, 20 Sep 2020 20:08:15 +0200
|
||||
Subject: [PATCH 3/4] Allow caching symlinks in kernel page cache. (#551)
|
||||
|
||||
This commit defines a new capability called `FUSE_CAP_CACHE_SYMLINKS`.
|
||||
It is off by default but you can now enable it by setting this flag in
|
||||
in the `want` field of the `fuse_conn_info` structure.
|
||||
|
||||
When enabled, the kernel will save symlinks in its page cache,
|
||||
by making use of the feature introduced in kernel 4.20:
|
||||
https://github.com/torvalds/linux/commit/5571f1e65486be025f73fa6aa30fb03725d362a2
|
||||
|
||||
(cherry picked from commit ba3b225a126ebb3c6d4fe27c9f7c73aa4167001e)
|
||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
||||
---
|
||||
example/printcap.c | 2 ++
|
||||
include/fuse_common.h | 13 +++++++++++++
|
||||
lib/fuse_lowlevel.c | 4 ++++
|
||||
3 files changed, 19 insertions(+)
|
||||
|
||||
diff --git a/example/printcap.c b/example/printcap.c
|
||||
index 77dea14..a66036f 100644
|
||||
--- a/example/printcap.c
|
||||
+++ b/example/printcap.c
|
||||
@@ -77,6 +77,8 @@ static void pc_init(void *userdata,
|
||||
printf("\tFUSE_CAP_PARALLEL_DIROPS\n");
|
||||
if(conn->capable & FUSE_CAP_POSIX_ACL)
|
||||
printf("\tFUSE_CAP_POSIX_ACL\n");
|
||||
+ if(conn->capable & FUSE_CAP_CACHE_SYMLINKS)
|
||||
+ printf("\tFUSE_CAP_CACHE_SYMLINKS\n");
|
||||
fuse_session_exit(se);
|
||||
}
|
||||
|
||||
diff --git a/include/fuse_common.h b/include/fuse_common.h
|
||||
index 83c9dee..a5a0ea5 100644
|
||||
--- a/include/fuse_common.h
|
||||
+++ b/include/fuse_common.h
|
||||
@@ -316,6 +316,19 @@ struct fuse_loop_config {
|
||||
*/
|
||||
#define FUSE_CAP_HANDLE_KILLPRIV (1 << 20)
|
||||
|
||||
+/**
|
||||
+ * Indicates that the kernel supports caching symlinks in its page cache.
|
||||
+ *
|
||||
+ * When this feature is enabled, symlink targets are saved in the page cache.
|
||||
+ * You can invalidate a cached link by calling:
|
||||
+ * `fuse_lowlevel_notify_inval_inode(se, ino, 0, 0);`
|
||||
+ *
|
||||
+ * This feature is disabled by default.
|
||||
+ * If the kernel supports it (>= 4.20), you can enable this feature by
|
||||
+ * setting this flag in the `want` field of the `fuse_conn_info` structure.
|
||||
+ */
|
||||
+#define FUSE_CAP_CACHE_SYMLINKS (1 << 23)
|
||||
+
|
||||
/**
|
||||
* Ioctl flags
|
||||
*
|
||||
diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
|
||||
index 60195e0..43f785f 100644
|
||||
--- a/lib/fuse_lowlevel.c
|
||||
+++ b/lib/fuse_lowlevel.c
|
||||
@@ -1882,6 +1882,8 @@ static void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
|
||||
se->conn.capable |= FUSE_CAP_POSIX_ACL;
|
||||
if (arg->flags & FUSE_HANDLE_KILLPRIV)
|
||||
se->conn.capable |= FUSE_CAP_HANDLE_KILLPRIV;
|
||||
+ if (arg->flags & FUSE_CACHE_SYMLINKS)
|
||||
+ se->conn.capable |= FUSE_CAP_CACHE_SYMLINKS;
|
||||
if (!(arg->flags & FUSE_MAX_PAGES)) {
|
||||
size_t max_bufsize =
|
||||
FUSE_DEFAULT_MAX_PAGES_PER_REQ * getpagesize()
|
||||
@@ -2002,6 +2004,8 @@ static void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
|
||||
outarg.flags |= FUSE_WRITEBACK_CACHE;
|
||||
if (se->conn.want & FUSE_CAP_POSIX_ACL)
|
||||
outarg.flags |= FUSE_POSIX_ACL;
|
||||
+ if (se->conn.want & FUSE_CAP_CACHE_SYMLINKS)
|
||||
+ outarg.flags |= FUSE_CACHE_SYMLINKS;
|
||||
outarg.max_readahead = se->conn.max_readahead;
|
||||
outarg.max_write = se->conn.max_write;
|
||||
if (se->conn.proto_minor >= 13) {
|
||||
--
|
||||
2.36.1
|
||||
|
@ -1,65 +0,0 @@
|
||||
From da57354dc8593d37eff59bc7836ee4e460a2659a Mon Sep 17 00:00:00 2001
|
||||
From: Nikolaus Rath <Nikolaus@rath.org>
|
||||
Date: Sat, 6 Apr 2019 18:34:57 +0100
|
||||
Subject: [PATCH 4/4] Add support for in-kernel readdir caching.
|
||||
|
||||
Fixes: #394.
|
||||
(cherry picked from commit 1552b467fcd7751360299c5139382d78538e12b3)
|
||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
||||
---
|
||||
include/fuse_common.h | 18 +++++++++++++-----
|
||||
lib/fuse_lowlevel.c | 2 ++
|
||||
2 files changed, 15 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/include/fuse_common.h b/include/fuse_common.h
|
||||
index a5a0ea5..a28ffa5 100644
|
||||
--- a/include/fuse_common.h
|
||||
+++ b/include/fuse_common.h
|
||||
@@ -45,9 +45,11 @@ struct fuse_file_info {
|
||||
/** Can be filled in by open, to use direct I/O on this file. */
|
||||
unsigned int direct_io : 1;
|
||||
|
||||
- /** Can be filled in by open, to indicate that currently
|
||||
- cached file data (that the filesystem provided the last
|
||||
- time the file was open) need not be invalidated. */
|
||||
+ /** Can be filled in by open. It signals the kernel that any
|
||||
+ currently cached file data (ie., data that the filesystem
|
||||
+ provided the last time the file was open) need not be
|
||||
+ invalidated. Has no effect when set in other contexts (in
|
||||
+ particular it does nothing when set by opendir()). */
|
||||
unsigned int keep_cache : 1;
|
||||
|
||||
/** Indicates a flush operation. Set in flush operation, also
|
||||
@@ -64,8 +66,14 @@ struct fuse_file_info {
|
||||
May only be set in ->release(). */
|
||||
unsigned int flock_release : 1;
|
||||
|
||||
- /** Padding. Do not use*/
|
||||
- unsigned int padding : 27;
|
||||
+ /** Can be filled in by opendir. It signals the kernel to
|
||||
+ enable caching of entries returned by readdir(). Has no
|
||||
+ effect when set in other contexts (in particular it does
|
||||
+ nothing when set by open()). */
|
||||
+ unsigned int cache_readdir : 1;
|
||||
+
|
||||
+ /** Padding. Reserved for future use*/
|
||||
+ unsigned int padding : 26;
|
||||
|
||||
/** File handle. May be filled in by filesystem in open().
|
||||
Available in all other file operations */
|
||||
diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
|
||||
index 43f785f..6379e09 100644
|
||||
--- a/lib/fuse_lowlevel.c
|
||||
+++ b/lib/fuse_lowlevel.c
|
||||
@@ -392,6 +392,8 @@ static void fill_open(struct fuse_open_out *arg,
|
||||
arg->open_flags |= FOPEN_DIRECT_IO;
|
||||
if (f->keep_cache)
|
||||
arg->open_flags |= FOPEN_KEEP_CACHE;
|
||||
+ if (f->cache_readdir)
|
||||
+ arg->open_flags |= FOPEN_CACHE_DIR;
|
||||
if (f->nonseekable)
|
||||
arg->open_flags |= FOPEN_NONSEEKABLE;
|
||||
}
|
||||
--
|
||||
2.36.1
|
||||
|
@ -1,179 +0,0 @@
|
||||
From 4df08719f3415cde6f802a755922b7f76e198cd7 Mon Sep 17 00:00:00 2001
|
||||
From: Dharmendra Singh <dsingh@ddn.com>
|
||||
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.
|
||||
---
|
||||
include/fuse_kernel.h | 8 ++++-
|
||||
lib/fuse_lowlevel.c | 75 ++++++++++++++++++++++++++++----------------------
|
||||
2 files changed, 48 insertions(+), 35 deletions(-)
|
||||
|
||||
--- a/include/fuse_kernel.h
|
||||
+++ b/include/fuse_kernel.h
|
||||
@@ -272,6 +272,7 @@ struct fuse_file_lock {
|
||||
#define FUSE_POSIX_ACL (1 << 20)
|
||||
#define FUSE_MAX_PAGES (1 << 22)
|
||||
#define FUSE_CACHE_SYMLINKS (1 << 23)
|
||||
+#define FUSE_INIT_EXT (1 << 30)
|
||||
|
||||
/**
|
||||
* CUSE INIT request/reply flags
|
||||
@@ -596,6 +597,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
|
||||
@@ -611,8 +614,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
|
||||
--- a/lib/fuse_lowlevel.c
|
||||
+++ b/lib/fuse_lowlevel.c
|
||||
@@ -1819,7 +1819,8 @@ static void do_init(fuse_req_t req, fuse
|
||||
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) {
|
||||
fprintf(stderr, "INIT: %u.%u\n", arg->major, arg->minor);
|
||||
@@ -1854,39 +1855,42 @@ static void do_init(fuse_req_t req, fuse
|
||||
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_MAX_PAGES)) {
|
||||
+ if (!(inargflags & FUSE_MAX_PAGES)) {
|
||||
size_t max_bufsize =
|
||||
FUSE_DEFAULT_MAX_PAGES_PER_REQ * getpagesize()
|
||||
+ FUSE_BUFFER_HEADER_SIZE;
|
||||
@@ -1977,37 +1981,42 @@ static void do_init(fuse_req_t req, fuse
|
||||
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;
|
||||
+
|
||||
+ 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) {
|
@ -1,118 +0,0 @@
|
||||
From 22cc0c761ad23395a8220ce1954cfb8a64f36ff4 Mon Sep 17 00:00:00 2001
|
||||
From: HereThereBeDragons <HereThereBeDragons@users.noreply.github.com>
|
||||
Date: Thu, 27 Oct 2022 17:52:10 +0200
|
||||
Subject: [PATCH] Initial patch provided by Miklos Szeredi
|
||||
<mszeredi@redhat.com>
|
||||
|
||||
---
|
||||
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 09da620b5..e0666a1f7 100644
|
||||
--- a/include/fuse_kernel.h
|
||||
+++ b/include/fuse_kernel.h
|
||||
@@ -336,6 +336,12 @@
|
||||
*/
|
||||
#define FUSE_POLL_SCHEDULE_NOTIFY (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 53f0fcf4b..c955cc4bb 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 e82cd9e9f..7b9d71043 100644
|
||||
--- a/lib/fuse_lowlevel.c
|
||||
+++ b/lib/fuse_lowlevel.c
|
||||
@@ -2161,21 +2161,24 @@
|
||||
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_major < 6 || 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 7e50e7507..795ea4aa9 100644
|
||||
--- a/lib/fuse_versionscript
|
||||
+++ b/lib/fuse_versionscript
|
||||
@@ -151,6 +151,7 @@
|
||||
FUSE_3.3 {
|
||||
global:
|
||||
fuse_open_channel;
|
||||
+ fuse_lowlevel_notify_expire_entr;
|
||||
} FUSE_3.2;
|
||||
|
||||
# Local Variables:
|
||||
|
@ -1,125 +0,0 @@
|
||||
From 6b1612e3a85b993f82124cccf149df3830e4a9c5 Mon Sep 17 00:00:00 2001
|
||||
From: HereThereBeDragons <HereThereBeDragons@users.noreply.github.com>
|
||||
Date: Thu, 27 Oct 2022 17:52:10 +0200
|
||||
Subject: [PATCH] adding comments and capability discovery, enum for flags
|
||||
moved to top of file
|
||||
|
||||
---
|
||||
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 edfd8f531..48679883c 100644
|
||||
--- a/example/printcap.c
|
||||
+++ b/example/printcap.c
|
||||
@@ -79,6 +79,8 @@
|
||||
printf("\tFUSE_CAP_POSIX_ACL\n");
|
||||
if(conn->capable & FUSE_CAP_CACHE_SYMLINKS)
|
||||
printf("\tFUSE_CAP_CACHE_SYMLINKS\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 e9d874556..dbba05af8 100644
|
||||
--- a/include/fuse_common.h
|
||||
+++ b/include/fuse_common.h
|
||||
@@ -338,6 +338,22 @@
|
||||
#define FUSE_CAP_CACHE_SYMLINKS (1 << 23)
|
||||
|
||||
/**
|
||||
+ * 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
|
||||
*
|
||||
* FUSE_IOCTL_COMPAT: 32bit compat ioctl on 64bit machine
|
||||
|
||||
diff --git a/include/fuse_lowlevel.h b/include/fuse_lowlevel.h
|
||||
index c955cc4bb..6a1a5d534 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 7b9d71043..7d7630925 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;
|
||||
}
|
@ -1,45 +0,0 @@
|
||||
From: Miklos Szeredi <mszeredi@redhat.com>
|
||||
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 <mszeredi@redhat.com>
|
||||
---
|
||||
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
|
||||
@@ -248,6 +248,7 @@
|
||||
* FUSE_POSIX_ACL: filesystem supports posix acls
|
||||
* FUSE_MAX_PAGES: init_out.max_pages contains the max number of req pages
|
||||
* FUSE_CACHE_SYMLINKS: cache READLINK responses
|
||||
+ * FUSE_HAS_EXPIRE_ONLY: kernel supports expiry-only entry invalidation
|
||||
*/
|
||||
#define FUSE_ASYNC_READ (1 << 0)
|
||||
#define FUSE_POSIX_LOCKS (1 << 1)
|
||||
@@ -272,6 +273,7 @@
|
||||
#define FUSE_MAX_PAGES (1 << 22)
|
||||
#define FUSE_CACHE_SYMLINKS (1 << 23)
|
||||
#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;
|
@ -1,21 +0,0 @@
|
||||
diff -up fuse-2.9.2/include/fuse_kernel.h.conflictfix fuse-2.9.2/include/fuse_kernel.h
|
||||
--- fuse-2.9.2/include/fuse_kernel.h.conflictfix 2013-06-26 09:31:57.862198038 -0400
|
||||
+++ fuse-2.9.2/include/fuse_kernel.h 2013-06-26 09:32:19.679198365 -0400
|
||||
@@ -88,12 +88,16 @@
|
||||
#ifndef _LINUX_FUSE_H
|
||||
#define _LINUX_FUSE_H
|
||||
|
||||
-#include <sys/types.h>
|
||||
+#ifdef __linux__
|
||||
+#include <linux/types.h>
|
||||
+#else
|
||||
+#include <stdint.h>
|
||||
#define __u64 uint64_t
|
||||
#define __s64 int64_t
|
||||
#define __u32 uint32_t
|
||||
#define __s32 int32_t
|
||||
#define __u16 uint16_t
|
||||
+#endif
|
||||
|
||||
/*
|
||||
* Version negotiation:
|
@ -1,13 +0,0 @@
|
||||
diff -up libfuse-fuse-3.0.0/lib/fuse.c.parens libfuse-fuse-3.0.0/lib/fuse.c
|
||||
--- libfuse-fuse-3.0.0/lib/fuse.c.parens 2017-03-21 09:31:31.979537796 -0400
|
||||
+++ libfuse-fuse-3.0.0/lib/fuse.c 2017-03-21 09:31:42.676250718 -0400
|
||||
@@ -1653,7 +1653,7 @@ int fuse_fs_open(struct fuse_fs *fs, con
|
||||
fprintf(stderr, "open flags: 0x%x %s\n", fi->flags,
|
||||
path);
|
||||
|
||||
- err = fs->op.open(path, fi);
|
||||
+ err = (fs->op.open)(path, fi);
|
||||
|
||||
if (fs->debug && !err)
|
||||
fprintf(stderr, " open[%llu] flags: 0x%x %s\n",
|
||||
diff -up libfuse-fuse-3.0.0/lib/fuse_lowlevel.c.parens libfuse-fuse-3.0.0/lib/fuse_lowlevel.c
|
@ -1,11 +0,0 @@
|
||||
--- libfuse-fuse-3.3.0/test/test_syscalls.c.orig 2018-11-06 19:57:47.000000000 +0100
|
||||
+++ libfuse-fuse-3.3.0/test/test_syscalls.c 2022-02-07 17:17:47.512515240 +0100
|
||||
@@ -1511,7 +1511,7 @@
|
||||
|
||||
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;
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
--- libfuse-fuse-3.3.0/util/install_helper.orig 2022-01-31 20:17:39.461137935 +0100
|
||||
+++ libfuse-fuse-3.3.0/util/install_helper.sh 2022-01-31 20:18:46.093188655 +0100
|
||||
@@ -22,18 +22,12 @@
|
||||
DESTDIR="${DESTDIR%/}"
|
||||
fi
|
||||
|
||||
-chown root:root "${DESTDIR}${bindir}/fusermount3"
|
||||
+#chown root:root "${DESTDIR}${bindir}/fusermount3"
|
||||
chmod u+s "${DESTDIR}${bindir}/fusermount3"
|
||||
|
||||
install -D -m 644 "${MESON_SOURCE_ROOT}/util/fuse.conf" \
|
||||
"${DESTDIR}${sysconfdir}/fuse.conf"
|
||||
|
||||
-
|
||||
-if test ! -e "${DESTDIR}/dev/fuse"; then
|
||||
- mkdir -p "${DESTDIR}/dev"
|
||||
- mknod "${DESTDIR}/dev/fuse" -m 0666 c 10 229
|
||||
-fi
|
||||
-
|
||||
install -D -m 644 "${MESON_SOURCE_ROOT}/util/udev.rules" \
|
||||
"${DESTDIR}${udevrulesdir}/99-fuse3.rules"
|
||||
|
@ -1,2 +0,0 @@
|
||||
# mount_max = 1000
|
||||
# user_allow_other
|
@ -0,0 +1,28 @@
|
||||
From: Tom Callaway <spot@fedoraproject.org>
|
||||
Date: Wed, 26 Jun 2013 09:34:52 -0400
|
||||
Subject: [PATCH] add fix for namespace conflict in fuse_kernel.h
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=970768
|
||||
|
||||
diff --git a/include/fuse_kernel.h b/include/fuse_kernel.h
|
||||
index c632b58..9e02fe3 100644
|
||||
--- a/include/fuse_kernel.h
|
||||
+++ b/include/fuse_kernel.h
|
||||
@@ -88,12 +88,16 @@
|
||||
#ifndef _LINUX_FUSE_H
|
||||
#define _LINUX_FUSE_H
|
||||
|
||||
-#include <sys/types.h>
|
||||
+#ifdef __linux__
|
||||
+#include <linux/types.h>
|
||||
+#else
|
||||
+#include <stdint.h>
|
||||
#define __u64 uint64_t
|
||||
#define __s64 int64_t
|
||||
#define __u32 uint32_t
|
||||
#define __s32 int32_t
|
||||
#define __u16 uint16_t
|
||||
+#endif
|
||||
|
||||
/*
|
||||
* Version negotiation:
|
@ -0,0 +1,20 @@
|
||||
From: Peter Lemenkov <lemenkov@gmail.com>
|
||||
Date: Wed, 3 Apr 2019 12:23:56 +0300
|
||||
Subject: [PATCH] Whitelist SMB2 found on some NAS devices
|
||||
|
||||
* https://bugzilla.redhat.com/1694552#c7
|
||||
|
||||
Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
|
||||
|
||||
diff --git a/util/fusermount.c b/util/fusermount.c
|
||||
index 4b799d9..ef9d1ed 100644
|
||||
--- a/util/fusermount.c
|
||||
+++ b/util/fusermount.c
|
||||
@@ -1046,6 +1046,7 @@ static int check_perm(const char **mntp, struct stat *stbuf, int *mountpoint_fd)
|
||||
0x5346544E /* NTFS_SB_MAGIC */,
|
||||
0x794C7630 /* OVERLAYFS_SUPER_MAGIC */,
|
||||
0x52654973 /* REISERFS_SUPER_MAGIC */,
|
||||
+ 0xFE534D42 /* SMB2_SUPER_MAGIC */,
|
||||
0x73717368 /* SQUASHFS_MAGIC */,
|
||||
0x01021994 /* TMPFS_MAGIC */,
|
||||
0x24051905 /* UBIFS_SUPER_MAGIC */,
|
@ -0,0 +1,60 @@
|
||||
From ae2352bca9b4e607538412da0cc2a9625cd8b692 Mon Sep 17 00:00:00 2001
|
||||
From: Sam James <sam@gentoo.org>
|
||||
Date: Sat, 24 Jul 2021 22:02:45 +0100
|
||||
Subject: [PATCH] util/ulockmgr_server.c: conditionally define closefrom (fix
|
||||
glibc-2.34+)
|
||||
|
||||
closefrom(3) has joined us in glibc-land from *BSD and Solaris. Since
|
||||
it's available in glibc 2.34+, we want to detect it and only define our
|
||||
fallback if the libc doesn't provide it.
|
||||
|
||||
Bug: https://bugs.gentoo.org/803923
|
||||
Signed-off-by: Sam James <sam@gentoo.org>
|
||||
---
|
||||
configure.ac | 1 +
|
||||
util/ulockmgr_server.c | 6 ++++++
|
||||
2 files changed, 7 insertions(+)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 9946a0efa..a2d481aa9 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -55,6 +55,7 @@ fi
|
||||
|
||||
AC_CHECK_FUNCS([fork setxattr fdatasync splice vmsplice utimensat])
|
||||
AC_CHECK_FUNCS([posix_fallocate])
|
||||
+AC_CHECK_FUNCS([closefrom])
|
||||
AC_CHECK_MEMBERS([struct stat.st_atim])
|
||||
AC_CHECK_MEMBERS([struct stat.st_atimespec])
|
||||
|
||||
diff --git a/util/ulockmgr_server.c b/util/ulockmgr_server.c
|
||||
index 273c7d923..a04dac5c6 100644
|
||||
--- a/util/ulockmgr_server.c
|
||||
+++ b/util/ulockmgr_server.c
|
||||
@@ -22,6 +22,10 @@
|
||||
#include <sys/socket.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
+#ifdef HAVE_CONFIG_H
|
||||
+ #include "config.h"
|
||||
+#endif
|
||||
+
|
||||
struct message {
|
||||
unsigned intr : 1;
|
||||
unsigned nofd : 1;
|
||||
@@ -124,6 +128,7 @@ static int receive_message(int sock, void *buf, size_t buflen, int *fdp,
|
||||
return res;
|
||||
}
|
||||
|
||||
+#if !defined(HAVE_CLOSEFROM)
|
||||
static int closefrom(int minfd)
|
||||
{
|
||||
DIR *dir = opendir("/proc/self/fd");
|
||||
@@ -141,6 +146,7 @@ static int closefrom(int minfd)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
+#endif
|
||||
|
||||
static void send_reply(int cfd, struct message *msg)
|
||||
{
|
@ -1,47 +0,0 @@
|
||||
From 520f09be3c2d351722c33daf7389d6ac4716be98 Mon Sep 17 00:00:00 2001
|
||||
From: Jann Horn <jannh@google.com>
|
||||
Date: Fri, 13 Jul 2018 15:15:36 -0700
|
||||
Subject: [PATCH] fusermount: don't feed "escaped commas" into mount options
|
||||
|
||||
The old code permits the following behavior:
|
||||
|
||||
$ _FUSE_COMMFD=10000 priv_strace -etrace=mount -s200 fusermount -o 'foobar=\,allow_other' mount
|
||||
mount("/dev/fuse", ".", "fuse", MS_NOSUID|MS_NODEV, "foobar=\\,allow_other,fd=3,rootmode=40000,user_id=1000,group_id=1000") = -1 EINVAL (Invalid argument)
|
||||
|
||||
However, backslashes do not have any special meaning for the kernel here.
|
||||
|
||||
As it happens, you can't abuse this because there is no FUSE mount option
|
||||
that takes a string value that can contain backslashes; but this is very
|
||||
brittle. Don't interpret "escape characters" in places where they don't
|
||||
work.
|
||||
---
|
||||
util/fusermount.c | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/util/fusermount.c b/util/fusermount.c
|
||||
index 26a0b75bbecb..5175c0115a05 100644
|
||||
--- a/util/fusermount.c
|
||||
+++ b/util/fusermount.c
|
||||
@@ -29,6 +29,7 @@
|
||||
#include <sys/socket.h>
|
||||
#include <sys/utsname.h>
|
||||
#include <sched.h>
|
||||
+#include <stdbool.h>
|
||||
|
||||
#define FUSE_COMMFD_ENV "_FUSE_COMMFD"
|
||||
|
||||
@@ -739,8 +740,10 @@ static int do_mount(const char *mnt, char **typep, mode_t rootmode,
|
||||
unsigned len;
|
||||
const char *fsname_str = "fsname=";
|
||||
const char *subtype_str = "subtype=";
|
||||
+ bool escape_ok = begins_with(s, fsname_str) ||
|
||||
+ begins_with(s, subtype_str);
|
||||
for (len = 0; s[len]; len++) {
|
||||
- if (s[len] == '\\' && s[len + 1])
|
||||
+ if (escape_ok && s[len] == '\\' && s[len + 1])
|
||||
len++;
|
||||
else if (s[len] == ',')
|
||||
break;
|
||||
--
|
||||
2.14.3
|
||||
|
Loading…
Reference in new issue