aboutsummaryrefslogtreecommitdiffstats
path: root/fs/f2fs
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk@kernel.org>2014-12-17 22:33:13 -0500
committerJaegeuk Kim <jaegeuk@kernel.org>2015-01-09 20:02:23 -0500
commitcf04e8eb55290c7b836c36f0b4e1a8d0fe8ee275 (patch)
tree077ddb41b1d4eec5f4987efa1aa7e1bca021727d /fs/f2fs
parent9ecf4b80bd32ad727d7fca56706bb5b059935c18 (diff)
f2fs: use f2fs_io_info to clean up messy parameters during IO path
This patch cleans up parameters on IO paths. The key idea is to use f2fs_io_info adding a parameter, block address, and then use this structure as parameters. Reviewed-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs/f2fs')
-rw-r--r--fs/f2fs/checkpoint.c24
-rw-r--r--fs/f2fs/data.c66
-rw-r--r--fs/f2fs/f2fs.h14
-rw-r--r--fs/f2fs/inline.c7
-rw-r--r--fs/f2fs/node.c14
-rw-r--r--fs/f2fs/segment.c28
6 files changed, 87 insertions, 66 deletions
diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
index 825158e4855a..0ac7c39605ed 100644
--- a/fs/f2fs/checkpoint.c
+++ b/fs/f2fs/checkpoint.c
@@ -50,6 +50,11 @@ struct page *get_meta_page(struct f2fs_sb_info *sbi, pgoff_t index)
50{ 50{
51 struct address_space *mapping = META_MAPPING(sbi); 51 struct address_space *mapping = META_MAPPING(sbi);
52 struct page *page; 52 struct page *page;
53 struct f2fs_io_info fio = {
54 .type = META,
55 .rw = READ_SYNC | REQ_META | REQ_PRIO,
56 .blk_addr = index,
57 };
53repeat: 58repeat:
54 page = grab_cache_page(mapping, index); 59 page = grab_cache_page(mapping, index);
55 if (!page) { 60 if (!page) {
@@ -59,8 +64,7 @@ repeat:
59 if (PageUptodate(page)) 64 if (PageUptodate(page))
60 goto out; 65 goto out;
61 66
62 if (f2fs_submit_page_bio(sbi, page, index, 67 if (f2fs_submit_page_bio(sbi, page, &fio))
63 READ_SYNC | REQ_META | REQ_PRIO))
64 goto repeat; 68 goto repeat;
65 69
66 lock_page(page); 70 lock_page(page);
@@ -112,14 +116,12 @@ int ra_meta_pages(struct f2fs_sb_info *sbi, block_t start, int nrpages, int type
112 block_t prev_blk_addr = 0; 116 block_t prev_blk_addr = 0;
113 struct page *page; 117 struct page *page;
114 block_t blkno = start; 118 block_t blkno = start;
115
116 struct f2fs_io_info fio = { 119 struct f2fs_io_info fio = {
117 .type = META, 120 .type = META,
118 .rw = READ_SYNC | REQ_META | REQ_PRIO 121 .rw = READ_SYNC | REQ_META | REQ_PRIO
119 }; 122 };
120 123
121 for (; nrpages-- > 0; blkno++) { 124 for (; nrpages-- > 0; blkno++) {
122 block_t blk_addr;
123 125
124 if (!is_valid_blkaddr(sbi, blkno, type)) 126 if (!is_valid_blkaddr(sbi, blkno, type))
125 goto out; 127 goto out;
@@ -130,27 +132,27 @@ int ra_meta_pages(struct f2fs_sb_info *sbi, block_t start, int nrpages, int type
130 NAT_BLOCK_OFFSET(NM_I(sbi)->max_nid))) 132 NAT_BLOCK_OFFSET(NM_I(sbi)->max_nid)))
131 blkno = 0; 133 blkno = 0;
132 /* get nat block addr */ 134 /* get nat block addr */
133 blk_addr = current_nat_addr(sbi, 135 fio.blk_addr = current_nat_addr(sbi,
134 blkno * NAT_ENTRY_PER_BLOCK); 136 blkno * NAT_ENTRY_PER_BLOCK);
135 break; 137 break;
136 case META_SIT: 138 case META_SIT:
137 /* get sit block addr */ 139 /* get sit block addr */
138 blk_addr = current_sit_addr(sbi, 140 fio.blk_addr = current_sit_addr(sbi,
139 blkno * SIT_ENTRY_PER_BLOCK); 141 blkno * SIT_ENTRY_PER_BLOCK);
140 if (blkno != start && prev_blk_addr + 1 != blk_addr) 142 if (blkno != start && prev_blk_addr + 1 != fio.blk_addr)
141 goto out; 143 goto out;
142 prev_blk_addr = blk_addr; 144 prev_blk_addr = fio.blk_addr;
143 break; 145 break;
144 case META_SSA: 146 case META_SSA:
145 case META_CP: 147 case META_CP:
146 case META_POR: 148 case META_POR:
147 blk_addr = blkno; 149 fio.blk_addr = blkno;
148 break; 150 break;
149 default: 151 default:
150 BUG(); 152 BUG();
151 } 153 }
152 154
153 page = grab_cache_page(META_MAPPING(sbi), blk_addr); 155 page = grab_cache_page(META_MAPPING(sbi), fio.blk_addr);
154 if (!page) 156 if (!page)
155 continue; 157 continue;
156 if (PageUptodate(page)) { 158 if (PageUptodate(page)) {
@@ -158,7 +160,7 @@ int ra_meta_pages(struct f2fs_sb_info *sbi, block_t start, int nrpages, int type
158 continue; 160 continue;
159 } 161 }
160 162
161 f2fs_submit_page_mbio(sbi, page, blk_addr, &fio); 163 f2fs_submit_page_mbio(sbi, page, &fio);
162 f2fs_put_page(page, 0); 164 f2fs_put_page(page, 0);
163 } 165 }
164out: 166out:
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index caa08e46697a..d86f8b1413f1 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -132,14 +132,14 @@ void f2fs_submit_merged_bio(struct f2fs_sb_info *sbi,
132 * Return unlocked page. 132 * Return unlocked page.
133 */ 133 */
134int f2fs_submit_page_bio(struct f2fs_sb_info *sbi, struct page *page, 134int f2fs_submit_page_bio(struct f2fs_sb_info *sbi, struct page *page,
135 block_t blk_addr, int rw) 135 struct f2fs_io_info *fio)
136{ 136{
137 struct bio *bio; 137 struct bio *bio;
138 138
139 trace_f2fs_submit_page_bio(page, blk_addr, rw); 139 trace_f2fs_submit_page_bio(page, fio->blk_addr, fio->rw);
140 140
141 /* Allocate a new bio */ 141 /* Allocate a new bio */
142 bio = __bio_alloc(sbi, blk_addr, 1, is_read_io(rw)); 142 bio = __bio_alloc(sbi, fio->blk_addr, 1, is_read_io(fio->rw));
143 143
144 if (bio_add_page(bio, page, PAGE_CACHE_SIZE, 0) < PAGE_CACHE_SIZE) { 144 if (bio_add_page(bio, page, PAGE_CACHE_SIZE, 0) < PAGE_CACHE_SIZE) {
145 bio_put(bio); 145 bio_put(bio);
@@ -147,12 +147,12 @@ int f2fs_submit_page_bio(struct f2fs_sb_info *sbi, struct page *page,
147 return -EFAULT; 147 return -EFAULT;
148 } 148 }
149 149
150 submit_bio(rw, bio); 150 submit_bio(fio->rw, bio);
151 return 0; 151 return 0;
152} 152}
153 153
154void f2fs_submit_page_mbio(struct f2fs_sb_info *sbi, struct page *page, 154void f2fs_submit_page_mbio(struct f2fs_sb_info *sbi, struct page *page,
155 block_t blk_addr, struct f2fs_io_info *fio) 155 struct f2fs_io_info *fio)
156{ 156{
157 enum page_type btype = PAGE_TYPE_OF_BIO(fio->type); 157 enum page_type btype = PAGE_TYPE_OF_BIO(fio->type);
158 struct f2fs_bio_info *io; 158 struct f2fs_bio_info *io;
@@ -160,21 +160,21 @@ void f2fs_submit_page_mbio(struct f2fs_sb_info *sbi, struct page *page,
160 160
161 io = is_read ? &sbi->read_io : &sbi->write_io[btype]; 161 io = is_read ? &sbi->read_io : &sbi->write_io[btype];
162 162
163 verify_block_addr(sbi, blk_addr); 163 verify_block_addr(sbi, fio->blk_addr);
164 164
165 down_write(&io->io_rwsem); 165 down_write(&io->io_rwsem);
166 166
167 if (!is_read) 167 if (!is_read)
168 inc_page_count(sbi, F2FS_WRITEBACK); 168 inc_page_count(sbi, F2FS_WRITEBACK);
169 169
170 if (io->bio && (io->last_block_in_bio != blk_addr - 1 || 170 if (io->bio && (io->last_block_in_bio != fio->blk_addr - 1 ||
171 io->fio.rw != fio->rw)) 171 io->fio.rw != fio->rw))
172 __submit_merged_bio(io); 172 __submit_merged_bio(io);
173alloc_new: 173alloc_new:
174 if (io->bio == NULL) { 174 if (io->bio == NULL) {
175 int bio_blocks = MAX_BIO_BLOCKS(sbi); 175 int bio_blocks = MAX_BIO_BLOCKS(sbi);
176 176
177 io->bio = __bio_alloc(sbi, blk_addr, bio_blocks, is_read); 177 io->bio = __bio_alloc(sbi, fio->blk_addr, bio_blocks, is_read);
178 io->fio = *fio; 178 io->fio = *fio;
179 } 179 }
180 180
@@ -184,10 +184,10 @@ alloc_new:
184 goto alloc_new; 184 goto alloc_new;
185 } 185 }
186 186
187 io->last_block_in_bio = blk_addr; 187 io->last_block_in_bio = fio->blk_addr;
188 188
189 up_write(&io->io_rwsem); 189 up_write(&io->io_rwsem);
190 trace_f2fs_submit_page_mbio(page, fio->rw, fio->type, blk_addr); 190 trace_f2fs_submit_page_mbio(page, fio->rw, fio->type, fio->blk_addr);
191} 191}
192 192
193/* 193/*
@@ -376,6 +376,10 @@ struct page *find_data_page(struct inode *inode, pgoff_t index, bool sync)
376 struct dnode_of_data dn; 376 struct dnode_of_data dn;
377 struct page *page; 377 struct page *page;
378 int err; 378 int err;
379 struct f2fs_io_info fio = {
380 .type = DATA,
381 .rw = sync ? READ_SYNC : READA,
382 };
379 383
380 page = find_get_page(mapping, index); 384 page = find_get_page(mapping, index);
381 if (page && PageUptodate(page)) 385 if (page && PageUptodate(page))
@@ -404,8 +408,8 @@ struct page *find_data_page(struct inode *inode, pgoff_t index, bool sync)
404 return page; 408 return page;
405 } 409 }
406 410
407 err = f2fs_submit_page_bio(F2FS_I_SB(inode), page, dn.data_blkaddr, 411 fio.blk_addr = dn.data_blkaddr;
408 sync ? READ_SYNC : READA); 412 err = f2fs_submit_page_bio(F2FS_I_SB(inode), page, &fio);
409 if (err) 413 if (err)
410 return ERR_PTR(err); 414 return ERR_PTR(err);
411 415
@@ -430,7 +434,10 @@ struct page *get_lock_data_page(struct inode *inode, pgoff_t index)
430 struct dnode_of_data dn; 434 struct dnode_of_data dn;
431 struct page *page; 435 struct page *page;
432 int err; 436 int err;
433 437 struct f2fs_io_info fio = {
438 .type = DATA,
439 .rw = READ_SYNC,
440 };
434repeat: 441repeat:
435 page = grab_cache_page(mapping, index); 442 page = grab_cache_page(mapping, index);
436 if (!page) 443 if (!page)
@@ -464,8 +471,8 @@ repeat:
464 return page; 471 return page;
465 } 472 }
466 473
467 err = f2fs_submit_page_bio(F2FS_I_SB(inode), page, 474 fio.blk_addr = dn.data_blkaddr;
468 dn.data_blkaddr, READ_SYNC); 475 err = f2fs_submit_page_bio(F2FS_I_SB(inode), page, &fio);
469 if (err) 476 if (err)
470 return ERR_PTR(err); 477 return ERR_PTR(err);
471 478
@@ -515,8 +522,12 @@ repeat:
515 zero_user_segment(page, 0, PAGE_CACHE_SIZE); 522 zero_user_segment(page, 0, PAGE_CACHE_SIZE);
516 SetPageUptodate(page); 523 SetPageUptodate(page);
517 } else { 524 } else {
518 err = f2fs_submit_page_bio(F2FS_I_SB(inode), page, 525 struct f2fs_io_info fio = {
519 dn.data_blkaddr, READ_SYNC); 526 .type = DATA,
527 .rw = READ_SYNC,
528 .blk_addr = dn.data_blkaddr,
529 };
530 err = f2fs_submit_page_bio(F2FS_I_SB(inode), page, &fio);
520 if (err) 531 if (err)
521 goto put_err; 532 goto put_err;
522 533
@@ -745,7 +756,6 @@ static int f2fs_read_data_pages(struct file *file,
745int do_write_data_page(struct page *page, struct f2fs_io_info *fio) 756int do_write_data_page(struct page *page, struct f2fs_io_info *fio)
746{ 757{
747 struct inode *inode = page->mapping->host; 758 struct inode *inode = page->mapping->host;
748 block_t old_blkaddr, new_blkaddr;
749 struct dnode_of_data dn; 759 struct dnode_of_data dn;
750 int err = 0; 760 int err = 0;
751 761
@@ -754,10 +764,10 @@ int do_write_data_page(struct page *page, struct f2fs_io_info *fio)
754 if (err) 764 if (err)
755 return err; 765 return err;
756 766
757 old_blkaddr = dn.data_blkaddr; 767 fio->blk_addr = dn.data_blkaddr;
758 768
759 /* This page is already truncated */ 769 /* This page is already truncated */
760 if (old_blkaddr == NULL_ADDR) 770 if (fio->blk_addr == NULL_ADDR)
761 goto out_writepage; 771 goto out_writepage;
762 772
763 set_page_writeback(page); 773 set_page_writeback(page);
@@ -766,14 +776,14 @@ int do_write_data_page(struct page *page, struct f2fs_io_info *fio)
766 * If current allocation needs SSR, 776 * If current allocation needs SSR,
767 * it had better in-place writes for updated data. 777 * it had better in-place writes for updated data.
768 */ 778 */
769 if (unlikely(old_blkaddr != NEW_ADDR && 779 if (unlikely(fio->blk_addr != NEW_ADDR &&
770 !is_cold_data(page) && 780 !is_cold_data(page) &&
771 need_inplace_update(inode))) { 781 need_inplace_update(inode))) {
772 rewrite_data_page(page, old_blkaddr, fio); 782 rewrite_data_page(page, fio);
773 set_inode_flag(F2FS_I(inode), FI_UPDATE_WRITE); 783 set_inode_flag(F2FS_I(inode), FI_UPDATE_WRITE);
774 } else { 784 } else {
775 write_data_page(page, &dn, &new_blkaddr, fio); 785 write_data_page(page, &dn, fio);
776 update_extent_cache(new_blkaddr, &dn); 786 update_extent_cache(fio->blk_addr, &dn);
777 set_inode_flag(F2FS_I(inode), FI_APPEND_WRITE); 787 set_inode_flag(F2FS_I(inode), FI_APPEND_WRITE);
778 } 788 }
779out_writepage: 789out_writepage:
@@ -1007,8 +1017,12 @@ put_next:
1007 if (dn.data_blkaddr == NEW_ADDR) { 1017 if (dn.data_blkaddr == NEW_ADDR) {
1008 zero_user_segment(page, 0, PAGE_CACHE_SIZE); 1018 zero_user_segment(page, 0, PAGE_CACHE_SIZE);
1009 } else { 1019 } else {
1010 err = f2fs_submit_page_bio(sbi, page, dn.data_blkaddr, 1020 struct f2fs_io_info fio = {
1011 READ_SYNC); 1021 .type = DATA,
1022 .rw = READ_SYNC,
1023 .blk_addr = dn.data_blkaddr,
1024 };
1025 err = f2fs_submit_page_bio(sbi, page, &fio);
1012 if (err) 1026 if (err)
1013 goto fail; 1027 goto fail;
1014 1028
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index a8ccbceb869a..3f07b504f6d8 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -491,6 +491,7 @@ enum page_type {
491struct f2fs_io_info { 491struct f2fs_io_info {
492 enum page_type type; /* contains DATA/NODE/META/META_FLUSH */ 492 enum page_type type; /* contains DATA/NODE/META/META_FLUSH */
493 int rw; /* contains R/RS/W/WS with REQ_META/REQ_PRIO */ 493 int rw; /* contains R/RS/W/WS with REQ_META/REQ_PRIO */
494 block_t blk_addr; /* block address to be written */
494}; 495};
495 496
496#define is_read_io(rw) (((rw) & 1) == READ) 497#define is_read_io(rw) (((rw) & 1) == READ)
@@ -1414,10 +1415,10 @@ int f2fs_trim_fs(struct f2fs_sb_info *, struct fstrim_range *);
1414struct page *get_sum_page(struct f2fs_sb_info *, unsigned int); 1415struct page *get_sum_page(struct f2fs_sb_info *, unsigned int);
1415void write_meta_page(struct f2fs_sb_info *, struct page *); 1416void write_meta_page(struct f2fs_sb_info *, struct page *);
1416void write_node_page(struct f2fs_sb_info *, struct page *, 1417void write_node_page(struct f2fs_sb_info *, struct page *,
1417 struct f2fs_io_info *, unsigned int, block_t, block_t *); 1418 unsigned int, struct f2fs_io_info *);
1418void write_data_page(struct page *, struct dnode_of_data *, block_t *, 1419void write_data_page(struct page *, struct dnode_of_data *,
1419 struct f2fs_io_info *); 1420 struct f2fs_io_info *);
1420void rewrite_data_page(struct page *, block_t, struct f2fs_io_info *); 1421void rewrite_data_page(struct page *, struct f2fs_io_info *);
1421void recover_data_page(struct f2fs_sb_info *, struct page *, 1422void recover_data_page(struct f2fs_sb_info *, struct page *,
1422 struct f2fs_summary *, block_t, block_t); 1423 struct f2fs_summary *, block_t, block_t);
1423void allocate_data_block(struct f2fs_sb_info *, struct page *, 1424void allocate_data_block(struct f2fs_sb_info *, struct page *,
@@ -1464,8 +1465,9 @@ void destroy_checkpoint_caches(void);
1464 * data.c 1465 * data.c
1465 */ 1466 */
1466void f2fs_submit_merged_bio(struct f2fs_sb_info *, enum page_type, int); 1467void f2fs_submit_merged_bio(struct f2fs_sb_info *, enum page_type, int);
1467int f2fs_submit_page_bio(struct f2fs_sb_info *, struct page *, block_t, int); 1468int f2fs_submit_page_bio(struct f2fs_sb_info *, struct page *,
1468void f2fs_submit_page_mbio(struct f2fs_sb_info *, struct page *, block_t, 1469 struct f2fs_io_info *);
1470void f2fs_submit_page_mbio(struct f2fs_sb_info *, struct page *,
1469 struct f2fs_io_info *); 1471 struct f2fs_io_info *);
1470int reserve_new_block(struct dnode_of_data *); 1472int reserve_new_block(struct dnode_of_data *);
1471int f2fs_reserve_block(struct dnode_of_data *, pgoff_t); 1473int f2fs_reserve_block(struct dnode_of_data *, pgoff_t);
diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c
index f2d3c581e776..0c3f3f9b9f88 100644
--- a/fs/f2fs/inline.c
+++ b/fs/f2fs/inline.c
@@ -79,7 +79,6 @@ int f2fs_read_inline_data(struct inode *inode, struct page *page)
79int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page) 79int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page)
80{ 80{
81 void *src_addr, *dst_addr; 81 void *src_addr, *dst_addr;
82 block_t new_blk_addr;
83 struct f2fs_io_info fio = { 82 struct f2fs_io_info fio = {
84 .type = DATA, 83 .type = DATA,
85 .rw = WRITE_SYNC | REQ_PRIO, 84 .rw = WRITE_SYNC | REQ_PRIO,
@@ -115,9 +114,9 @@ no_update:
115 114
116 /* write data page to try to make data consistent */ 115 /* write data page to try to make data consistent */
117 set_page_writeback(page); 116 set_page_writeback(page);
118 117 fio.blk_addr = dn->data_blkaddr;
119 write_data_page(page, dn, &new_blk_addr, &fio); 118 write_data_page(page, dn, &fio);
120 update_extent_cache(new_blk_addr, dn); 119 update_extent_cache(fio.blk_addr, dn);
121 f2fs_wait_on_page_writeback(page, DATA); 120 f2fs_wait_on_page_writeback(page, DATA);
122 if (dirty) 121 if (dirty)
123 inode_dec_dirty_pages(dn->inode); 122 inode_dec_dirty_pages(dn->inode);
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
index bcfd67c80196..adc35c978306 100644
--- a/fs/f2fs/node.c
+++ b/fs/f2fs/node.c
@@ -977,6 +977,10 @@ static int read_node_page(struct page *page, int rw)
977{ 977{
978 struct f2fs_sb_info *sbi = F2FS_P_SB(page); 978 struct f2fs_sb_info *sbi = F2FS_P_SB(page);
979 struct node_info ni; 979 struct node_info ni;
980 struct f2fs_io_info fio = {
981 .type = NODE,
982 .rw = rw,
983 };
980 984
981 get_node_info(sbi, page->index, &ni); 985 get_node_info(sbi, page->index, &ni);
982 986
@@ -988,7 +992,8 @@ static int read_node_page(struct page *page, int rw)
988 if (PageUptodate(page)) 992 if (PageUptodate(page))
989 return LOCKED_PAGE; 993 return LOCKED_PAGE;
990 994
991 return f2fs_submit_page_bio(sbi, page, ni.blk_addr, rw); 995 fio.blk_addr = ni.blk_addr;
996 return f2fs_submit_page_bio(sbi, page, &fio);
992} 997}
993 998
994/* 999/*
@@ -1269,7 +1274,6 @@ static int f2fs_write_node_page(struct page *page,
1269{ 1274{
1270 struct f2fs_sb_info *sbi = F2FS_P_SB(page); 1275 struct f2fs_sb_info *sbi = F2FS_P_SB(page);
1271 nid_t nid; 1276 nid_t nid;
1272 block_t new_addr;
1273 struct node_info ni; 1277 struct node_info ni;
1274 struct f2fs_io_info fio = { 1278 struct f2fs_io_info fio = {
1275 .type = NODE, 1279 .type = NODE,
@@ -1304,9 +1308,11 @@ static int f2fs_write_node_page(struct page *page,
1304 } else { 1308 } else {
1305 down_read(&sbi->node_write); 1309 down_read(&sbi->node_write);
1306 } 1310 }
1311
1307 set_page_writeback(page); 1312 set_page_writeback(page);
1308 write_node_page(sbi, page, &fio, nid, ni.blk_addr, &new_addr); 1313 fio.blk_addr = ni.blk_addr;
1309 set_node_addr(sbi, &ni, new_addr, is_fsync_dnode(page)); 1314 write_node_page(sbi, page, nid, &fio);
1315 set_node_addr(sbi, &ni, fio.blk_addr, is_fsync_dnode(page));
1310 dec_page_count(sbi, F2FS_DIRTY_NODES); 1316 dec_page_count(sbi, F2FS_DIRTY_NODES);
1311 up_read(&sbi->node_write); 1317 up_read(&sbi->node_write);
1312 unlock_page(page); 1318 unlock_page(page);
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
index c950c9318e8e..c726f86c2ea0 100644
--- a/fs/f2fs/segment.c
+++ b/fs/f2fs/segment.c
@@ -1182,39 +1182,39 @@ void allocate_data_block(struct f2fs_sb_info *sbi, struct page *page,
1182} 1182}
1183 1183
1184static void do_write_page(struct f2fs_sb_info *sbi, struct page *page, 1184static void do_write_page(struct f2fs_sb_info *sbi, struct page *page,
1185 block_t old_blkaddr, block_t *new_blkaddr, 1185 struct f2fs_summary *sum,
1186 struct f2fs_summary *sum, struct f2fs_io_info *fio) 1186 struct f2fs_io_info *fio)
1187{ 1187{
1188 int type = __get_segment_type(page, fio->type); 1188 int type = __get_segment_type(page, fio->type);
1189 1189
1190 allocate_data_block(sbi, page, old_blkaddr, new_blkaddr, sum, type); 1190 allocate_data_block(sbi, page, fio->blk_addr, &fio->blk_addr, sum, type);
1191 1191
1192 /* writeout dirty page into bdev */ 1192 /* writeout dirty page into bdev */
1193 f2fs_submit_page_mbio(sbi, page, *new_blkaddr, fio); 1193 f2fs_submit_page_mbio(sbi, page, fio);
1194} 1194}
1195 1195
1196void write_meta_page(struct f2fs_sb_info *sbi, struct page *page) 1196void write_meta_page(struct f2fs_sb_info *sbi, struct page *page)
1197{ 1197{
1198 struct f2fs_io_info fio = { 1198 struct f2fs_io_info fio = {
1199 .type = META, 1199 .type = META,
1200 .rw = WRITE_SYNC | REQ_META | REQ_PRIO 1200 .rw = WRITE_SYNC | REQ_META | REQ_PRIO,
1201 .blk_addr = page->index,
1201 }; 1202 };
1202 1203
1203 set_page_writeback(page); 1204 set_page_writeback(page);
1204 f2fs_submit_page_mbio(sbi, page, page->index, &fio); 1205 f2fs_submit_page_mbio(sbi, page, &fio);
1205} 1206}
1206 1207
1207void write_node_page(struct f2fs_sb_info *sbi, struct page *page, 1208void write_node_page(struct f2fs_sb_info *sbi, struct page *page,
1208 struct f2fs_io_info *fio, 1209 unsigned int nid, struct f2fs_io_info *fio)
1209 unsigned int nid, block_t old_blkaddr, block_t *new_blkaddr)
1210{ 1210{
1211 struct f2fs_summary sum; 1211 struct f2fs_summary sum;
1212 set_summary(&sum, nid, 0, 0); 1212 set_summary(&sum, nid, 0, 0);
1213 do_write_page(sbi, page, old_blkaddr, new_blkaddr, &sum, fio); 1213 do_write_page(sbi, page, &sum, fio);
1214} 1214}
1215 1215
1216void write_data_page(struct page *page, struct dnode_of_data *dn, 1216void write_data_page(struct page *page, struct dnode_of_data *dn,
1217 block_t *new_blkaddr, struct f2fs_io_info *fio) 1217 struct f2fs_io_info *fio)
1218{ 1218{
1219 struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode); 1219 struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
1220 struct f2fs_summary sum; 1220 struct f2fs_summary sum;
@@ -1223,14 +1223,12 @@ void write_data_page(struct page *page, struct dnode_of_data *dn,
1223 f2fs_bug_on(sbi, dn->data_blkaddr == NULL_ADDR); 1223 f2fs_bug_on(sbi, dn->data_blkaddr == NULL_ADDR);
1224 get_node_info(sbi, dn->nid, &ni); 1224 get_node_info(sbi, dn->nid, &ni);
1225 set_summary(&sum, dn->nid, dn->ofs_in_node, ni.version); 1225 set_summary(&sum, dn->nid, dn->ofs_in_node, ni.version);
1226 1226 do_write_page(sbi, page, &sum, fio);
1227 do_write_page(sbi, page, dn->data_blkaddr, new_blkaddr, &sum, fio);
1228} 1227}
1229 1228
1230void rewrite_data_page(struct page *page, block_t old_blkaddr, 1229void rewrite_data_page(struct page *page, struct f2fs_io_info *fio)
1231 struct f2fs_io_info *fio)
1232{ 1230{
1233 f2fs_submit_page_mbio(F2FS_P_SB(page), page, old_blkaddr, fio); 1231 f2fs_submit_page_mbio(F2FS_P_SB(page), page, fio);
1234} 1232}
1235 1233
1236void recover_data_page(struct f2fs_sb_info *sbi, 1234void recover_data_page(struct f2fs_sb_info *sbi,