@@ -828,7 +828,7 @@ static int iomap_write_begin(struct iomap_iter *iter, loff_t pos,
828828 return status ;
829829}
830830
831- static size_t __iomap_write_end (struct inode * inode , loff_t pos , size_t len ,
831+ static bool __iomap_write_end (struct inode * inode , loff_t pos , size_t len ,
832832 size_t copied , struct folio * folio )
833833{
834834 flush_dcache_folio (folio );
@@ -845,14 +845,14 @@ static size_t __iomap_write_end(struct inode *inode, loff_t pos, size_t len,
845845 * redo the whole thing.
846846 */
847847 if (unlikely (copied < len && !folio_test_uptodate (folio )))
848- return 0 ;
848+ return false ;
849849 iomap_set_range_uptodate (folio , offset_in_folio (folio , pos ), len );
850850 iomap_set_range_dirty (folio , offset_in_folio (folio , pos ), copied );
851851 filemap_dirty_folio (inode -> i_mapping , folio );
852- return copied ;
852+ return true ;
853853}
854854
855- static size_t iomap_write_end_inline (const struct iomap_iter * iter ,
855+ static void iomap_write_end_inline (const struct iomap_iter * iter ,
856856 struct folio * folio , loff_t pos , size_t copied )
857857{
858858 const struct iomap * iomap = & iter -> iomap ;
@@ -867,20 +867,31 @@ static size_t iomap_write_end_inline(const struct iomap_iter *iter,
867867 kunmap_local (addr );
868868
869869 mark_inode_dirty (iter -> inode );
870- return copied ;
871870}
872871
873- /* Returns the number of bytes copied. May be 0. Cannot be an errno. */
874- static size_t iomap_write_end (struct iomap_iter * iter , loff_t pos , size_t len ,
872+ /*
873+ * Returns true if all copied bytes have been written to the pagecache,
874+ * otherwise return false.
875+ */
876+ static bool iomap_write_end (struct iomap_iter * iter , loff_t pos , size_t len ,
875877 size_t copied , struct folio * folio )
876878{
877879 const struct iomap * srcmap = iomap_iter_srcmap (iter );
878880
879- if (srcmap -> type == IOMAP_INLINE )
880- return iomap_write_end_inline (iter , folio , pos , copied );
881- if (srcmap -> flags & IOMAP_F_BUFFER_HEAD )
882- return block_write_end (NULL , iter -> inode -> i_mapping , pos , len ,
883- copied , & folio -> page , NULL );
881+ if (srcmap -> type == IOMAP_INLINE ) {
882+ iomap_write_end_inline (iter , folio , pos , copied );
883+ return true;
884+ }
885+
886+ if (srcmap -> flags & IOMAP_F_BUFFER_HEAD ) {
887+ size_t bh_written ;
888+
889+ bh_written = block_write_end (NULL , iter -> inode -> i_mapping , pos ,
890+ len , copied , & folio -> page , NULL );
891+ WARN_ON_ONCE (bh_written != copied && bh_written != 0 );
892+ return bh_written == copied ;
893+ }
894+
884895 return __iomap_write_end (iter -> inode , pos , len , copied , folio );
885896}
886897
@@ -945,7 +956,8 @@ static loff_t iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i)
945956 flush_dcache_folio (folio );
946957
947958 copied = copy_folio_from_iter_atomic (folio , offset , bytes , i );
948- written = iomap_write_end (iter , pos , bytes , copied , folio );
959+ written = iomap_write_end (iter , pos , bytes , copied , folio ) ?
960+ copied : 0 ;
949961
950962 /*
951963 * Update the in-memory inode size after copying the data into
@@ -1323,6 +1335,7 @@ static loff_t iomap_unshare_iter(struct iomap_iter *iter)
13231335 int status ;
13241336 size_t offset ;
13251337 size_t bytes = min_t (u64 , SIZE_MAX , length );
1338+ bool ret ;
13261339
13271340 status = iomap_write_begin (iter , pos , bytes , & folio );
13281341 if (unlikely (status ))
@@ -1334,9 +1347,9 @@ static loff_t iomap_unshare_iter(struct iomap_iter *iter)
13341347 if (bytes > folio_size (folio ) - offset )
13351348 bytes = folio_size (folio ) - offset ;
13361349
1337- bytes = iomap_write_end (iter , pos , bytes , bytes , folio );
1350+ ret = iomap_write_end (iter , pos , bytes , bytes , folio );
13381351 __iomap_put_folio (iter , pos , bytes , folio );
1339- if (WARN_ON_ONCE (bytes == 0 ))
1352+ if (WARN_ON_ONCE (! ret ))
13401353 return - EIO ;
13411354
13421355 cond_resched ();
@@ -1385,6 +1398,7 @@ static loff_t iomap_zero_iter(struct iomap_iter *iter, bool *did_zero)
13851398 int status ;
13861399 size_t offset ;
13871400 size_t bytes = min_t (u64 , SIZE_MAX , length );
1401+ bool ret ;
13881402
13891403 status = iomap_write_begin (iter , pos , bytes , & folio );
13901404 if (status )
@@ -1399,9 +1413,9 @@ static loff_t iomap_zero_iter(struct iomap_iter *iter, bool *did_zero)
13991413 folio_zero_range (folio , offset , bytes );
14001414 folio_mark_accessed (folio );
14011415
1402- bytes = iomap_write_end (iter , pos , bytes , bytes , folio );
1416+ ret = iomap_write_end (iter , pos , bytes , bytes , folio );
14031417 __iomap_put_folio (iter , pos , bytes , folio );
1404- if (WARN_ON_ONCE (bytes == 0 ))
1418+ if (WARN_ON_ONCE (! ret ))
14051419 return - EIO ;
14061420
14071421 pos += bytes ;
0 commit comments