1010#include <linux/blkdev.h>
1111#include <linux/swap.h>
1212#include <linux/version.h>
13+ #include <linux/writeback.h>
1314#include "extent_map.h"
1415
1516/* temporary define until extent_map moves out of btrfs */
@@ -35,6 +36,12 @@ struct tree_entry {
3536 struct rb_node rb_node ;
3637};
3738
39+ struct extent_page_data {
40+ struct bio * bio ;
41+ struct extent_map_tree * tree ;
42+ get_extent_t * get_extent ;
43+ };
44+
3845void __init extent_map_init (void )
3946{
4047 extent_map_cache = btrfs_cache_create ("extent_map" ,
@@ -1460,40 +1467,76 @@ static int end_bio_extent_preparewrite(struct bio *bio,
14601467#endif
14611468}
14621469
1463- static int submit_extent_page (int rw , struct extent_map_tree * tree ,
1464- struct page * page , sector_t sector ,
1465- size_t size , unsigned long offset ,
1466- struct block_device * bdev ,
1467- bio_end_io_t end_io_func )
1470+ static struct bio *
1471+ extent_bio_alloc (struct block_device * bdev , u64 first_sector , int nr_vecs ,
1472+ gfp_t gfp_flags )
14681473{
14691474 struct bio * bio ;
1470- int ret = 0 ;
14711475
1472- bio = bio_alloc (GFP_NOIO , 1 );
1476+ bio = bio_alloc (gfp_flags , nr_vecs );
14731477
1474- bio -> bi_sector = sector ;
1475- bio -> bi_bdev = bdev ;
1476- bio -> bi_io_vec [0 ].bv_page = page ;
1477- bio -> bi_io_vec [0 ].bv_len = size ;
1478- bio -> bi_io_vec [0 ].bv_offset = offset ;
1479-
1480- bio -> bi_vcnt = 1 ;
1481- bio -> bi_idx = 0 ;
1482- bio -> bi_size = size ;
1478+ if (bio == NULL && (current -> flags & PF_MEMALLOC )) {
1479+ while (!bio && (nr_vecs /= 2 ))
1480+ bio = bio_alloc (gfp_flags , nr_vecs );
1481+ }
14831482
1484- bio -> bi_end_io = end_io_func ;
1485- bio -> bi_private = tree ;
1483+ if (bio ) {
1484+ bio -> bi_bdev = bdev ;
1485+ bio -> bi_sector = first_sector ;
1486+ }
1487+ return bio ;
1488+ }
14861489
1490+ static int submit_one_bio (int rw , struct bio * bio )
1491+ {
1492+ int ret = 0 ;
14871493 bio_get (bio );
14881494 submit_bio (rw , bio );
1489-
14901495 if (bio_flagged (bio , BIO_EOPNOTSUPP ))
14911496 ret = - EOPNOTSUPP ;
1492-
14931497 bio_put (bio );
14941498 return ret ;
14951499}
14961500
1501+ static int submit_extent_page (int rw , struct extent_map_tree * tree ,
1502+ struct page * page , sector_t sector ,
1503+ size_t size , unsigned long offset ,
1504+ struct block_device * bdev ,
1505+ struct bio * * bio_ret ,
1506+ int max_pages ,
1507+ bio_end_io_t end_io_func )
1508+ {
1509+ int ret = 0 ;
1510+ struct bio * bio ;
1511+ int nr ;
1512+
1513+ if (bio_ret && * bio_ret ) {
1514+ bio = * bio_ret ;
1515+ if (bio -> bi_sector + (bio -> bi_size >> 9 ) != sector ||
1516+ bio_add_page (bio , page , size , offset ) < size ) {
1517+ ret = submit_one_bio (rw , bio );
1518+ bio = NULL ;
1519+ } else {
1520+ return 0 ;
1521+ }
1522+ }
1523+ nr = min (max_pages , bio_get_nr_vecs (bdev ));
1524+ bio = extent_bio_alloc (bdev , sector , nr , GFP_NOFS | __GFP_HIGH );
1525+ if (!bio ) {
1526+ printk ("failed to allocate bio nr %d\n" , nr );
1527+ }
1528+ bio_add_page (bio , page , size , offset );
1529+ bio -> bi_end_io = end_io_func ;
1530+ bio -> bi_private = tree ;
1531+ if (bio_ret ) {
1532+ * bio_ret = bio ;
1533+ } else {
1534+ ret = submit_one_bio (rw , bio );
1535+ }
1536+
1537+ return ret ;
1538+ }
1539+
14971540void set_page_extent_mapped (struct page * page )
14981541{
14991542 if (!PagePrivate (page )) {
@@ -1590,7 +1633,8 @@ int extent_read_full_page(struct extent_map_tree *tree, struct page *page,
15901633 if (!ret ) {
15911634 ret = submit_extent_page (READ , tree , page ,
15921635 sector , iosize , page_offset ,
1593- bdev , end_bio_extent_readpage );
1636+ bdev , NULL , 1 ,
1637+ end_bio_extent_readpage );
15941638 }
15951639 if (ret )
15961640 SetPageError (page );
@@ -1613,11 +1657,12 @@ EXPORT_SYMBOL(extent_read_full_page);
16131657 * are found, they are marked writeback. Then the lock bits are removed
16141658 * and the end_io handler clears the writeback ranges
16151659 */
1616- int extent_write_full_page (struct extent_map_tree * tree , struct page * page ,
1617- get_extent_t * get_extent ,
1618- struct writeback_control * wbc )
1660+ static int __extent_writepage (struct page * page , struct writeback_control * wbc ,
1661+ void * data )
16191662{
16201663 struct inode * inode = page -> mapping -> host ;
1664+ struct extent_page_data * epd = data ;
1665+ struct extent_map_tree * tree = epd -> tree ;
16211666 u64 start = (u64 )page -> index << PAGE_CACHE_SHIFT ;
16221667 u64 page_end = start + PAGE_CACHE_SIZE - 1 ;
16231668 u64 end ;
@@ -1691,7 +1736,7 @@ int extent_write_full_page(struct extent_map_tree *tree, struct page *page,
16911736 clear_extent_dirty (tree , cur , page_end , GFP_NOFS );
16921737 break ;
16931738 }
1694- em = get_extent (inode , page , page_offset , cur , end , 1 );
1739+ em = epd -> get_extent (inode , page , page_offset , cur , end , 1 );
16951740 if (IS_ERR (em ) || !em ) {
16961741 SetPageError (page );
16971742 break ;
@@ -1734,9 +1779,12 @@ int extent_write_full_page(struct extent_map_tree *tree, struct page *page,
17341779 if (ret )
17351780 SetPageError (page );
17361781 else {
1782+ unsigned long nr = end_index + 1 ;
17371783 set_range_writeback (tree , cur , cur + iosize - 1 );
1784+
17381785 ret = submit_extent_page (WRITE , tree , page , sector ,
17391786 iosize , page_offset , bdev ,
1787+ & epd -> bio , nr ,
17401788 end_bio_extent_writepage );
17411789 if (ret )
17421790 SetPageError (page );
@@ -1750,8 +1798,44 @@ int extent_write_full_page(struct extent_map_tree *tree, struct page *page,
17501798 unlock_page (page );
17511799 return 0 ;
17521800}
1801+
1802+ int extent_write_full_page (struct extent_map_tree * tree , struct page * page ,
1803+ get_extent_t * get_extent ,
1804+ struct writeback_control * wbc )
1805+ {
1806+ int ret ;
1807+ struct extent_page_data epd = {
1808+ .bio = NULL ,
1809+ .tree = tree ,
1810+ .get_extent = get_extent ,
1811+ };
1812+
1813+ ret = __extent_writepage (page , wbc , & epd );
1814+ if (epd .bio )
1815+ submit_one_bio (WRITE , epd .bio );
1816+ return ret ;
1817+ }
17531818EXPORT_SYMBOL (extent_write_full_page );
17541819
1820+ int extent_writepages (struct extent_map_tree * tree ,
1821+ struct address_space * mapping ,
1822+ get_extent_t * get_extent ,
1823+ struct writeback_control * wbc )
1824+ {
1825+ int ret ;
1826+ struct extent_page_data epd = {
1827+ .bio = NULL ,
1828+ .tree = tree ,
1829+ .get_extent = get_extent ,
1830+ };
1831+
1832+ ret = write_cache_pages (mapping , wbc , __extent_writepage , & epd );
1833+ if (epd .bio )
1834+ submit_one_bio (WRITE , epd .bio );
1835+ return ret ;
1836+ }
1837+ EXPORT_SYMBOL (extent_writepages );
1838+
17551839/*
17561840 * basic invalidatepage code, this waits on any locked or writeback
17571841 * ranges corresponding to the page, and then deletes any extent state
@@ -1869,6 +1953,7 @@ int extent_prepare_write(struct extent_map_tree *tree,
18691953 EXTENT_LOCKED , 0 , NULL , GFP_NOFS );
18701954 ret = submit_extent_page (READ , tree , page ,
18711955 sector , iosize , page_offset , em -> bdev ,
1956+ NULL , 1 ,
18721957 end_bio_extent_preparewrite );
18731958 iocount ++ ;
18741959 block_start = block_start + iosize ;
0 commit comments