@@ -847,7 +847,7 @@ static ssize_t gfs2_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
847
847
struct file * file = iocb -> ki_filp ;
848
848
struct inode * inode = file_inode (file );
849
849
struct gfs2_inode * ip = GFS2_I (inode );
850
- ssize_t written = 0 , ret ;
850
+ ssize_t ret ;
851
851
852
852
ret = gfs2_rsqa_alloc (ip );
853
853
if (ret )
@@ -867,68 +867,58 @@ static ssize_t gfs2_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
867
867
inode_lock (inode );
868
868
ret = generic_write_checks (iocb , from );
869
869
if (ret <= 0 )
870
- goto out ;
871
-
872
- /* We can write back this queue in page reclaim */
873
- current -> backing_dev_info = inode_to_bdi (inode );
870
+ goto out_unlock ;
874
871
875
872
ret = file_remove_privs (file );
876
873
if (ret )
877
- goto out2 ;
874
+ goto out_unlock ;
878
875
879
876
ret = file_update_time (file );
880
877
if (ret )
881
- goto out2 ;
878
+ goto out_unlock ;
882
879
883
880
if (iocb -> ki_flags & IOCB_DIRECT ) {
884
881
struct address_space * mapping = file -> f_mapping ;
885
- loff_t pos , endbyte ;
886
- ssize_t buffered ;
882
+ ssize_t buffered , ret2 ;
887
883
888
- written = gfs2_file_direct_write (iocb , from );
889
- if (written < 0 || !iov_iter_count (from ))
890
- goto out2 ;
884
+ ret = gfs2_file_direct_write (iocb , from );
885
+ if (ret < 0 || !iov_iter_count (from ))
886
+ goto out_unlock ;
891
887
892
- ret = iomap_file_buffered_write (iocb , from , & gfs2_iomap_ops );
893
- if (unlikely (ret < 0 ))
894
- goto out2 ;
895
- buffered = ret ;
888
+ iocb -> ki_flags |= IOCB_DSYNC ;
889
+ current -> backing_dev_info = inode_to_bdi (inode );
890
+ buffered = iomap_file_buffered_write (iocb , from , & gfs2_iomap_ops );
891
+ current -> backing_dev_info = NULL ;
892
+ if (unlikely (buffered <= 0 ))
893
+ goto out_unlock ;
896
894
897
895
/*
898
896
* We need to ensure that the page cache pages are written to
899
897
* disk and invalidated to preserve the expected O_DIRECT
900
- * semantics.
898
+ * semantics. If the writeback or invalidate fails, only report
899
+ * the direct I/O range as we don't know if the buffered pages
900
+ * made it to disk.
901
901
*/
902
- pos = iocb -> ki_pos ;
903
- endbyte = pos + buffered - 1 ;
904
- ret = filemap_write_and_wait_range (mapping , pos , endbyte );
905
- if (!ret ) {
906
- iocb -> ki_pos += buffered ;
907
- written += buffered ;
908
- invalidate_mapping_pages (mapping ,
909
- pos >> PAGE_SHIFT ,
910
- endbyte >> PAGE_SHIFT );
911
- } else {
912
- /*
913
- * We don't know how much we wrote, so just return
914
- * the number of bytes which were direct-written
915
- */
916
- }
902
+ iocb -> ki_pos += buffered ;
903
+ ret2 = generic_write_sync (iocb , buffered );
904
+ invalidate_mapping_pages (mapping ,
905
+ (iocb -> ki_pos - buffered ) >> PAGE_SHIFT ,
906
+ (iocb -> ki_pos - 1 ) >> PAGE_SHIFT );
907
+ if (!ret || ret2 > 0 )
908
+ ret += ret2 ;
917
909
} else {
910
+ current -> backing_dev_info = inode_to_bdi (inode );
918
911
ret = iomap_file_buffered_write (iocb , from , & gfs2_iomap_ops );
919
- if (likely (ret > 0 ))
912
+ current -> backing_dev_info = NULL ;
913
+ if (likely (ret > 0 )) {
920
914
iocb -> ki_pos += ret ;
915
+ ret = generic_write_sync (iocb , ret );
916
+ }
921
917
}
922
918
923
- out2 :
924
- current -> backing_dev_info = NULL ;
925
- out :
919
+ out_unlock :
926
920
inode_unlock (inode );
927
- if (likely (ret > 0 )) {
928
- /* Handle various SYNC-type writes */
929
- ret = generic_write_sync (iocb , ret );
930
- }
931
- return written ? written : ret ;
921
+ return ret ;
932
922
}
933
923
934
924
static int fallocate_chunk (struct inode * inode , loff_t offset , loff_t len ,
0 commit comments