| .. | .. |
|---|
| 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 | |
|---|