hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/fs/fuse/file.c
....@@ -206,14 +206,10 @@
206206 fi->attr_version = atomic64_inc_return(&fc->attr_version);
207207 i_size_write(inode, 0);
208208 spin_unlock(&fi->lock);
209
- truncate_pagecache(inode, 0);
210209 fuse_invalidate_attr(inode);
211210 if (fc->writeback_cache)
212211 file_update_time(file);
213
- } else if (!(ff->open_flags & FOPEN_KEEP_CACHE)) {
214
- invalidate_inode_pages2(inode->i_mapping);
215212 }
216
-
217213 if ((file->f_mode & FMODE_WRITE) && fc->writeback_cache)
218214 fuse_link_write_file(file);
219215 }
....@@ -236,30 +232,39 @@
236232 if (err)
237233 return err;
238234
239
- if (is_wb_truncate || dax_truncate) {
235
+ if (is_wb_truncate || dax_truncate)
240236 inode_lock(inode);
241
- fuse_set_nowrite(inode);
242
- }
243237
244238 if (dax_truncate) {
245239 down_write(&get_fuse_inode(inode)->i_mmap_sem);
246240 err = fuse_dax_break_layouts(inode, 0, 0);
247241 if (err)
248
- goto out;
242
+ goto out_inode_unlock;
249243 }
244
+
245
+ if (is_wb_truncate || dax_truncate)
246
+ fuse_set_nowrite(inode);
250247
251248 err = fuse_do_open(fm, get_node_id(inode), file, isdir);
252249 if (!err)
253250 fuse_finish_open(inode, file);
254251
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
+ }
256262 if (dax_truncate)
257263 up_write(&get_fuse_inode(inode)->i_mmap_sem);
258264
259
- if (is_wb_truncate | dax_truncate) {
260
- fuse_release_nowrite(inode);
265
+out_inode_unlock:
266
+ if (is_wb_truncate || dax_truncate)
261267 inode_unlock(inode);
262
- }
263268
264269 return err;
265270 }
....@@ -784,7 +789,7 @@
784789 struct fuse_inode *fi = get_fuse_inode(inode);
785790
786791 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 &&
788793 !test_bit(FUSE_I_SIZE_UNSTABLE, &fi->state)) {
789794 fi->attr_version = atomic64_inc_return(&fc->attr_version);
790795 i_size_write(inode, size);