fuse: add "expire only" mode to FUSE_NOTIFY_INVAL_ENTRY
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2188181 Tested: with xfstests and bz reproducer Upstream Status: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git Signed-off-by: Pavel Reichl <preichl@redhat.com> Add a flag to entry expiration that lets the filesystem expire a dentry without kicking it out from the cache immediately. 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. Suggested-by: Jakob Blomer <jblomer@cern.ch> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com> (cherry picked from commit 4f8d37020e1fd0bf6ee9381ba918135ef3712efd)
This commit is contained in:
parent
25aee6f2c3
commit
328cc1ffc2
|
@ -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;
|
||||
|
|
|
@ -1151,7 +1151,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;
|
||||
|
@ -1178,7 +1178,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));
|
||||
|
|
|
@ -1176,7 +1176,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);
|
||||
|
|
|
@ -193,6 +193,7 @@
|
|||
* - 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
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_FUSE_H
|
||||
|
@ -483,6 +484,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 */
|
||||
|
@ -910,7 +917,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