diff options
author | Miklos Szeredi <mszeredi@redhat.com> | 2022-10-28 14:25:21 +0200 |
---|---|---|
committer | Miklos Szeredi <mszeredi@redhat.com> | 2022-11-23 09:10:49 +0100 |
commit | 4f8d37020e1fd0bf6ee9381ba918135ef3712efd (patch) | |
tree | a6c3cf5367f2973ebf939dff329fb23a698ead77 /fs/fuse/dir.c | |
parent | a1db2f7edef095a385d477ab81e780694d63eebd (diff) | |
download | linux-stable-4f8d37020e1fd0bf6ee9381ba918135ef3712efd.tar.gz linux-stable-4f8d37020e1fd0bf6ee9381ba918135ef3712efd.tar.bz2 linux-stable-4f8d37020e1fd0bf6ee9381ba918135ef3712efd.zip |
fuse: add "expire only" mode to FUSE_NOTIFY_INVAL_ENTRY
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>
Diffstat (limited to 'fs/fuse/dir.c')
-rw-r--r-- | fs/fuse/dir.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index bb97a384dc5d..d092c7d75929 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -1170,7 +1170,7 @@ int fuse_update_attributes(struct inode *inode, struct file *file, u32 mask) } 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; @@ -1197,7 +1197,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)); |