44 * Portions Copyright (C) Christoph Hellwig, 2001-2002
55 */
66
7+ #include <linux/blkdev.h>
78#include <linux/fs.h>
89#include <linux/mm.h>
910#include <linux/module.h>
@@ -321,23 +322,25 @@ static void last_write_complete(struct page *page)
321322
322323static void metapage_write_end_io (struct bio * bio )
323324{
324- struct page * page = bio -> bi_private ;
325+ struct folio * folio = bio -> bi_private ;
325326
326- BUG_ON (!PagePrivate ( page ) );
327+ BUG_ON (!folio -> private );
327328
328329 if (bio -> bi_status ) {
330+ int err = blk_status_to_errno (bio -> bi_status );
329331 printk (KERN_ERR "metapage_write_end_io: I/O error\n" );
330- SetPageError ( page );
332+ mapping_set_error ( folio -> mapping , err );
331333 }
332- dec_io (page , last_write_complete );
334+ dec_io (& folio -> page , last_write_complete );
333335 bio_put (bio );
334336}
335337
336- static int metapage_writepage (struct page * page , struct writeback_control * wbc )
338+ static int metapage_write_folio (struct folio * folio ,
339+ struct writeback_control * wbc , void * unused )
337340{
338341 struct bio * bio = NULL ;
339342 int block_offset ; /* block offset of mp within page */
340- struct inode * inode = page -> mapping -> host ;
343+ struct inode * inode = folio -> mapping -> host ;
341344 int blocks_per_mp = JFS_SBI (inode -> i_sb )-> nbperpage ;
342345 int len ;
343346 int xlen ;
@@ -353,14 +356,13 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc)
353356 int offset ;
354357 int bad_blocks = 0 ;
355358
356- page_start = (sector_t )page -> index <<
357- (PAGE_SHIFT - inode -> i_blkbits );
358- BUG_ON (!PageLocked (page ));
359- BUG_ON (PageWriteback (page ));
360- set_page_writeback (page );
359+ page_start = folio_pos (folio ) >> inode -> i_blkbits ;
360+ BUG_ON (!folio_test_locked (folio ));
361+ BUG_ON (folio_test_writeback (folio ));
362+ folio_start_writeback (folio );
361363
362364 for (offset = 0 ; offset < PAGE_SIZE ; offset += PSIZE ) {
363- mp = page_to_mp (page , offset );
365+ mp = page_to_mp (& folio -> page , offset );
364366
365367 if (!mp || !test_bit (META_dirty , & mp -> flag ))
366368 continue ;
@@ -389,22 +391,20 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc)
389391 continue ;
390392 }
391393 /* Not contiguous */
392- if (bio_add_page (bio , page , bio_bytes , bio_offset ) <
393- bio_bytes )
394- goto add_failed ;
394+ bio_add_folio_nofail (bio , folio , bio_bytes , bio_offset );
395395 /*
396396 * Increment counter before submitting i/o to keep
397397 * count from hitting zero before we're through
398398 */
399- inc_io (page );
399+ inc_io (& folio -> page );
400400 if (!bio -> bi_iter .bi_size )
401401 goto dump_bio ;
402402 submit_bio (bio );
403403 nr_underway ++ ;
404404 bio = NULL ;
405405 } else
406- inc_io (page );
407- xlen = (PAGE_SIZE - offset ) >> inode -> i_blkbits ;
406+ inc_io (& folio -> page );
407+ xlen = (folio_size ( folio ) - offset ) >> inode -> i_blkbits ;
408408 pblock = metapage_get_blocks (inode , lblock , & xlen );
409409 if (!pblock ) {
410410 printk (KERN_ERR "JFS: metapage_get_blocks failed\n" );
@@ -420,7 +420,7 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc)
420420 bio = bio_alloc (inode -> i_sb -> s_bdev , 1 , REQ_OP_WRITE , GFP_NOFS );
421421 bio -> bi_iter .bi_sector = pblock << (inode -> i_blkbits - 9 );
422422 bio -> bi_end_io = metapage_write_end_io ;
423- bio -> bi_private = page ;
423+ bio -> bi_private = folio ;
424424
425425 /* Don't call bio_add_page yet, we may add to this vec */
426426 bio_offset = offset ;
@@ -430,43 +430,50 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc)
430430 next_block = lblock + len ;
431431 }
432432 if (bio ) {
433- if (bio_add_page (bio , page , bio_bytes , bio_offset ) < bio_bytes )
434- goto add_failed ;
433+ bio_add_folio_nofail (bio , folio , bio_bytes , bio_offset );
435434 if (!bio -> bi_iter .bi_size )
436435 goto dump_bio ;
437436
438437 submit_bio (bio );
439438 nr_underway ++ ;
440439 }
441440 if (redirty )
442- redirty_page_for_writepage (wbc , page );
441+ folio_redirty_for_writepage (wbc , folio );
443442
444- unlock_page ( page );
443+ folio_unlock ( folio );
445444
446445 if (bad_blocks )
447446 goto err_out ;
448447
449448 if (nr_underway == 0 )
450- end_page_writeback ( page );
449+ folio_end_writeback ( folio );
451450
452451 return 0 ;
453- add_failed :
454- /* We should never reach here, since we're only adding one vec */
455- printk (KERN_ERR "JFS: bio_add_page failed unexpectedly\n" );
456- goto skip ;
457452dump_bio :
458453 print_hex_dump (KERN_ERR , "JFS: dump of bio: " , DUMP_PREFIX_ADDRESS , 16 ,
459454 4 , bio , sizeof (* bio ), 0 );
460- skip :
461455 bio_put (bio );
462- unlock_page ( page );
463- dec_io (page , last_write_complete );
456+ folio_unlock ( folio );
457+ dec_io (& folio -> page , last_write_complete );
464458err_out :
465459 while (bad_blocks -- )
466- dec_io (page , last_write_complete );
460+ dec_io (& folio -> page , last_write_complete );
467461 return - EIO ;
468462}
469463
464+ static int metapage_writepages (struct address_space * mapping ,
465+ struct writeback_control * wbc )
466+ {
467+ struct blk_plug plug ;
468+ int err ;
469+
470+ blk_start_plug (& plug );
471+ err = write_cache_pages (mapping , wbc , metapage_write_folio , NULL );
472+ blk_finish_plug (& plug );
473+
474+ return err ;
475+ }
476+
470477static int metapage_read_folio (struct file * fp , struct folio * folio )
471478{
472479 struct inode * inode = folio -> mapping -> host ;
@@ -556,7 +563,7 @@ static void metapage_invalidate_folio(struct folio *folio, size_t offset,
556563
557564const struct address_space_operations jfs_metapage_aops = {
558565 .read_folio = metapage_read_folio ,
559- .writepage = metapage_writepage ,
566+ .writepages = metapage_writepages ,
560567 .release_folio = metapage_release_folio ,
561568 .invalidate_folio = metapage_invalidate_folio ,
562569 .dirty_folio = filemap_dirty_folio ,
@@ -698,7 +705,7 @@ static int metapage_write_one(struct page *page)
698705
699706 if (folio_clear_dirty_for_io (folio )) {
700707 folio_get (folio );
701- ret = metapage_writepage ( page , & wbc );
708+ ret = metapage_write_folio ( folio , & wbc , NULL );
702709 if (ret == 0 )
703710 folio_wait_writeback (folio );
704711 folio_put (folio );
0 commit comments