4
4
* Portions Copyright (C) Christoph Hellwig, 2001-2002
5
5
*/
6
6
7
+ #include <linux/blkdev.h>
7
8
#include <linux/fs.h>
8
9
#include <linux/mm.h>
9
10
#include <linux/module.h>
@@ -321,23 +322,25 @@ static void last_write_complete(struct page *page)
321
322
322
323
static void metapage_write_end_io (struct bio * bio )
323
324
{
324
- struct page * page = bio -> bi_private ;
325
+ struct folio * folio = bio -> bi_private ;
325
326
326
- BUG_ON (!PagePrivate ( page ) );
327
+ BUG_ON (!folio -> private );
327
328
328
329
if (bio -> bi_status ) {
330
+ int err = blk_status_to_errno (bio -> bi_status );
329
331
printk (KERN_ERR "metapage_write_end_io: I/O error\n" );
330
- SetPageError ( page );
332
+ mapping_set_error ( folio -> mapping , err );
331
333
}
332
- dec_io (page , last_write_complete );
334
+ dec_io (& folio -> page , last_write_complete );
333
335
bio_put (bio );
334
336
}
335
337
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 )
337
340
{
338
341
struct bio * bio = NULL ;
339
342
int block_offset ; /* block offset of mp within page */
340
- struct inode * inode = page -> mapping -> host ;
343
+ struct inode * inode = folio -> mapping -> host ;
341
344
int blocks_per_mp = JFS_SBI (inode -> i_sb )-> nbperpage ;
342
345
int len ;
343
346
int xlen ;
@@ -353,14 +356,13 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc)
353
356
int offset ;
354
357
int bad_blocks = 0 ;
355
358
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 );
361
363
362
364
for (offset = 0 ; offset < PAGE_SIZE ; offset += PSIZE ) {
363
- mp = page_to_mp (page , offset );
365
+ mp = page_to_mp (& folio -> page , offset );
364
366
365
367
if (!mp || !test_bit (META_dirty , & mp -> flag ))
366
368
continue ;
@@ -389,22 +391,20 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc)
389
391
continue ;
390
392
}
391
393
/* 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 );
395
395
/*
396
396
* Increment counter before submitting i/o to keep
397
397
* count from hitting zero before we're through
398
398
*/
399
- inc_io (page );
399
+ inc_io (& folio -> page );
400
400
if (!bio -> bi_iter .bi_size )
401
401
goto dump_bio ;
402
402
submit_bio (bio );
403
403
nr_underway ++ ;
404
404
bio = NULL ;
405
405
} 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 ;
408
408
pblock = metapage_get_blocks (inode , lblock , & xlen );
409
409
if (!pblock ) {
410
410
printk (KERN_ERR "JFS: metapage_get_blocks failed\n" );
@@ -420,7 +420,7 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc)
420
420
bio = bio_alloc (inode -> i_sb -> s_bdev , 1 , REQ_OP_WRITE , GFP_NOFS );
421
421
bio -> bi_iter .bi_sector = pblock << (inode -> i_blkbits - 9 );
422
422
bio -> bi_end_io = metapage_write_end_io ;
423
- bio -> bi_private = page ;
423
+ bio -> bi_private = folio ;
424
424
425
425
/* Don't call bio_add_page yet, we may add to this vec */
426
426
bio_offset = offset ;
@@ -430,43 +430,50 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc)
430
430
next_block = lblock + len ;
431
431
}
432
432
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 );
435
434
if (!bio -> bi_iter .bi_size )
436
435
goto dump_bio ;
437
436
438
437
submit_bio (bio );
439
438
nr_underway ++ ;
440
439
}
441
440
if (redirty )
442
- redirty_page_for_writepage (wbc , page );
441
+ folio_redirty_for_writepage (wbc , folio );
443
442
444
- unlock_page ( page );
443
+ folio_unlock ( folio );
445
444
446
445
if (bad_blocks )
447
446
goto err_out ;
448
447
449
448
if (nr_underway == 0 )
450
- end_page_writeback ( page );
449
+ folio_end_writeback ( folio );
451
450
452
451
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 ;
457
452
dump_bio :
458
453
print_hex_dump (KERN_ERR , "JFS: dump of bio: " , DUMP_PREFIX_ADDRESS , 16 ,
459
454
4 , bio , sizeof (* bio ), 0 );
460
- skip :
461
455
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 );
464
458
err_out :
465
459
while (bad_blocks -- )
466
- dec_io (page , last_write_complete );
460
+ dec_io (& folio -> page , last_write_complete );
467
461
return - EIO ;
468
462
}
469
463
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
+
470
477
static int metapage_read_folio (struct file * fp , struct folio * folio )
471
478
{
472
479
struct inode * inode = folio -> mapping -> host ;
@@ -556,7 +563,7 @@ static void metapage_invalidate_folio(struct folio *folio, size_t offset,
556
563
557
564
const struct address_space_operations jfs_metapage_aops = {
558
565
.read_folio = metapage_read_folio ,
559
- .writepage = metapage_writepage ,
566
+ .writepages = metapage_writepages ,
560
567
.release_folio = metapage_release_folio ,
561
568
.invalidate_folio = metapage_invalidate_folio ,
562
569
.dirty_folio = filemap_dirty_folio ,
@@ -698,7 +705,7 @@ static int metapage_write_one(struct page *page)
698
705
699
706
if (folio_clear_dirty_for_io (folio )) {
700
707
folio_get (folio );
701
- ret = metapage_writepage ( page , & wbc );
708
+ ret = metapage_write_folio ( folio , & wbc , NULL );
702
709
if (ret == 0 )
703
710
folio_wait_writeback (folio );
704
711
folio_put (folio );
0 commit comments