diff options
-rw-r--r-- | fs/fuse/dir.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 7490db141dd9..3d3afa7ea57c 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -1703,14 +1703,22 @@ error: static int fuse_setattr(struct dentry *entry, struct iattr *attr) { struct inode *inode = d_inode(entry); + int ret; if (!fuse_allow_current_process(get_fuse_conn(inode))) return -EACCES; if (attr->ia_valid & ATTR_FILE) - return fuse_do_setattr(inode, attr, attr->ia_file); + ret = fuse_do_setattr(inode, attr, attr->ia_file); else - return fuse_do_setattr(inode, attr, NULL); + ret = fuse_do_setattr(inode, attr, NULL); + + if (!ret) { + /* Directory mode changed, may need to revalidate access */ + if (d_is_dir(entry) && (attr->ia_valid & ATTR_MODE)) + fuse_invalidate_entry_cache(entry); + } + return ret; } static int fuse_getattr(struct vfsmount *mnt, struct dentry *entry, |