@@ -26,8 +26,6 @@ enum netfs_how_to_modify {
2626 NETFS_FLUSH_CONTENT , /* Flush incompatible content. */
2727};
2828
29- static void netfs_cleanup_buffered_write (struct netfs_io_request * wreq );
30-
3129static void netfs_set_group (struct folio * folio , struct netfs_group * netfs_group )
3230{
3331 void * priv = folio_get_private (folio );
@@ -180,7 +178,7 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter,
180178 };
181179 struct netfs_io_request * wreq = NULL ;
182180 struct netfs_folio * finfo ;
183- struct folio * folio ;
181+ struct folio * folio , * writethrough = NULL ;
184182 enum netfs_how_to_modify howto ;
185183 enum netfs_folio_trace trace ;
186184 unsigned int bdp_flags = (iocb -> ki_flags & IOCB_SYNC ) ? 0 : BDP_ASYNC ;
@@ -209,7 +207,6 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter,
209207 }
210208 if (!is_sync_kiocb (iocb ))
211209 wreq -> iocb = iocb ;
212- wreq -> cleanup = netfs_cleanup_buffered_write ;
213210 netfs_stat (& netfs_n_wh_writethrough );
214211 } else {
215212 netfs_stat (& netfs_n_wh_buffered_write );
@@ -253,6 +250,16 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter,
253250 offset = pos & (flen - 1 );
254251 part = min_t (size_t , flen - offset , part );
255252
253+ /* Wait for writeback to complete. The writeback engine owns
254+ * the info in folio->private and may change it until it
255+ * removes the WB mark.
256+ */
257+ if (folio_get_private (folio ) &&
258+ folio_wait_writeback_killable (folio )) {
259+ ret = written ? - EINTR : - ERESTARTSYS ;
260+ goto error_folio_unlock ;
261+ }
262+
256263 if (signal_pending (current )) {
257264 ret = written ? - EINTR : - ERESTARTSYS ;
258265 goto error_folio_unlock ;
@@ -327,6 +334,7 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter,
327334 maybe_trouble = true;
328335 iov_iter_revert (iter , copied );
329336 copied = 0 ;
337+ folio_unlock (folio );
330338 goto retry ;
331339 }
332340 netfs_set_group (folio , netfs_group );
@@ -382,23 +390,14 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter,
382390
383391 if (likely (!wreq )) {
384392 folio_mark_dirty (folio );
393+ folio_unlock (folio );
385394 } else {
386- if (folio_test_dirty (folio ))
387- /* Sigh. mmap. */
388- folio_clear_dirty_for_io (folio );
389- /* We make multiple writes to the folio... */
390- if (!folio_test_writeback (folio )) {
391- folio_start_writeback (folio );
392- if (wreq -> iter .count == 0 )
393- trace_netfs_folio (folio , netfs_folio_trace_wthru );
394- else
395- trace_netfs_folio (folio , netfs_folio_trace_wthru_plus );
396- }
397- netfs_advance_writethrough (wreq , copied ,
398- offset + copied == flen );
395+ netfs_advance_writethrough (wreq , & wbc , folio , copied ,
396+ offset + copied == flen ,
397+ & writethrough );
398+ /* Folio unlocked */
399399 }
400400 retry :
401- folio_unlock (folio );
402401 folio_put (folio );
403402 folio = NULL ;
404403
@@ -407,7 +406,7 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter,
407406
408407out :
409408 if (unlikely (wreq )) {
410- ret2 = netfs_end_writethrough (wreq , iocb );
409+ ret2 = netfs_end_writethrough (wreq , & wbc , writethrough );
411410 wbc_detach_inode (& wbc );
412411 if (ret2 == - EIOCBQUEUED )
413412 return ret2 ;
@@ -529,11 +528,13 @@ vm_fault_t netfs_page_mkwrite(struct vm_fault *vmf, struct netfs_group *netfs_gr
529528
530529 sb_start_pagefault (inode -> i_sb );
531530
532- if (folio_wait_writeback_killable (folio ))
531+ if (folio_lock_killable (folio ) < 0 )
533532 goto out ;
534533
535- if (folio_lock_killable (folio ) < 0 )
534+ if (folio_wait_writeback_killable (folio )) {
535+ ret = VM_FAULT_LOCKED ;
536536 goto out ;
537+ }
537538
538539 /* Can we see a streaming write here? */
539540 if (WARN_ON (!folio_test_uptodate (folio ))) {
@@ -573,6 +574,7 @@ vm_fault_t netfs_page_mkwrite(struct vm_fault *vmf, struct netfs_group *netfs_gr
573574}
574575EXPORT_SYMBOL (netfs_page_mkwrite );
575576
577+ #if 0 // TODO: Remove
576578/*
577579 * Kill all the pages in the given range
578580 */
@@ -1199,3 +1201,4 @@ int netfs_writepages(struct address_space *mapping,
11991201 return ret ;
12001202}
12011203EXPORT_SYMBOL (netfs_writepages );
1204+ #endif
0 commit comments