diff options
-rw-r--r-- | fs/f2fs/checkpoint.c | 9 | ||||
-rw-r--r-- | fs/f2fs/data.c | 47 | ||||
-rw-r--r-- | fs/f2fs/f2fs.h | 18 | ||||
-rw-r--r-- | fs/f2fs/file.c | 2 | ||||
-rw-r--r-- | fs/f2fs/gc.c | 4 | ||||
-rw-r--r-- | fs/f2fs/inline.c | 4 | ||||
-rw-r--r-- | fs/f2fs/node.c | 8 | ||||
-rw-r--r-- | fs/f2fs/segment.c | 38 | ||||
-rw-r--r-- | fs/f2fs/super.c | 2 | ||||
-rw-r--r-- | fs/f2fs/trace.c | 6 | ||||
-rw-r--r-- | fs/f2fs/trace.h | 4 |
11 files changed, 83 insertions, 59 deletions
diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c index 72f64b314d2e..6dbff2b0bcd8 100644 --- a/fs/f2fs/checkpoint.c +++ b/fs/f2fs/checkpoint.c | |||
@@ -52,6 +52,7 @@ struct page *get_meta_page(struct f2fs_sb_info *sbi, pgoff_t index) | |||
52 | struct address_space *mapping = META_MAPPING(sbi); | 52 | struct address_space *mapping = META_MAPPING(sbi); |
53 | struct page *page; | 53 | struct page *page; |
54 | struct f2fs_io_info fio = { | 54 | struct f2fs_io_info fio = { |
55 | .sbi = sbi, | ||
55 | .type = META, | 56 | .type = META, |
56 | .rw = READ_SYNC | REQ_META | REQ_PRIO, | 57 | .rw = READ_SYNC | REQ_META | REQ_PRIO, |
57 | .blk_addr = index, | 58 | .blk_addr = index, |
@@ -65,7 +66,9 @@ repeat: | |||
65 | if (PageUptodate(page)) | 66 | if (PageUptodate(page)) |
66 | goto out; | 67 | goto out; |
67 | 68 | ||
68 | if (f2fs_submit_page_bio(sbi, page, &fio)) | 69 | fio.page = page; |
70 | |||
71 | if (f2fs_submit_page_bio(&fio)) | ||
69 | goto repeat; | 72 | goto repeat; |
70 | 73 | ||
71 | lock_page(page); | 74 | lock_page(page); |
@@ -117,6 +120,7 @@ int ra_meta_pages(struct f2fs_sb_info *sbi, block_t start, int nrpages, int type | |||
117 | struct page *page; | 120 | struct page *page; |
118 | block_t blkno = start; | 121 | block_t blkno = start; |
119 | struct f2fs_io_info fio = { | 122 | struct f2fs_io_info fio = { |
123 | .sbi = sbi, | ||
120 | .type = META, | 124 | .type = META, |
121 | .rw = READ_SYNC | REQ_META | REQ_PRIO | 125 | .rw = READ_SYNC | REQ_META | REQ_PRIO |
122 | }; | 126 | }; |
@@ -160,7 +164,8 @@ int ra_meta_pages(struct f2fs_sb_info *sbi, block_t start, int nrpages, int type | |||
160 | continue; | 164 | continue; |
161 | } | 165 | } |
162 | 166 | ||
163 | f2fs_submit_page_mbio(sbi, page, &fio); | 167 | fio.page = page; |
168 | f2fs_submit_page_mbio(&fio); | ||
164 | f2fs_put_page(page, 0); | 169 | f2fs_put_page(page, 0); |
165 | } | 170 | } |
166 | out: | 171 | out: |
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 2a3a9cd008da..81d1fd581078 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c | |||
@@ -158,16 +158,16 @@ void f2fs_submit_merged_bio(struct f2fs_sb_info *sbi, | |||
158 | * Fill the locked page with data located in the block address. | 158 | * Fill the locked page with data located in the block address. |
159 | * Return unlocked page. | 159 | * Return unlocked page. |
160 | */ | 160 | */ |
161 | int f2fs_submit_page_bio(struct f2fs_sb_info *sbi, struct page *page, | 161 | int f2fs_submit_page_bio(struct f2fs_io_info *fio) |
162 | struct f2fs_io_info *fio) | ||
163 | { | 162 | { |
164 | struct bio *bio; | 163 | struct bio *bio; |
164 | struct page *page = fio->page; | ||
165 | 165 | ||
166 | trace_f2fs_submit_page_bio(page, fio); | 166 | trace_f2fs_submit_page_bio(page, fio); |
167 | f2fs_trace_ios(page, fio, 0); | 167 | f2fs_trace_ios(fio, 0); |
168 | 168 | ||
169 | /* Allocate a new bio */ | 169 | /* Allocate a new bio */ |
170 | bio = __bio_alloc(sbi, fio->blk_addr, 1, is_read_io(fio->rw)); | 170 | bio = __bio_alloc(fio->sbi, fio->blk_addr, 1, is_read_io(fio->rw)); |
171 | 171 | ||
172 | if (bio_add_page(bio, page, PAGE_CACHE_SIZE, 0) < PAGE_CACHE_SIZE) { | 172 | if (bio_add_page(bio, page, PAGE_CACHE_SIZE, 0) < PAGE_CACHE_SIZE) { |
173 | bio_put(bio); | 173 | bio_put(bio); |
@@ -179,9 +179,9 @@ int f2fs_submit_page_bio(struct f2fs_sb_info *sbi, struct page *page, | |||
179 | return 0; | 179 | return 0; |
180 | } | 180 | } |
181 | 181 | ||
182 | void f2fs_submit_page_mbio(struct f2fs_sb_info *sbi, struct page *page, | 182 | void f2fs_submit_page_mbio(struct f2fs_io_info *fio) |
183 | struct f2fs_io_info *fio) | ||
184 | { | 183 | { |
184 | struct f2fs_sb_info *sbi = fio->sbi; | ||
185 | enum page_type btype = PAGE_TYPE_OF_BIO(fio->type); | 185 | enum page_type btype = PAGE_TYPE_OF_BIO(fio->type); |
186 | struct f2fs_bio_info *io; | 186 | struct f2fs_bio_info *io; |
187 | bool is_read = is_read_io(fio->rw); | 187 | bool is_read = is_read_io(fio->rw); |
@@ -206,17 +206,17 @@ alloc_new: | |||
206 | io->fio = *fio; | 206 | io->fio = *fio; |
207 | } | 207 | } |
208 | 208 | ||
209 | if (bio_add_page(io->bio, page, PAGE_CACHE_SIZE, 0) < | 209 | if (bio_add_page(io->bio, fio->page, PAGE_CACHE_SIZE, 0) < |
210 | PAGE_CACHE_SIZE) { | 210 | PAGE_CACHE_SIZE) { |
211 | __submit_merged_bio(io); | 211 | __submit_merged_bio(io); |
212 | goto alloc_new; | 212 | goto alloc_new; |
213 | } | 213 | } |
214 | 214 | ||
215 | io->last_block_in_bio = fio->blk_addr; | 215 | io->last_block_in_bio = fio->blk_addr; |
216 | f2fs_trace_ios(page, fio, 0); | 216 | f2fs_trace_ios(fio, 0); |
217 | 217 | ||
218 | up_write(&io->io_rwsem); | 218 | up_write(&io->io_rwsem); |
219 | trace_f2fs_submit_page_mbio(page, fio); | 219 | trace_f2fs_submit_page_mbio(fio->page, fio); |
220 | } | 220 | } |
221 | 221 | ||
222 | /* | 222 | /* |
@@ -925,6 +925,7 @@ struct page *find_data_page(struct inode *inode, pgoff_t index, bool sync) | |||
925 | struct extent_info ei; | 925 | struct extent_info ei; |
926 | int err; | 926 | int err; |
927 | struct f2fs_io_info fio = { | 927 | struct f2fs_io_info fio = { |
928 | .sbi = F2FS_I_SB(inode), | ||
928 | .type = DATA, | 929 | .type = DATA, |
929 | .rw = sync ? READ_SYNC : READA, | 930 | .rw = sync ? READ_SYNC : READA, |
930 | }; | 931 | }; |
@@ -971,7 +972,8 @@ got_it: | |||
971 | } | 972 | } |
972 | 973 | ||
973 | fio.blk_addr = dn.data_blkaddr; | 974 | fio.blk_addr = dn.data_blkaddr; |
974 | err = f2fs_submit_page_bio(F2FS_I_SB(inode), page, &fio); | 975 | fio.page = page; |
976 | err = f2fs_submit_page_bio(&fio); | ||
975 | if (err) | 977 | if (err) |
976 | return ERR_PTR(err); | 978 | return ERR_PTR(err); |
977 | 979 | ||
@@ -998,6 +1000,7 @@ struct page *get_lock_data_page(struct inode *inode, pgoff_t index) | |||
998 | struct extent_info ei; | 1000 | struct extent_info ei; |
999 | int err; | 1001 | int err; |
1000 | struct f2fs_io_info fio = { | 1002 | struct f2fs_io_info fio = { |
1003 | .sbi = F2FS_I_SB(inode), | ||
1001 | .type = DATA, | 1004 | .type = DATA, |
1002 | .rw = READ_SYNC, | 1005 | .rw = READ_SYNC, |
1003 | }; | 1006 | }; |
@@ -1041,7 +1044,8 @@ got_it: | |||
1041 | } | 1044 | } |
1042 | 1045 | ||
1043 | fio.blk_addr = dn.data_blkaddr; | 1046 | fio.blk_addr = dn.data_blkaddr; |
1044 | err = f2fs_submit_page_bio(F2FS_I_SB(inode), page, &fio); | 1047 | fio.page = page; |
1048 | err = f2fs_submit_page_bio(&fio); | ||
1045 | if (err) | 1049 | if (err) |
1046 | return ERR_PTR(err); | 1050 | return ERR_PTR(err); |
1047 | 1051 | ||
@@ -1092,11 +1096,13 @@ repeat: | |||
1092 | SetPageUptodate(page); | 1096 | SetPageUptodate(page); |
1093 | } else { | 1097 | } else { |
1094 | struct f2fs_io_info fio = { | 1098 | struct f2fs_io_info fio = { |
1099 | .sbi = F2FS_I_SB(inode), | ||
1095 | .type = DATA, | 1100 | .type = DATA, |
1096 | .rw = READ_SYNC, | 1101 | .rw = READ_SYNC, |
1097 | .blk_addr = dn.data_blkaddr, | 1102 | .blk_addr = dn.data_blkaddr, |
1103 | .page = page, | ||
1098 | }; | 1104 | }; |
1099 | err = f2fs_submit_page_bio(F2FS_I_SB(inode), page, &fio); | 1105 | err = f2fs_submit_page_bio(&fio); |
1100 | if (err) | 1106 | if (err) |
1101 | goto put_err; | 1107 | goto put_err; |
1102 | 1108 | ||
@@ -1529,8 +1535,9 @@ static int f2fs_read_data_pages(struct file *file, | |||
1529 | return f2fs_mpage_readpages(mapping, pages, NULL, nr_pages); | 1535 | return f2fs_mpage_readpages(mapping, pages, NULL, nr_pages); |
1530 | } | 1536 | } |
1531 | 1537 | ||
1532 | int do_write_data_page(struct page *page, struct f2fs_io_info *fio) | 1538 | int do_write_data_page(struct f2fs_io_info *fio) |
1533 | { | 1539 | { |
1540 | struct page *page = fio->page; | ||
1534 | struct inode *inode = page->mapping->host; | 1541 | struct inode *inode = page->mapping->host; |
1535 | struct dnode_of_data dn; | 1542 | struct dnode_of_data dn; |
1536 | int err = 0; | 1543 | int err = 0; |
@@ -1557,11 +1564,11 @@ int do_write_data_page(struct page *page, struct f2fs_io_info *fio) | |||
1557 | if (unlikely(fio->blk_addr != NEW_ADDR && | 1564 | if (unlikely(fio->blk_addr != NEW_ADDR && |
1558 | !is_cold_data(page) && | 1565 | !is_cold_data(page) && |
1559 | need_inplace_update(inode))) { | 1566 | need_inplace_update(inode))) { |
1560 | rewrite_data_page(page, fio); | 1567 | rewrite_data_page(fio); |
1561 | set_inode_flag(F2FS_I(inode), FI_UPDATE_WRITE); | 1568 | set_inode_flag(F2FS_I(inode), FI_UPDATE_WRITE); |
1562 | trace_f2fs_do_write_data_page(page, IPU); | 1569 | trace_f2fs_do_write_data_page(page, IPU); |
1563 | } else { | 1570 | } else { |
1564 | write_data_page(page, &dn, fio); | 1571 | write_data_page(&dn, fio); |
1565 | set_data_blkaddr(&dn); | 1572 | set_data_blkaddr(&dn); |
1566 | f2fs_update_extent_cache(&dn); | 1573 | f2fs_update_extent_cache(&dn); |
1567 | trace_f2fs_do_write_data_page(page, OPU); | 1574 | trace_f2fs_do_write_data_page(page, OPU); |
@@ -1586,8 +1593,10 @@ static int f2fs_write_data_page(struct page *page, | |||
1586 | bool need_balance_fs = false; | 1593 | bool need_balance_fs = false; |
1587 | int err = 0; | 1594 | int err = 0; |
1588 | struct f2fs_io_info fio = { | 1595 | struct f2fs_io_info fio = { |
1596 | .sbi = sbi, | ||
1589 | .type = DATA, | 1597 | .type = DATA, |
1590 | .rw = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : WRITE, | 1598 | .rw = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : WRITE, |
1599 | .page = page, | ||
1591 | }; | 1600 | }; |
1592 | 1601 | ||
1593 | trace_f2fs_writepage(page, DATA); | 1602 | trace_f2fs_writepage(page, DATA); |
@@ -1617,7 +1626,7 @@ write: | |||
1617 | if (S_ISDIR(inode->i_mode)) { | 1626 | if (S_ISDIR(inode->i_mode)) { |
1618 | if (unlikely(f2fs_cp_error(sbi))) | 1627 | if (unlikely(f2fs_cp_error(sbi))) |
1619 | goto redirty_out; | 1628 | goto redirty_out; |
1620 | err = do_write_data_page(page, &fio); | 1629 | err = do_write_data_page(&fio); |
1621 | goto done; | 1630 | goto done; |
1622 | } | 1631 | } |
1623 | 1632 | ||
@@ -1637,7 +1646,7 @@ write: | |||
1637 | if (f2fs_has_inline_data(inode)) | 1646 | if (f2fs_has_inline_data(inode)) |
1638 | err = f2fs_write_inline_data(inode, page); | 1647 | err = f2fs_write_inline_data(inode, page); |
1639 | if (err == -EAGAIN) | 1648 | if (err == -EAGAIN) |
1640 | err = do_write_data_page(page, &fio); | 1649 | err = do_write_data_page(&fio); |
1641 | f2fs_unlock_op(sbi); | 1650 | f2fs_unlock_op(sbi); |
1642 | done: | 1651 | done: |
1643 | if (err && err != -ENOENT) | 1652 | if (err && err != -ENOENT) |
@@ -1806,11 +1815,13 @@ put_next: | |||
1806 | zero_user_segment(page, 0, PAGE_CACHE_SIZE); | 1815 | zero_user_segment(page, 0, PAGE_CACHE_SIZE); |
1807 | } else { | 1816 | } else { |
1808 | struct f2fs_io_info fio = { | 1817 | struct f2fs_io_info fio = { |
1818 | .sbi = sbi, | ||
1809 | .type = DATA, | 1819 | .type = DATA, |
1810 | .rw = READ_SYNC, | 1820 | .rw = READ_SYNC, |
1811 | .blk_addr = dn.data_blkaddr, | 1821 | .blk_addr = dn.data_blkaddr, |
1822 | .page = page, | ||
1812 | }; | 1823 | }; |
1813 | err = f2fs_submit_page_bio(sbi, page, &fio); | 1824 | err = f2fs_submit_page_bio(&fio); |
1814 | if (err) | 1825 | if (err) |
1815 | goto fail; | 1826 | goto fail; |
1816 | 1827 | ||
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 2bb9b577b598..e99a404d97d7 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h | |||
@@ -601,9 +601,11 @@ enum page_type { | |||
601 | }; | 601 | }; |
602 | 602 | ||
603 | struct f2fs_io_info { | 603 | struct f2fs_io_info { |
604 | struct f2fs_sb_info *sbi; /* f2fs_sb_info pointer */ | ||
604 | enum page_type type; /* contains DATA/NODE/META/META_FLUSH */ | 605 | enum page_type type; /* contains DATA/NODE/META/META_FLUSH */ |
605 | int rw; /* contains R/RS/W/WS with REQ_META/REQ_PRIO */ | 606 | int rw; /* contains R/RS/W/WS with REQ_META/REQ_PRIO */ |
606 | block_t blk_addr; /* block address to be written */ | 607 | block_t blk_addr; /* block address to be written */ |
608 | struct page *page; /* page to be written */ | ||
607 | }; | 609 | }; |
608 | 610 | ||
609 | #define is_read_io(rw) (((rw) & 1) == READ) | 611 | #define is_read_io(rw) (((rw) & 1) == READ) |
@@ -1601,11 +1603,9 @@ void allocate_new_segments(struct f2fs_sb_info *); | |||
1601 | int f2fs_trim_fs(struct f2fs_sb_info *, struct fstrim_range *); | 1603 | int f2fs_trim_fs(struct f2fs_sb_info *, struct fstrim_range *); |
1602 | struct page *get_sum_page(struct f2fs_sb_info *, unsigned int); | 1604 | struct page *get_sum_page(struct f2fs_sb_info *, unsigned int); |
1603 | void write_meta_page(struct f2fs_sb_info *, struct page *); | 1605 | void write_meta_page(struct f2fs_sb_info *, struct page *); |
1604 | void write_node_page(struct f2fs_sb_info *, struct page *, | 1606 | void write_node_page(unsigned int, struct f2fs_io_info *); |
1605 | unsigned int, struct f2fs_io_info *); | 1607 | void write_data_page(struct dnode_of_data *, struct f2fs_io_info *); |
1606 | void write_data_page(struct page *, struct dnode_of_data *, | 1608 | void rewrite_data_page(struct f2fs_io_info *); |
1607 | struct f2fs_io_info *); | ||
1608 | void rewrite_data_page(struct page *, struct f2fs_io_info *); | ||
1609 | void recover_data_page(struct f2fs_sb_info *, struct page *, | 1609 | void recover_data_page(struct f2fs_sb_info *, struct page *, |
1610 | struct f2fs_summary *, block_t, block_t); | 1610 | struct f2fs_summary *, block_t, block_t); |
1611 | void allocate_data_block(struct f2fs_sb_info *, struct page *, | 1611 | void allocate_data_block(struct f2fs_sb_info *, struct page *, |
@@ -1653,10 +1653,8 @@ void destroy_checkpoint_caches(void); | |||
1653 | * data.c | 1653 | * data.c |
1654 | */ | 1654 | */ |
1655 | void f2fs_submit_merged_bio(struct f2fs_sb_info *, enum page_type, int); | 1655 | void f2fs_submit_merged_bio(struct f2fs_sb_info *, enum page_type, int); |
1656 | int f2fs_submit_page_bio(struct f2fs_sb_info *, struct page *, | 1656 | int f2fs_submit_page_bio(struct f2fs_io_info *); |
1657 | struct f2fs_io_info *); | 1657 | void f2fs_submit_page_mbio(struct f2fs_io_info *); |
1658 | void f2fs_submit_page_mbio(struct f2fs_sb_info *, struct page *, | ||
1659 | struct f2fs_io_info *); | ||
1660 | void set_data_blkaddr(struct dnode_of_data *); | 1658 | void set_data_blkaddr(struct dnode_of_data *); |
1661 | int reserve_new_block(struct dnode_of_data *); | 1659 | int reserve_new_block(struct dnode_of_data *); |
1662 | int f2fs_reserve_block(struct dnode_of_data *, pgoff_t); | 1660 | int f2fs_reserve_block(struct dnode_of_data *, pgoff_t); |
@@ -1668,7 +1666,7 @@ void f2fs_preserve_extent_tree(struct inode *); | |||
1668 | struct page *find_data_page(struct inode *, pgoff_t, bool); | 1666 | struct page *find_data_page(struct inode *, pgoff_t, bool); |
1669 | struct page *get_lock_data_page(struct inode *, pgoff_t); | 1667 | struct page *get_lock_data_page(struct inode *, pgoff_t); |
1670 | struct page *get_new_data_page(struct inode *, struct page *, pgoff_t, bool); | 1668 | struct page *get_new_data_page(struct inode *, struct page *, pgoff_t, bool); |
1671 | int do_write_data_page(struct page *, struct f2fs_io_info *); | 1669 | int do_write_data_page(struct f2fs_io_info *); |
1672 | int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *, u64, u64); | 1670 | int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *, u64, u64); |
1673 | void init_extent_cache_info(struct f2fs_sb_info *); | 1671 | void init_extent_cache_info(struct f2fs_sb_info *); |
1674 | int __init create_extent_cache(void); | 1672 | int __init create_extent_cache(void); |
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index ffd9b7e49be7..0e58f021bf49 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c | |||
@@ -271,7 +271,7 @@ flush_out: | |||
271 | ret = f2fs_issue_flush(sbi); | 271 | ret = f2fs_issue_flush(sbi); |
272 | out: | 272 | out: |
273 | trace_f2fs_sync_file_exit(inode, need_cp, datasync, ret); | 273 | trace_f2fs_sync_file_exit(inode, need_cp, datasync, ret); |
274 | f2fs_trace_ios(NULL, NULL, 1); | 274 | f2fs_trace_ios(NULL, 1); |
275 | return ret; | 275 | return ret; |
276 | } | 276 | } |
277 | 277 | ||
diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c index ed58211fe79b..72667a54ac5f 100644 --- a/fs/f2fs/gc.c +++ b/fs/f2fs/gc.c | |||
@@ -521,8 +521,10 @@ static int check_dnode(struct f2fs_sb_info *sbi, struct f2fs_summary *sum, | |||
521 | static void move_data_page(struct inode *inode, struct page *page, int gc_type) | 521 | static void move_data_page(struct inode *inode, struct page *page, int gc_type) |
522 | { | 522 | { |
523 | struct f2fs_io_info fio = { | 523 | struct f2fs_io_info fio = { |
524 | .sbi = F2FS_I_SB(inode), | ||
524 | .type = DATA, | 525 | .type = DATA, |
525 | .rw = WRITE_SYNC, | 526 | .rw = WRITE_SYNC, |
527 | .page = page, | ||
526 | }; | 528 | }; |
527 | 529 | ||
528 | if (gc_type == BG_GC) { | 530 | if (gc_type == BG_GC) { |
@@ -536,7 +538,7 @@ static void move_data_page(struct inode *inode, struct page *page, int gc_type) | |||
536 | if (clear_page_dirty_for_io(page)) | 538 | if (clear_page_dirty_for_io(page)) |
537 | inode_dec_dirty_pages(inode); | 539 | inode_dec_dirty_pages(inode); |
538 | set_cold_data(page); | 540 | set_cold_data(page); |
539 | do_write_data_page(page, &fio); | 541 | do_write_data_page(&fio); |
540 | clear_cold_data(page); | 542 | clear_cold_data(page); |
541 | } | 543 | } |
542 | out: | 544 | out: |
diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c index 99d514815af7..d9b3033bf6fd 100644 --- a/fs/f2fs/inline.c +++ b/fs/f2fs/inline.c | |||
@@ -106,8 +106,10 @@ int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page) | |||
106 | { | 106 | { |
107 | void *src_addr, *dst_addr; | 107 | void *src_addr, *dst_addr; |
108 | struct f2fs_io_info fio = { | 108 | struct f2fs_io_info fio = { |
109 | .sbi = F2FS_I_SB(dn->inode), | ||
109 | .type = DATA, | 110 | .type = DATA, |
110 | .rw = WRITE_SYNC | REQ_PRIO, | 111 | .rw = WRITE_SYNC | REQ_PRIO, |
112 | .page = page, | ||
111 | }; | 113 | }; |
112 | int dirty, err; | 114 | int dirty, err; |
113 | 115 | ||
@@ -141,7 +143,7 @@ no_update: | |||
141 | /* write data page to try to make data consistent */ | 143 | /* write data page to try to make data consistent */ |
142 | set_page_writeback(page); | 144 | set_page_writeback(page); |
143 | fio.blk_addr = dn->data_blkaddr; | 145 | fio.blk_addr = dn->data_blkaddr; |
144 | write_data_page(page, dn, &fio); | 146 | write_data_page(dn, &fio); |
145 | set_data_blkaddr(dn); | 147 | set_data_blkaddr(dn); |
146 | f2fs_update_extent_cache(dn); | 148 | f2fs_update_extent_cache(dn); |
147 | f2fs_wait_on_page_writeback(page, DATA); | 149 | f2fs_wait_on_page_writeback(page, DATA); |
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index 1676c7a454b2..880d5781b1b3 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c | |||
@@ -995,8 +995,10 @@ static int read_node_page(struct page *page, int rw) | |||
995 | struct f2fs_sb_info *sbi = F2FS_P_SB(page); | 995 | struct f2fs_sb_info *sbi = F2FS_P_SB(page); |
996 | struct node_info ni; | 996 | struct node_info ni; |
997 | struct f2fs_io_info fio = { | 997 | struct f2fs_io_info fio = { |
998 | .sbi = sbi, | ||
998 | .type = NODE, | 999 | .type = NODE, |
999 | .rw = rw, | 1000 | .rw = rw, |
1001 | .page = page, | ||
1000 | }; | 1002 | }; |
1001 | 1003 | ||
1002 | get_node_info(sbi, page->index, &ni); | 1004 | get_node_info(sbi, page->index, &ni); |
@@ -1011,7 +1013,7 @@ static int read_node_page(struct page *page, int rw) | |||
1011 | return LOCKED_PAGE; | 1013 | return LOCKED_PAGE; |
1012 | 1014 | ||
1013 | fio.blk_addr = ni.blk_addr; | 1015 | fio.blk_addr = ni.blk_addr; |
1014 | return f2fs_submit_page_bio(sbi, page, &fio); | 1016 | return f2fs_submit_page_bio(&fio); |
1015 | } | 1017 | } |
1016 | 1018 | ||
1017 | /* | 1019 | /* |
@@ -1293,8 +1295,10 @@ static int f2fs_write_node_page(struct page *page, | |||
1293 | nid_t nid; | 1295 | nid_t nid; |
1294 | struct node_info ni; | 1296 | struct node_info ni; |
1295 | struct f2fs_io_info fio = { | 1297 | struct f2fs_io_info fio = { |
1298 | .sbi = sbi, | ||
1296 | .type = NODE, | 1299 | .type = NODE, |
1297 | .rw = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : WRITE, | 1300 | .rw = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : WRITE, |
1301 | .page = page, | ||
1298 | }; | 1302 | }; |
1299 | 1303 | ||
1300 | trace_f2fs_writepage(page, NODE); | 1304 | trace_f2fs_writepage(page, NODE); |
@@ -1329,7 +1333,7 @@ static int f2fs_write_node_page(struct page *page, | |||
1329 | 1333 | ||
1330 | set_page_writeback(page); | 1334 | set_page_writeback(page); |
1331 | fio.blk_addr = ni.blk_addr; | 1335 | fio.blk_addr = ni.blk_addr; |
1332 | write_node_page(sbi, page, nid, &fio); | 1336 | write_node_page(nid, &fio); |
1333 | set_node_addr(sbi, &ni, fio.blk_addr, is_fsync_dnode(page)); | 1337 | set_node_addr(sbi, &ni, fio.blk_addr, is_fsync_dnode(page)); |
1334 | dec_page_count(sbi, F2FS_DIRTY_NODES); | 1338 | dec_page_count(sbi, F2FS_DIRTY_NODES); |
1335 | up_read(&sbi->node_write); | 1339 | up_read(&sbi->node_write); |
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index f939660941bb..df8bce5379b3 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c | |||
@@ -216,6 +216,7 @@ void commit_inmem_pages(struct inode *inode, bool abort) | |||
216 | struct inmem_pages *cur, *tmp; | 216 | struct inmem_pages *cur, *tmp; |
217 | bool submit_bio = false; | 217 | bool submit_bio = false; |
218 | struct f2fs_io_info fio = { | 218 | struct f2fs_io_info fio = { |
219 | .sbi = sbi, | ||
219 | .type = DATA, | 220 | .type = DATA, |
220 | .rw = WRITE_SYNC | REQ_PRIO, | 221 | .rw = WRITE_SYNC | REQ_PRIO, |
221 | }; | 222 | }; |
@@ -241,7 +242,8 @@ void commit_inmem_pages(struct inode *inode, bool abort) | |||
241 | if (clear_page_dirty_for_io(cur->page)) | 242 | if (clear_page_dirty_for_io(cur->page)) |
242 | inode_dec_dirty_pages(inode); | 243 | inode_dec_dirty_pages(inode); |
243 | trace_f2fs_commit_inmem_page(cur->page, INMEM); | 244 | trace_f2fs_commit_inmem_page(cur->page, INMEM); |
244 | do_write_data_page(cur->page, &fio); | 245 | fio.page = cur->page; |
246 | do_write_data_page(&fio); | ||
245 | submit_bio = true; | 247 | submit_bio = true; |
246 | } | 248 | } |
247 | f2fs_put_page(cur->page, 1); | 249 | f2fs_put_page(cur->page, 1); |
@@ -1206,56 +1208,56 @@ void allocate_data_block(struct f2fs_sb_info *sbi, struct page *page, | |||
1206 | mutex_unlock(&curseg->curseg_mutex); | 1208 | mutex_unlock(&curseg->curseg_mutex); |
1207 | } | 1209 | } |
1208 | 1210 | ||
1209 | static void do_write_page(struct f2fs_sb_info *sbi, struct page *page, | 1211 | static void do_write_page(struct f2fs_summary *sum, struct f2fs_io_info *fio) |
1210 | struct f2fs_summary *sum, | ||
1211 | struct f2fs_io_info *fio) | ||
1212 | { | 1212 | { |
1213 | int type = __get_segment_type(page, fio->type); | 1213 | int type = __get_segment_type(fio->page, fio->type); |
1214 | 1214 | ||
1215 | allocate_data_block(sbi, page, fio->blk_addr, &fio->blk_addr, sum, type); | 1215 | allocate_data_block(fio->sbi, fio->page, fio->blk_addr, |
1216 | &fio->blk_addr, sum, type); | ||
1216 | 1217 | ||
1217 | /* writeout dirty page into bdev */ | 1218 | /* writeout dirty page into bdev */ |
1218 | f2fs_submit_page_mbio(sbi, page, fio); | 1219 | f2fs_submit_page_mbio(fio); |
1219 | } | 1220 | } |
1220 | 1221 | ||
1221 | void write_meta_page(struct f2fs_sb_info *sbi, struct page *page) | 1222 | void write_meta_page(struct f2fs_sb_info *sbi, struct page *page) |
1222 | { | 1223 | { |
1223 | struct f2fs_io_info fio = { | 1224 | struct f2fs_io_info fio = { |
1225 | .sbi = sbi, | ||
1224 | .type = META, | 1226 | .type = META, |
1225 | .rw = WRITE_SYNC | REQ_META | REQ_PRIO, | 1227 | .rw = WRITE_SYNC | REQ_META | REQ_PRIO, |
1226 | .blk_addr = page->index, | 1228 | .blk_addr = page->index, |
1229 | .page = page, | ||
1227 | }; | 1230 | }; |
1228 | 1231 | ||
1229 | set_page_writeback(page); | 1232 | set_page_writeback(page); |
1230 | f2fs_submit_page_mbio(sbi, page, &fio); | 1233 | f2fs_submit_page_mbio(&fio); |
1231 | } | 1234 | } |
1232 | 1235 | ||
1233 | void write_node_page(struct f2fs_sb_info *sbi, struct page *page, | 1236 | void write_node_page(unsigned int nid, struct f2fs_io_info *fio) |
1234 | unsigned int nid, struct f2fs_io_info *fio) | ||
1235 | { | 1237 | { |
1236 | struct f2fs_summary sum; | 1238 | struct f2fs_summary sum; |
1239 | |||
1237 | set_summary(&sum, nid, 0, 0); | 1240 | set_summary(&sum, nid, 0, 0); |
1238 | do_write_page(sbi, page, &sum, fio); | 1241 | do_write_page(&sum, fio); |
1239 | } | 1242 | } |
1240 | 1243 | ||
1241 | void write_data_page(struct page *page, struct dnode_of_data *dn, | 1244 | void write_data_page(struct dnode_of_data *dn, struct f2fs_io_info *fio) |
1242 | struct f2fs_io_info *fio) | ||
1243 | { | 1245 | { |
1244 | struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode); | 1246 | struct f2fs_sb_info *sbi = fio->sbi; |
1245 | struct f2fs_summary sum; | 1247 | struct f2fs_summary sum; |
1246 | struct node_info ni; | 1248 | struct node_info ni; |
1247 | 1249 | ||
1248 | f2fs_bug_on(sbi, dn->data_blkaddr == NULL_ADDR); | 1250 | f2fs_bug_on(sbi, dn->data_blkaddr == NULL_ADDR); |
1249 | get_node_info(sbi, dn->nid, &ni); | 1251 | get_node_info(sbi, dn->nid, &ni); |
1250 | set_summary(&sum, dn->nid, dn->ofs_in_node, ni.version); | 1252 | set_summary(&sum, dn->nid, dn->ofs_in_node, ni.version); |
1251 | do_write_page(sbi, page, &sum, fio); | 1253 | do_write_page(&sum, fio); |
1252 | dn->data_blkaddr = fio->blk_addr; | 1254 | dn->data_blkaddr = fio->blk_addr; |
1253 | } | 1255 | } |
1254 | 1256 | ||
1255 | void rewrite_data_page(struct page *page, struct f2fs_io_info *fio) | 1257 | void rewrite_data_page(struct f2fs_io_info *fio) |
1256 | { | 1258 | { |
1257 | stat_inc_inplace_blocks(F2FS_P_SB(page)); | 1259 | stat_inc_inplace_blocks(fio->sbi); |
1258 | f2fs_submit_page_mbio(F2FS_P_SB(page), page, fio); | 1260 | f2fs_submit_page_mbio(fio); |
1259 | } | 1261 | } |
1260 | 1262 | ||
1261 | void recover_data_page(struct f2fs_sb_info *sbi, | 1263 | void recover_data_page(struct f2fs_sb_info *sbi, |
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 85841687b40a..138fa938c291 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c | |||
@@ -520,7 +520,7 @@ int f2fs_sync_fs(struct super_block *sb, int sync) | |||
520 | } else { | 520 | } else { |
521 | f2fs_balance_fs(sbi); | 521 | f2fs_balance_fs(sbi); |
522 | } | 522 | } |
523 | f2fs_trace_ios(NULL, NULL, 1); | 523 | f2fs_trace_ios(NULL, 1); |
524 | 524 | ||
525 | return 0; | 525 | return 0; |
526 | } | 526 | } |
diff --git a/fs/f2fs/trace.c b/fs/f2fs/trace.c index 875aa8179bc1..145fb659ad44 100644 --- a/fs/f2fs/trace.c +++ b/fs/f2fs/trace.c | |||
@@ -80,7 +80,7 @@ out: | |||
80 | radix_tree_preload_end(); | 80 | radix_tree_preload_end(); |
81 | } | 81 | } |
82 | 82 | ||
83 | void f2fs_trace_ios(struct page *page, struct f2fs_io_info *fio, int flush) | 83 | void f2fs_trace_ios(struct f2fs_io_info *fio, int flush) |
84 | { | 84 | { |
85 | struct inode *inode; | 85 | struct inode *inode; |
86 | pid_t pid; | 86 | pid_t pid; |
@@ -91,8 +91,8 @@ void f2fs_trace_ios(struct page *page, struct f2fs_io_info *fio, int flush) | |||
91 | return; | 91 | return; |
92 | } | 92 | } |
93 | 93 | ||
94 | inode = page->mapping->host; | 94 | inode = fio->page->mapping->host; |
95 | pid = page_private(page); | 95 | pid = page_private(fio->page); |
96 | 96 | ||
97 | major = MAJOR(inode->i_sb->s_dev); | 97 | major = MAJOR(inode->i_sb->s_dev); |
98 | minor = MINOR(inode->i_sb->s_dev); | 98 | minor = MINOR(inode->i_sb->s_dev); |
diff --git a/fs/f2fs/trace.h b/fs/f2fs/trace.h index 1041dbeb52ae..67db24ac1e85 100644 --- a/fs/f2fs/trace.h +++ b/fs/f2fs/trace.h | |||
@@ -33,12 +33,12 @@ struct last_io_info { | |||
33 | }; | 33 | }; |
34 | 34 | ||
35 | extern void f2fs_trace_pid(struct page *); | 35 | extern void f2fs_trace_pid(struct page *); |
36 | extern void f2fs_trace_ios(struct page *, struct f2fs_io_info *, int); | 36 | extern void f2fs_trace_ios(struct f2fs_io_info *, int); |
37 | extern void f2fs_build_trace_ios(void); | 37 | extern void f2fs_build_trace_ios(void); |
38 | extern void f2fs_destroy_trace_ios(void); | 38 | extern void f2fs_destroy_trace_ios(void); |
39 | #else | 39 | #else |
40 | #define f2fs_trace_pid(p) | 40 | #define f2fs_trace_pid(p) |
41 | #define f2fs_trace_ios(p, i, n) | 41 | #define f2fs_trace_ios(i, n) |
42 | #define f2fs_build_trace_ios() | 42 | #define f2fs_build_trace_ios() |
43 | #define f2fs_destroy_trace_ios() | 43 | #define f2fs_destroy_trace_ios() |
44 | 44 | ||