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