Merge: fuse: add "expire only" mode to FUSE_NOTIFY_INVAL_ENTRY
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/2828 Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2188181 Tested: with xfstests and bz reproducer Signed-off-by: Pavel Reichl <preichl@redhat.com> Omitted-fix: 5cadfbd5a11e5495cac217534c5f788168b1afd7 Omitting fix as this is basically the 1st patch of this MR. Approved-by: Miklos Szeredi <mszeredi@redhat.com> Approved-by: Carlos Maiolino <cmaiolino@redhat.com> Signed-off-by: Herton R. Krzesinski <herton@redhat.com>
This commit is contained in:
commit
28876ec068
|
@ -1500,7 +1500,7 @@ static int fuse_notify_inval_entry(struct fuse_conn *fc, unsigned int size,
|
|||
buf[outarg.namelen] = 0;
|
||||
|
||||
down_read(&fc->killsb);
|
||||
err = fuse_reverse_inval_entry(fc, outarg.parent, 0, &name);
|
||||
err = fuse_reverse_inval_entry(fc, outarg.parent, 0, &name, outarg.flags);
|
||||
up_read(&fc->killsb);
|
||||
kfree(buf);
|
||||
return err;
|
||||
|
@ -1548,7 +1548,7 @@ static int fuse_notify_delete(struct fuse_conn *fc, unsigned int size,
|
|||
buf[outarg.namelen] = 0;
|
||||
|
||||
down_read(&fc->killsb);
|
||||
err = fuse_reverse_inval_entry(fc, outarg.parent, outarg.child, &name);
|
||||
err = fuse_reverse_inval_entry(fc, outarg.parent, outarg.child, &name, 0);
|
||||
up_read(&fc->killsb);
|
||||
kfree(buf);
|
||||
return err;
|
||||
|
|
|
@ -1156,7 +1156,7 @@ int fuse_update_attributes(struct inode *inode, struct file *file)
|
|||
}
|
||||
|
||||
int fuse_reverse_inval_entry(struct fuse_conn *fc, u64 parent_nodeid,
|
||||
u64 child_nodeid, struct qstr *name)
|
||||
u64 child_nodeid, struct qstr *name, u32 flags)
|
||||
{
|
||||
int err = -ENOTDIR;
|
||||
struct inode *parent;
|
||||
|
@ -1183,7 +1183,9 @@ int fuse_reverse_inval_entry(struct fuse_conn *fc, u64 parent_nodeid,
|
|||
goto unlock;
|
||||
|
||||
fuse_dir_changed(parent);
|
||||
fuse_invalidate_entry(entry);
|
||||
if (!(flags & FUSE_EXPIRE_ONLY))
|
||||
d_invalidate(entry);
|
||||
fuse_invalidate_entry_cache(entry);
|
||||
|
||||
if (child_nodeid != 0 && d_really_is_positive(entry)) {
|
||||
inode_lock(d_inode(entry));
|
||||
|
|
|
@ -1195,7 +1195,7 @@ int fuse_reverse_inval_inode(struct fuse_conn *fc, u64 nodeid,
|
|||
* then the dentry is unhashed (d_delete()).
|
||||
*/
|
||||
int fuse_reverse_inval_entry(struct fuse_conn *fc, u64 parent_nodeid,
|
||||
u64 child_nodeid, struct qstr *name);
|
||||
u64 child_nodeid, struct qstr *name, u32 flags);
|
||||
|
||||
int fuse_do_open(struct fuse_mount *fm, u64 nodeid, struct file *file,
|
||||
bool isdir);
|
||||
|
|
|
@ -1193,7 +1193,7 @@ void fuse_send_init(struct fuse_mount *fm)
|
|||
FUSE_ABORT_ERROR | FUSE_MAX_PAGES | FUSE_CACHE_SYMLINKS |
|
||||
FUSE_NO_OPENDIR_SUPPORT | FUSE_EXPLICIT_INVAL_DATA |
|
||||
FUSE_HANDLE_KILLPRIV_V2 | FUSE_SETXATTR_EXT | FUSE_INIT_EXT |
|
||||
FUSE_SECURITY_CTX;
|
||||
FUSE_SECURITY_CTX | FUSE_HAS_EXPIRE_ONLY;
|
||||
#ifdef CONFIG_FUSE_DAX
|
||||
if (fm->fc->dax)
|
||||
flags |= FUSE_MAP_ALIGNMENT;
|
||||
|
|
|
@ -193,6 +193,8 @@
|
|||
* - add flags2 to fuse_init_in and fuse_init_out
|
||||
* - add FUSE_SECURITY_CTX init flag
|
||||
* - add security context to create, mkdir, symlink, and mknod requests
|
||||
* - add FUSE_EXPIRE_ONLY flag to fuse_notify_inval_entry
|
||||
* - add FUSE_HAS_EXPIRE_ONLY
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_FUSE_H
|
||||
|
@ -353,6 +355,7 @@ struct fuse_file_lock {
|
|||
* FUSE_INIT_RESERVED: reserved, do not use
|
||||
* FUSE_SECURITY_CTX: add security context to create, mkdir, symlink, and
|
||||
* mknod
|
||||
* FUSE_HAS_EXPIRE_ONLY: kernel supports expiry-only entry invalidation
|
||||
*/
|
||||
#define FUSE_ASYNC_READ (1 << 0)
|
||||
#define FUSE_POSIX_LOCKS (1 << 1)
|
||||
|
@ -388,6 +391,7 @@ struct fuse_file_lock {
|
|||
#define FUSE_INIT_RESERVED (1 << 31)
|
||||
/* bits 32..63 get shifted down 32 bits into the flags2 field */
|
||||
#define FUSE_SECURITY_CTX (1ULL << 32)
|
||||
#define FUSE_HAS_EXPIRE_ONLY (1ULL << 35)
|
||||
|
||||
/**
|
||||
* CUSE INIT request/reply flags
|
||||
|
@ -485,6 +489,12 @@ struct fuse_file_lock {
|
|||
*/
|
||||
#define FUSE_SETXATTR_ACL_KILL_SGID (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 */
|
||||
|
@ -912,7 +922,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 {
|
||||
|
|
Loading…
Reference in New Issue