hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/fs/fuse/dir.c
....@@ -205,7 +205,7 @@
205205 if (inode && fuse_is_bad(inode))
206206 goto invalid;
207207 else if (time_before64(fuse_dentry_time(entry), get_jiffies_64()) ||
208
- (flags & (LOOKUP_EXCL | LOOKUP_REVAL))) {
208
+ (flags & (LOOKUP_EXCL | LOOKUP_REVAL | LOOKUP_RENAME_TARGET))) {
209209 struct fuse_entry_out outarg;
210210 FUSE_ARGS(args);
211211 struct fuse_forget_link *forget;
....@@ -249,7 +249,7 @@
249249 spin_unlock(&fi->lock);
250250 }
251251 kfree(forget);
252
- if (ret == -ENOMEM)
252
+ if (ret == -ENOMEM || ret == -EINTR)
253253 goto out;
254254 if (ret || fuse_invalid_attr(&outarg.attr) ||
255255 fuse_stale_inode(inode, outarg.generation, &outarg.attr))
....@@ -578,6 +578,7 @@
578578 struct fuse_entry_out outentry;
579579 struct fuse_inode *fi;
580580 struct fuse_file *ff;
581
+ bool trunc = flags & O_TRUNC;
581582
582583 /* Userspace expects S_IFREG in create mode */
583584 BUG_ON((mode & S_IFMT) != S_IFREG);
....@@ -646,6 +647,10 @@
646647 } else {
647648 file->private_data = ff;
648649 fuse_finish_open(inode, file);
650
+ if (fm->fc->atomic_o_trunc && trunc)
651
+ truncate_pagecache(inode, 0);
652
+ else if (!(ff->open_flags & FOPEN_KEEP_CACHE))
653
+ invalidate_inode_pages2(inode->i_mapping);
649654 }
650655 return err;
651656