Synchronize expire-only API with upstream.
Resolves: RHEL-23415 Signed-off-by: Pavel Reichl <preichl@redhat.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
This commit is contained in:
parent
70060deba3
commit
393d59cf7a
@ -111,7 +111,7 @@ index 7e50e7507..795ea4aa9 100644
|
|||||||
FUSE_3.3 {
|
FUSE_3.3 {
|
||||||
global:
|
global:
|
||||||
fuse_open_channel;
|
fuse_open_channel;
|
||||||
+ fuse_lowlevel_notify_expire_entr;
|
+ fuse_lowlevel_notify_expire_entry;
|
||||||
} FUSE_3.2;
|
} FUSE_3.2;
|
||||||
|
|
||||||
# Local Variables:
|
# Local Variables:
|
||||||
|
150
0009-Make-expire-only-function-fail-if-no-kernel-support-.patch
Normal file
150
0009-Make-expire-only-function-fail-if-no-kernel-support-.patch
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
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
|
||||||
|
@@ -338,7 +338,7 @@ struct fuse_loop_config {
|
||||||
|
#define FUSE_CAP_CACHE_SYMLINKS (1 << 23)
|
||||||
|
|
||||||
|
/**
|
||||||
|
- * 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
|
||||||
|
@@ -131,11 +131,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),
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -1560,8 +1561,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 while
|
||||||
|
* executing a related filesytem operation or while holding a lock
|
||||||
|
@@ -1588,14 +1588,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.
|
||||||
|
@@ -1606,17 +1605,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
|
||||||
|
@@ -2172,9 +2172,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];
|
||||||
|
@@ -2200,9 +2219,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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
Name: fuse
|
Name: fuse
|
||||||
Version: %{fuse2ver}
|
Version: %{fuse2ver}
|
||||||
Release: 18%{?dist}
|
Release: 19%{?dist}
|
||||||
Summary: File System in Userspace (FUSE) v2 utilities
|
Summary: File System in Userspace (FUSE) v2 utilities
|
||||||
License: GPL+
|
License: GPL+
|
||||||
URL: http://fuse.sf.net
|
URL: http://fuse.sf.net
|
||||||
@ -32,6 +32,7 @@ Patch14: 0007-BZ_2171095-cap.patch
|
|||||||
Patch15: 0008-BZ_217095-libfuse-add-feature-flag-for-expire-only.patch
|
Patch15: 0008-BZ_217095-libfuse-add-feature-flag-for-expire-only.patch
|
||||||
Patch16: fuse-3.17.0-Pass-FUSE_PARALLEL_DIROPS-to-kernel-861.patch
|
Patch16: fuse-3.17.0-Pass-FUSE_PARALLEL_DIROPS-to-kernel-861.patch
|
||||||
Patch17: fuse-3.17.0-Don-t-set-FUSE_CAP_PARALLEL_DIROPS-by-default.patch
|
Patch17: fuse-3.17.0-Don-t-set-FUSE_CAP_PARALLEL_DIROPS-by-default.patch
|
||||||
|
Patch18: 0009-Make-expire-only-function-fail-if-no-kernel-support-.patch
|
||||||
|
|
||||||
Requires: which
|
Requires: which
|
||||||
Conflicts: filesystem < 3
|
Conflicts: filesystem < 3
|
||||||
@ -132,6 +133,7 @@ pushd lib%{name}-%{name}-%{fuse3ver}
|
|||||||
%patch15 -p1
|
%patch15 -p1
|
||||||
%patch16 -p1
|
%patch16 -p1
|
||||||
%patch17 -p1
|
%patch17 -p1
|
||||||
|
%patch18 -p1
|
||||||
|
|
||||||
popd
|
popd
|
||||||
|
|
||||||
@ -263,6 +265,10 @@ rm -f %{buildroot}/usr/lib/udev/rules.d/99-fuse3.rules
|
|||||||
%{_includedir}/fuse3/
|
%{_includedir}/fuse3/
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Feb 06 2024 Pavel Reichl <preichl@redhat.com> - 2.9.7-19
|
||||||
|
- Synchronize expire-only API with upstream.
|
||||||
|
- Related: RHEL-23415
|
||||||
|
|
||||||
* Fri Feb 02 2024 Pavel Reichl <preichl@redhat.com> - 2.9.7-18
|
* Fri Feb 02 2024 Pavel Reichl <preichl@redhat.com> - 2.9.7-18
|
||||||
- Advertise support of FUSE_PARALLEL_DIROPS to kernel
|
- Advertise support of FUSE_PARALLEL_DIROPS to kernel
|
||||||
- Fixes RHEL-19149
|
- Fixes RHEL-19149
|
||||||
|
Loading…
Reference in New Issue
Block a user