summaryrefslogtreecommitdiffstats
path: root/fs/f2fs/data.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/f2fs/data.c')
-rw-r--r--fs/f2fs/data.c47
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 */
161int f2fs_submit_page_bio(struct f2fs_sb_info *sbi, struct page *page, 161int 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
182void f2fs_submit_page_mbio(struct f2fs_sb_info *sbi, struct page *page, 182void 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
1532int do_write_data_page(struct page *page, struct f2fs_io_info *fio) 1538int 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);
1642done: 1651done:
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