Compare commits
No commits in common. 'c9-beta' and 'c9' have entirely different histories.
@ -1,150 +0,0 @@
|
|||||||
From 51bc827df873d9ff4069b83796cd32fcb6bd659e Mon Sep 17 00:00:00 2001
|
|
||||||
From: HereThereBeDragons <HereThereBeDragons@users.noreply.github.com>
|
|
||||||
Date: Fri, 30 Jun 2023 14:57:06 +0200
|
|
||||||
Subject: [PATCH] Make expire only function fail if no kernel support (#789)
|
|
||||||
|
|
||||||
---
|
|
||||||
include/fuse_common.h | 2 +-
|
|
||||||
include/fuse_lowlevel.h | 28 ++++++++++++++--------------
|
|
||||||
lib/fuse_lowlevel.c | 41 ++++++++++++++++++++++++++++++++++++-----
|
|
||||||
3 files changed, 51 insertions(+), 20 deletions(-)
|
|
||||||
|
|
||||||
--- a/include/fuse_common.h
|
|
||||||
+++ b/include/fuse_common.h
|
|
||||||
@@ -395,7 +395,7 @@ struct fuse_loop_config {
|
|
||||||
#define FUSE_CAP_EXPLICIT_INVAL_DATA (1 << 25)
|
|
||||||
|
|
||||||
/**
|
|
||||||
- * Indicates support that dentries can be expired or invalidated.
|
|
||||||
+ * Indicates support that dentries can be expired.
|
|
||||||
*
|
|
||||||
* Expiring dentries, instead of invalidating them, makes a difference for
|
|
||||||
* overmounted dentries, where plain invalidation would detach all submounts
|
|
||||||
--- a/include/fuse_lowlevel.h
|
|
||||||
+++ b/include/fuse_lowlevel.h
|
|
||||||
@@ -128,11 +128,12 @@ struct fuse_forget_data {
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
- * Flags for fuse_lowlevel_notify_expire_entry()
|
|
||||||
+ * Flags for fuse_lowlevel_notify_entry()
|
|
||||||
* 0 = invalidate entry
|
|
||||||
* FUSE_LL_EXPIRE_ONLY = expire entry
|
|
||||||
*/
|
|
||||||
-enum fuse_expire_flags {
|
|
||||||
+enum fuse_notify_entry_flags {
|
|
||||||
+ FUSE_LL_INVALIDATE = 0,
|
|
||||||
FUSE_LL_EXPIRE_ONLY = (1 << 0),
|
|
||||||
};
|
|
||||||
|
|
||||||
@@ -1657,8 +1658,7 @@ int fuse_lowlevel_notify_inval_inode(str
|
|
||||||
off_t off, off_t len);
|
|
||||||
|
|
||||||
/**
|
|
||||||
- * Notify to invalidate parent attributes and the dentry matching
|
|
||||||
- * parent/name
|
|
||||||
+ * Notify to invalidate parent attributes and the dentry matching parent/name
|
|
||||||
*
|
|
||||||
* To avoid a deadlock this function must not be called in the
|
|
||||||
* execution path of a related filesytem operation or within any code
|
|
||||||
@@ -1685,14 +1685,13 @@ int fuse_lowlevel_notify_inval_entry(str
|
|
||||||
const char *name, size_t namelen);
|
|
||||||
|
|
||||||
/**
|
|
||||||
- * Notify to expire or invalidate parent attributes and the dentry
|
|
||||||
- * matching parent/name
|
|
||||||
+ * Notify to expire parent attributes and the dentry matching parent/name
|
|
||||||
*
|
|
||||||
- * Underlying function for fuse_lowlevel_notify_inval_entry().
|
|
||||||
+ * Same restrictions apply as 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.
|
|
||||||
+ * Compared to invalidating an entry, expiring the entry results not in a
|
|
||||||
+ * forceful removal of that entry 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.
|
|
||||||
@@ -1703,17 +1702,18 @@ int fuse_lowlevel_notify_inval_entry(str
|
|
||||||
* 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.
|
|
||||||
+ *
|
|
||||||
+ * Added in FUSE protocol version 7.38. If the kernel does not support
|
|
||||||
+ * this (or a newer) version, the function will return -ENOSYS and do nothing.
|
|
||||||
*
|
|
||||||
* @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
|
|
||||||
+ * @return zero for success, -errno for failure, -enosys if no kernel support
|
|
||||||
*/
|
|
||||||
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);
|
|
||||||
+ const char *name, size_t namelen);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This function behaves like fuse_lowlevel_notify_inval_entry() with
|
|
||||||
--- a/lib/fuse_lowlevel.c
|
|
||||||
+++ b/lib/fuse_lowlevel.c
|
|
||||||
@@ -2257,9 +2257,28 @@ int fuse_lowlevel_notify_inval_inode(str
|
|
||||||
return send_notify_iov(se, FUSE_NOTIFY_INVAL_INODE, iov, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
-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)
|
|
||||||
+/**
|
|
||||||
+ * Notify parent attributes and the dentry matching parent/name
|
|
||||||
+ *
|
|
||||||
+ * Underlying base function for fuse_lowlevel_notify_inval_entry() and
|
|
||||||
+ * fuse_lowlevel_notify_expire_entry().
|
|
||||||
+ *
|
|
||||||
+ * @warning
|
|
||||||
+ * Only checks if fuse_lowlevel_notify_inval_entry() is supported by
|
|
||||||
+ * the kernel. All other flags will fall back to
|
|
||||||
+ * fuse_lowlevel_notify_inval_entry() if not supported!
|
|
||||||
+ * DO THE PROPER CHECKS IN THE DERIVED FUNCTION!
|
|
||||||
+ *
|
|
||||||
+ * @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
|
|
||||||
+*/
|
|
||||||
+static int fuse_lowlevel_notify_entry(struct fuse_session *se, fuse_ino_t parent,
|
|
||||||
+ const char *name, size_t namelen,
|
|
||||||
+ enum fuse_notify_entry_flags flags)
|
|
||||||
{
|
|
||||||
struct fuse_notify_inval_entry_out outarg;
|
|
||||||
struct iovec iov[3];
|
|
||||||
@@ -2285,9 +2304,21 @@ int fuse_lowlevel_notify_expire_entry(st
|
|
||||||
}
|
|
||||||
|
|
||||||
int fuse_lowlevel_notify_inval_entry(struct fuse_session *se, fuse_ino_t parent,
|
|
||||||
- const char *name, size_t namelen)
|
|
||||||
+ const char *name, size_t namelen)
|
|
||||||
+{
|
|
||||||
+ return fuse_lowlevel_notify_entry(se, parent, name, namelen, FUSE_LL_INVALIDATE);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int fuse_lowlevel_notify_expire_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);
|
|
||||||
+ if (!se)
|
|
||||||
+ return -EINVAL;
|
|
||||||
+
|
|
||||||
+ if (!(se->conn.capable & FUSE_CAP_EXPIRE_ONLY))
|
|
||||||
+ return -ENOSYS;
|
|
||||||
+
|
|
||||||
+ return fuse_lowlevel_notify_entry(se, parent, name, namelen, FUSE_LL_EXPIRE_ONLY);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,42 +0,0 @@
|
|||||||
From 2c736f516f28dfb5c58aff345c668a5ea6386295 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Miklos Szeredi <mszeredi@redhat.com>
|
|
||||||
Date: Wed, 10 Jan 2024 10:15:43 +0100
|
|
||||||
Subject: [PATCH] Don't set FUSE_CAP_PARALLEL_DIROPS by default
|
|
||||||
|
|
||||||
Allowing parallel dir operations could result in a crash in a filesystem
|
|
||||||
implementation that is not prepared for this.
|
|
||||||
|
|
||||||
To be safe keep this flag off by default (this is not a regression, since
|
|
||||||
there was no public release where this flag wasn't ignored).
|
|
||||||
|
|
||||||
If the filesystem wants better performance, then it should set this flag
|
|
||||||
explicitly.
|
|
||||||
|
|
||||||
Fixes: c9905341ea34 ("Pass FUSE_PARALLEL_DIROPS to kernel (#861)")
|
|
||||||
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
|
|
||||||
---
|
|
||||||
include/fuse_common.h | 2 --
|
|
||||||
lib/fuse_lowlevel.c | 1 -
|
|
||||||
2 files changed, 3 deletions(-)
|
|
||||||
|
|
||||||
--- a/include/fuse_common.h
|
|
||||||
+++ b/include/fuse_common.h
|
|
||||||
@@ -313,8 +313,6 @@ struct fuse_loop_config {
|
|
||||||
* is unset, the FUSE kernel module will ensure that lookup() and
|
|
||||||
* readdir() requests are never issued concurrently for the same
|
|
||||||
* directory.
|
|
||||||
- *
|
|
||||||
- * This feature is enabled by default when supported by the kernel.
|
|
||||||
*/
|
|
||||||
#define FUSE_CAP_PARALLEL_DIROPS (1 << 18)
|
|
||||||
|
|
||||||
--- a/lib/fuse_lowlevel.c
|
|
||||||
+++ b/lib/fuse_lowlevel.c
|
|
||||||
@@ -2009,7 +2009,6 @@ void do_init(fuse_req_t req, fuse_ino_t
|
|
||||||
if ((cond) && (se->conn.capable & (cap))) \
|
|
||||||
se->conn.want |= (cap)
|
|
||||||
LL_SET_DEFAULT(1, FUSE_CAP_ASYNC_READ);
|
|
||||||
- LL_SET_DEFAULT(1, FUSE_CAP_PARALLEL_DIROPS);
|
|
||||||
LL_SET_DEFAULT(1, FUSE_CAP_AUTO_INVAL_DATA);
|
|
||||||
LL_SET_DEFAULT(1, FUSE_CAP_HANDLE_KILLPRIV);
|
|
||||||
LL_SET_DEFAULT(1, FUSE_CAP_ASYNC_DIO);
|
|
@ -1,23 +0,0 @@
|
|||||||
From c9905341ea34ff9acbc11b3c53ba8bcea35eeed8 Mon Sep 17 00:00:00 2001
|
|
||||||
From: fdinoff <fdinoff@google.com>
|
|
||||||
Date: Thu, 16 Nov 2023 06:23:20 -0500
|
|
||||||
Subject: [PATCH] Pass FUSE_PARALLEL_DIROPS to kernel (#861)
|
|
||||||
|
|
||||||
This tells the kernel that parallel lookup/readdir operations are
|
|
||||||
supported. This is enabled by default but was not passed to the kernel
|
|
||||||
so you always get the synchronized version.
|
|
||||||
---
|
|
||||||
lib/fuse_lowlevel.c | 2 ++
|
|
||||||
1 file changed, 2 insertions(+)
|
|
||||||
|
|
||||||
--- a/lib/fuse_lowlevel.c
|
|
||||||
+++ b/lib/fuse_lowlevel.c
|
|
||||||
@@ -2093,6 +2093,8 @@ void do_init(fuse_req_t req, fuse_ino_t
|
|
||||||
outargflags |= FUSE_ASYNC_DIO;
|
|
||||||
if (se->conn.want & FUSE_CAP_WRITEBACK_CACHE)
|
|
||||||
outargflags |= FUSE_WRITEBACK_CACHE;
|
|
||||||
+ if (se->conn.want & FUSE_CAP_PARALLEL_DIROPS)
|
|
||||||
+ outargflags |= FUSE_PARALLEL_DIROPS;
|
|
||||||
if (se->conn.want & FUSE_CAP_POSIX_ACL)
|
|
||||||
outargflags |= FUSE_POSIX_ACL;
|
|
||||||
if (se->conn.want & FUSE_CAP_CACHE_SYMLINKS)
|
|
@ -1,35 +0,0 @@
|
|||||||
From 29f621af8d39d5a140da584ff6c1eb00147b5a56 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Miklos Szeredi <mszeredi@redhat.com>
|
|
||||||
Date: Thu, 13 Jun 2024 13:57:25 +0200
|
|
||||||
Subject: [PATCH] libfuse: null-terminate buffer in fuse_req_getgroups()
|
|
||||||
|
|
||||||
After reading the file /proc/$PID/task/$PID/status the buffer wasn't
|
|
||||||
terminated with a null character. This could theoretically lead to buffer
|
|
||||||
overrun by the subsequent strstr() call.
|
|
||||||
|
|
||||||
Since the contents of the proc file are guaranteed to contain the pattern
|
|
||||||
that strstr is looking for, this doesn't happen in normal situations.
|
|
||||||
|
|
||||||
Add null termination for robustness.
|
|
||||||
|
|
||||||
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
|
|
||||||
Signed-off-by: Pavel Reichl <preichl@redhat.com>
|
|
||||||
---
|
|
||||||
lib/fuse_lowlevel.c | 1 +
|
|
||||||
1 file changed, 1 insertion(+)
|
|
||||||
|
|
||||||
diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
|
|
||||||
index fc46882..74b0424 100644
|
|
||||||
--- a/lib/fuse_lowlevel.c
|
|
||||||
+++ b/lib/fuse_lowlevel.c
|
|
||||||
@@ -3353,6 +3353,7 @@ retry:
|
|
||||||
goto retry;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ buf[ret] = '\0';
|
|
||||||
ret = -EIO;
|
|
||||||
s = strstr(buf, "\nGroups:");
|
|
||||||
if (s == NULL)
|
|
||||||
--
|
|
||||||
2.45.2
|
|
||||||
|
|
Loading…
Reference in new issue