diff options
Diffstat (limited to 'fs/f2fs/data.c')
-rw-r--r-- | fs/f2fs/data.c | 47 |
1 files changed, 29 insertions, 18 deletions
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 | ||