summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/f2fs/checkpoint.c9
-rw-r--r--fs/f2fs/data.c47
-rw-r--r--fs/f2fs/f2fs.h18
-rw-r--r--fs/f2fs/file.c2
-rw-r--r--fs/f2fs/gc.c4
-rw-r--r--fs/f2fs/inline.c4
-rw-r--r--fs/f2fs/node.c8
-rw-r--r--fs/f2fs/segment.c38
-rw-r--r--fs/f2fs/super.c2
-rw-r--r--fs/f2fs/trace.c6
-rw-r--r--fs/f2fs/trace.h4
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 }
166out: 171out:
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
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
603struct f2fs_io_info { 603struct 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 *);
1601int f2fs_trim_fs(struct f2fs_sb_info *, struct fstrim_range *); 1603int f2fs_trim_fs(struct f2fs_sb_info *, struct fstrim_range *);
1602struct page *get_sum_page(struct f2fs_sb_info *, unsigned int); 1604struct page *get_sum_page(struct f2fs_sb_info *, unsigned int);
1603void write_meta_page(struct f2fs_sb_info *, struct page *); 1605void write_meta_page(struct f2fs_sb_info *, struct page *);
1604void write_node_page(struct f2fs_sb_info *, struct page *, 1606void write_node_page(unsigned int, struct f2fs_io_info *);
1605 unsigned int, struct f2fs_io_info *); 1607void write_data_page(struct dnode_of_data *, struct f2fs_io_info *);
1606void write_data_page(struct page *, struct dnode_of_data *, 1608void rewrite_data_page(struct f2fs_io_info *);
1607 struct f2fs_io_info *);
1608void rewrite_data_page(struct page *, struct f2fs_io_info *);
1609void recover_data_page(struct f2fs_sb_info *, struct page *, 1609void 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);
1611void allocate_data_block(struct f2fs_sb_info *, struct page *, 1611void 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 */
1655void f2fs_submit_merged_bio(struct f2fs_sb_info *, enum page_type, int); 1655void f2fs_submit_merged_bio(struct f2fs_sb_info *, enum page_type, int);
1656int f2fs_submit_page_bio(struct f2fs_sb_info *, struct page *, 1656int f2fs_submit_page_bio(struct f2fs_io_info *);
1657 struct f2fs_io_info *); 1657void f2fs_submit_page_mbio(struct f2fs_io_info *);
1658void f2fs_submit_page_mbio(struct f2fs_sb_info *, struct page *,
1659 struct f2fs_io_info *);
1660void set_data_blkaddr(struct dnode_of_data *); 1658void set_data_blkaddr(struct dnode_of_data *);
1661int reserve_new_block(struct dnode_of_data *); 1659int reserve_new_block(struct dnode_of_data *);
1662int f2fs_reserve_block(struct dnode_of_data *, pgoff_t); 1660int f2fs_reserve_block(struct dnode_of_data *, pgoff_t);
@@ -1668,7 +1666,7 @@ void f2fs_preserve_extent_tree(struct inode *);
1668struct page *find_data_page(struct inode *, pgoff_t, bool); 1666struct page *find_data_page(struct inode *, pgoff_t, bool);
1669struct page *get_lock_data_page(struct inode *, pgoff_t); 1667struct page *get_lock_data_page(struct inode *, pgoff_t);
1670struct page *get_new_data_page(struct inode *, struct page *, pgoff_t, bool); 1668struct page *get_new_data_page(struct inode *, struct page *, pgoff_t, bool);
1671int do_write_data_page(struct page *, struct f2fs_io_info *); 1669int do_write_data_page(struct f2fs_io_info *);
1672int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *, u64, u64); 1670int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *, u64, u64);
1673void init_extent_cache_info(struct f2fs_sb_info *); 1671void init_extent_cache_info(struct f2fs_sb_info *);
1674int __init create_extent_cache(void); 1672int __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);
272out: 272out:
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,
521static void move_data_page(struct inode *inode, struct page *page, int gc_type) 521static 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 }
542out: 544out:
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
1209static void do_write_page(struct f2fs_sb_info *sbi, struct page *page, 1211static 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
1221void write_meta_page(struct f2fs_sb_info *sbi, struct page *page) 1222void 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
1233void write_node_page(struct f2fs_sb_info *sbi, struct page *page, 1236void 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
1241void write_data_page(struct page *page, struct dnode_of_data *dn, 1244void 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
1255void rewrite_data_page(struct page *page, struct f2fs_io_info *fio) 1257void 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
1261void recover_data_page(struct f2fs_sb_info *sbi, 1263void 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
83void f2fs_trace_ios(struct page *page, struct f2fs_io_info *fio, int flush) 83void 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
35extern void f2fs_trace_pid(struct page *); 35extern void f2fs_trace_pid(struct page *);
36extern void f2fs_trace_ios(struct page *, struct f2fs_io_info *, int); 36extern void f2fs_trace_ios(struct f2fs_io_info *, int);
37extern void f2fs_build_trace_ios(void); 37extern void f2fs_build_trace_ios(void);
38extern void f2fs_destroy_trace_ios(void); 38extern 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