When a dentry exists for the path argument to an open with O_CREAT or a negative dentry exists for the path argument to any open, make a lookup request to the user-space daemon to verify the existence/non-existence of the path. This improves file open behavior for a FUSE filesystem where changes may be made without going through the mount point, such as a distributed filesystem accessed concurrently from multiple hosts. Specifically: - For an open with O_CREAT of a path with a cached dentry, the user-space daemon is able to report a recent unlink of a file allowing it to be re-created rather than either the open failing with EEXIST (when O_EXCL is used) or a FUSE open request causing the open to fail with ENOENT (when O_EXCL is not used). - For an open of a path with a cached negative dentry, the user-space daemon is able to report the recent creation of a file allowing it to be opened rather than the open failing with ENOENT. This is intended to be functionally equivalent to behavior in the NFS client which re-validates a cached dentry on file open. Signed-off-by: Kenneth C Schalk <kschalk@xxxxxxxxxx> --- fs/fuse/dir.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 5d43af1..eab0288 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -205,7 +205,8 @@ static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags) if (inode && is_bad_inode(inode)) goto invalid; else if (time_before64(fuse_dentry_time(entry), get_jiffies_64()) || - (flags & (LOOKUP_EXCL | LOOKUP_REVAL))) { + (!inode && (flags & LOOKUP_OPEN)) || + (flags & (LOOKUP_CREATE | LOOKUP_REVAL))) { struct fuse_entry_out outarg; FUSE_ARGS(args); struct fuse_forget_link *forget; -- 2.9.2