.. | .. |
---|
206 | 206 | fi->attr_version = atomic64_inc_return(&fc->attr_version); |
---|
207 | 207 | i_size_write(inode, 0); |
---|
208 | 208 | spin_unlock(&fi->lock); |
---|
209 | | - truncate_pagecache(inode, 0); |
---|
210 | 209 | fuse_invalidate_attr(inode); |
---|
211 | 210 | if (fc->writeback_cache) |
---|
212 | 211 | file_update_time(file); |
---|
213 | | - } else if (!(ff->open_flags & FOPEN_KEEP_CACHE)) { |
---|
214 | | - invalidate_inode_pages2(inode->i_mapping); |
---|
215 | 212 | } |
---|
216 | | - |
---|
217 | 213 | if ((file->f_mode & FMODE_WRITE) && fc->writeback_cache) |
---|
218 | 214 | fuse_link_write_file(file); |
---|
219 | 215 | } |
---|
.. | .. |
---|
236 | 232 | if (err) |
---|
237 | 233 | return err; |
---|
238 | 234 | |
---|
239 | | - if (is_wb_truncate || dax_truncate) { |
---|
| 235 | + if (is_wb_truncate || dax_truncate) |
---|
240 | 236 | inode_lock(inode); |
---|
241 | | - fuse_set_nowrite(inode); |
---|
242 | | - } |
---|
243 | 237 | |
---|
244 | 238 | if (dax_truncate) { |
---|
245 | 239 | down_write(&get_fuse_inode(inode)->i_mmap_sem); |
---|
246 | 240 | err = fuse_dax_break_layouts(inode, 0, 0); |
---|
247 | 241 | if (err) |
---|
248 | | - goto out; |
---|
| 242 | + goto out_inode_unlock; |
---|
249 | 243 | } |
---|
| 244 | + |
---|
| 245 | + if (is_wb_truncate || dax_truncate) |
---|
| 246 | + fuse_set_nowrite(inode); |
---|
250 | 247 | |
---|
251 | 248 | err = fuse_do_open(fm, get_node_id(inode), file, isdir); |
---|
252 | 249 | if (!err) |
---|
253 | 250 | fuse_finish_open(inode, file); |
---|
254 | 251 | |
---|
255 | | -out: |
---|
| 252 | + if (is_wb_truncate || dax_truncate) |
---|
| 253 | + fuse_release_nowrite(inode); |
---|
| 254 | + if (!err) { |
---|
| 255 | + struct fuse_file *ff = file->private_data; |
---|
| 256 | + |
---|
| 257 | + if (fc->atomic_o_trunc && (file->f_flags & O_TRUNC)) |
---|
| 258 | + truncate_pagecache(inode, 0); |
---|
| 259 | + else if (!(ff->open_flags & FOPEN_KEEP_CACHE)) |
---|
| 260 | + invalidate_inode_pages2(inode->i_mapping); |
---|
| 261 | + } |
---|
256 | 262 | if (dax_truncate) |
---|
257 | 263 | up_write(&get_fuse_inode(inode)->i_mmap_sem); |
---|
258 | 264 | |
---|
259 | | - if (is_wb_truncate | dax_truncate) { |
---|
260 | | - fuse_release_nowrite(inode); |
---|
| 265 | +out_inode_unlock: |
---|
| 266 | + if (is_wb_truncate || dax_truncate) |
---|
261 | 267 | inode_unlock(inode); |
---|
262 | | - } |
---|
263 | 268 | |
---|
264 | 269 | return err; |
---|
265 | 270 | } |
---|
.. | .. |
---|
784 | 789 | struct fuse_inode *fi = get_fuse_inode(inode); |
---|
785 | 790 | |
---|
786 | 791 | spin_lock(&fi->lock); |
---|
787 | | - if (attr_ver == fi->attr_version && size < inode->i_size && |
---|
| 792 | + if (attr_ver >= fi->attr_version && size < inode->i_size && |
---|
788 | 793 | !test_bit(FUSE_I_SIZE_UNSTABLE, &fi->state)) { |
---|
789 | 794 | fi->attr_version = atomic64_inc_return(&fc->attr_version); |
---|
790 | 795 | i_size_write(inode, size); |
---|