.. | .. |
---|
205 | 205 | if (inode && fuse_is_bad(inode)) |
---|
206 | 206 | goto invalid; |
---|
207 | 207 | 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))) { |
---|
209 | 209 | struct fuse_entry_out outarg; |
---|
210 | 210 | FUSE_ARGS(args); |
---|
211 | 211 | struct fuse_forget_link *forget; |
---|
.. | .. |
---|
249 | 249 | spin_unlock(&fi->lock); |
---|
250 | 250 | } |
---|
251 | 251 | kfree(forget); |
---|
252 | | - if (ret == -ENOMEM) |
---|
| 252 | + if (ret == -ENOMEM || ret == -EINTR) |
---|
253 | 253 | goto out; |
---|
254 | 254 | if (ret || fuse_invalid_attr(&outarg.attr) || |
---|
255 | 255 | fuse_stale_inode(inode, outarg.generation, &outarg.attr)) |
---|
.. | .. |
---|
578 | 578 | struct fuse_entry_out outentry; |
---|
579 | 579 | struct fuse_inode *fi; |
---|
580 | 580 | struct fuse_file *ff; |
---|
| 581 | + bool trunc = flags & O_TRUNC; |
---|
581 | 582 | |
---|
582 | 583 | /* Userspace expects S_IFREG in create mode */ |
---|
583 | 584 | BUG_ON((mode & S_IFMT) != S_IFREG); |
---|
.. | .. |
---|
646 | 647 | } else { |
---|
647 | 648 | file->private_data = ff; |
---|
648 | 649 | 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); |
---|
649 | 654 | } |
---|
650 | 655 | return err; |
---|
651 | 656 | |
---|