data.c (4ba24fef3eb3b142197135223b90ced2f319cd53) data.c (caf0047e7e1e60a7ad1d655d3b81b32e2dfb6095)
1/*
2 * fs/f2fs/data.c
3 *
4 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 * http://www.samsung.com/
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as

--- 8 unchanged lines hidden (view full) ---

17#include <linux/backing-dev.h>
18#include <linux/blkdev.h>
19#include <linux/bio.h>
20#include <linux/prefetch.h>
21
22#include "f2fs.h"
23#include "node.h"
24#include "segment.h"
1/*
2 * fs/f2fs/data.c
3 *
4 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 * http://www.samsung.com/
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as

--- 8 unchanged lines hidden (view full) ---

17#include <linux/backing-dev.h>
18#include <linux/blkdev.h>
19#include <linux/bio.h>
20#include <linux/prefetch.h>
21
22#include "f2fs.h"
23#include "node.h"
24#include "segment.h"
25#include "trace.h"
25#include <trace/events/f2fs.h>
26
27static void f2fs_read_end_io(struct bio *bio, int err)
28{
29 struct bio_vec *bvec;
30 int i;
31
32 bio_for_each_segment_all(bvec, bio, i) {

--- 57 unchanged lines hidden (view full) ---

90static void __submit_merged_bio(struct f2fs_bio_info *io)
91{
92 struct f2fs_io_info *fio = &io->fio;
93
94 if (!io->bio)
95 return;
96
97 if (is_read_io(fio->rw))
26#include <trace/events/f2fs.h>
27
28static void f2fs_read_end_io(struct bio *bio, int err)
29{
30 struct bio_vec *bvec;
31 int i;
32
33 bio_for_each_segment_all(bvec, bio, i) {

--- 57 unchanged lines hidden (view full) ---

91static void __submit_merged_bio(struct f2fs_bio_info *io)
92{
93 struct f2fs_io_info *fio = &io->fio;
94
95 if (!io->bio)
96 return;
97
98 if (is_read_io(fio->rw))
98 trace_f2fs_submit_read_bio(io->sbi->sb, fio->rw,
99 fio->type, io->bio);
99 trace_f2fs_submit_read_bio(io->sbi->sb, fio, io->bio);
100 else
100 else
101 trace_f2fs_submit_write_bio(io->sbi->sb, fio->rw,
102 fio->type, io->bio);
101 trace_f2fs_submit_write_bio(io->sbi->sb, fio, io->bio);
103
104 submit_bio(fio->rw, io->bio);
105 io->bio = NULL;
106}
107
108void f2fs_submit_merged_bio(struct f2fs_sb_info *sbi,
109 enum page_type type, int rw)
110{

--- 16 unchanged lines hidden (view full) ---

127 up_write(&io->io_rwsem);
128}
129
130/*
131 * Fill the locked page with data located in the block address.
132 * Return unlocked page.
133 */
134int f2fs_submit_page_bio(struct f2fs_sb_info *sbi, struct page *page,
102
103 submit_bio(fio->rw, io->bio);
104 io->bio = NULL;
105}
106
107void f2fs_submit_merged_bio(struct f2fs_sb_info *sbi,
108 enum page_type type, int rw)
109{

--- 16 unchanged lines hidden (view full) ---

126 up_write(&io->io_rwsem);
127}
128
129/*
130 * Fill the locked page with data located in the block address.
131 * Return unlocked page.
132 */
133int f2fs_submit_page_bio(struct f2fs_sb_info *sbi, struct page *page,
135 block_t blk_addr, int rw)
134 struct f2fs_io_info *fio)
136{
137 struct bio *bio;
138
135{
136 struct bio *bio;
137
139 trace_f2fs_submit_page_bio(page, blk_addr, rw);
138 trace_f2fs_submit_page_bio(page, fio);
139 f2fs_trace_ios(page, fio, 0);
140
141 /* Allocate a new bio */
140
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
144 if (bio_add_page(bio, page, PAGE_CACHE_SIZE, 0) < PAGE_CACHE_SIZE) {
145 bio_put(bio);
146 f2fs_put_page(page, 1);
147 return -EFAULT;
148 }
149
143
144 if (bio_add_page(bio, page, PAGE_CACHE_SIZE, 0) < PAGE_CACHE_SIZE) {
145 bio_put(bio);
146 f2fs_put_page(page, 1);
147 return -EFAULT;
148 }
149
150 submit_bio(rw, bio);
150 submit_bio(fio->rw, bio);
151 return 0;
152}
153
154void f2fs_submit_page_mbio(struct f2fs_sb_info *sbi, struct page *page,
151 return 0;
152}
153
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{
157 enum page_type btype = PAGE_TYPE_OF_BIO(fio->type);
158 struct f2fs_bio_info *io;
159 bool is_read = is_read_io(fio->rw);
160
161 io = is_read ? &sbi->read_io : &sbi->write_io[btype];
162
156{
157 enum page_type btype = PAGE_TYPE_OF_BIO(fio->type);
158 struct f2fs_bio_info *io;
159 bool is_read = is_read_io(fio->rw);
160
161 io = is_read ? &sbi->read_io : &sbi->write_io[btype];
162
163 verify_block_addr(sbi, blk_addr);
163 verify_block_addr(sbi, fio->blk_addr);
164
165 down_write(&io->io_rwsem);
166
167 if (!is_read)
168 inc_page_count(sbi, F2FS_WRITEBACK);
169
164
165 down_write(&io->io_rwsem);
166
167 if (!is_read)
168 inc_page_count(sbi, F2FS_WRITEBACK);
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))
172 __submit_merged_bio(io);
173alloc_new:
174 if (io->bio == NULL) {
175 int bio_blocks = MAX_BIO_BLOCKS(sbi);
176
171 io->fio.rw != fio->rw))
172 __submit_merged_bio(io);
173alloc_new:
174 if (io->bio == NULL) {
175 int bio_blocks = MAX_BIO_BLOCKS(sbi);
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;
179 }
180
181 if (bio_add_page(io->bio, page, PAGE_CACHE_SIZE, 0) <
182 PAGE_CACHE_SIZE) {
183 __submit_merged_bio(io);
184 goto alloc_new;
185 }
186
178 io->fio = *fio;
179 }
180
181 if (bio_add_page(io->bio, page, PAGE_CACHE_SIZE, 0) <
182 PAGE_CACHE_SIZE) {
183 __submit_merged_bio(io);
184 goto alloc_new;
185 }
186
187 io->last_block_in_bio = blk_addr;
187 io->last_block_in_bio = fio->blk_addr;
188 f2fs_trace_ios(page, fio, 0);
188
189 up_write(&io->io_rwsem);
189
190 up_write(&io->io_rwsem);
190 trace_f2fs_submit_page_mbio(page, fio->rw, fio->type, blk_addr);
191 trace_f2fs_submit_page_mbio(page, fio);
191}
192
193/*
194 * Lock ordering for the change of data block address:
195 * ->data_page
196 * ->node_page
197 * update block addresses in the node page
198 */
192}
193
194/*
195 * Lock ordering for the change of data block address:
196 * ->data_page
197 * ->node_page
198 * update block addresses in the node page
199 */
199static void __set_data_blkaddr(struct dnode_of_data *dn, block_t new_addr)
200static void __set_data_blkaddr(struct dnode_of_data *dn)
200{
201 struct f2fs_node *rn;
202 __le32 *addr_array;
203 struct page *node_page = dn->node_page;
204 unsigned int ofs_in_node = dn->ofs_in_node;
205
206 f2fs_wait_on_page_writeback(node_page, NODE);
207
208 rn = F2FS_NODE(node_page);
209
210 /* Get physical address of data block */
211 addr_array = blkaddr_in_node(rn);
201{
202 struct f2fs_node *rn;
203 __le32 *addr_array;
204 struct page *node_page = dn->node_page;
205 unsigned int ofs_in_node = dn->ofs_in_node;
206
207 f2fs_wait_on_page_writeback(node_page, NODE);
208
209 rn = F2FS_NODE(node_page);
210
211 /* Get physical address of data block */
212 addr_array = blkaddr_in_node(rn);
212 addr_array[ofs_in_node] = cpu_to_le32(new_addr);
213 addr_array[ofs_in_node] = cpu_to_le32(dn->data_blkaddr);
213 set_page_dirty(node_page);
214}
215
216int reserve_new_block(struct dnode_of_data *dn)
217{
218 struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
219
220 if (unlikely(is_inode_flag_set(F2FS_I(dn->inode), FI_NO_ALLOC)))
221 return -EPERM;
222 if (unlikely(!inc_valid_block_count(sbi, dn->inode, 1)))
223 return -ENOSPC;
224
225 trace_f2fs_reserve_new_block(dn->inode, dn->nid, dn->ofs_in_node);
226
214 set_page_dirty(node_page);
215}
216
217int reserve_new_block(struct dnode_of_data *dn)
218{
219 struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
220
221 if (unlikely(is_inode_flag_set(F2FS_I(dn->inode), FI_NO_ALLOC)))
222 return -EPERM;
223 if (unlikely(!inc_valid_block_count(sbi, dn->inode, 1)))
224 return -ENOSPC;
225
226 trace_f2fs_reserve_new_block(dn->inode, dn->nid, dn->ofs_in_node);
227
227 __set_data_blkaddr(dn, NEW_ADDR);
228 dn->data_blkaddr = NEW_ADDR;
228 dn->data_blkaddr = NEW_ADDR;
229 __set_data_blkaddr(dn);
229 mark_inode_dirty(dn->inode);
230 sync_inode_page(dn);
231 return 0;
232}
233
234int f2fs_reserve_block(struct dnode_of_data *dn, pgoff_t index)
235{
236 bool need_put = dn->inode_page ? false : true;

--- 48 unchanged lines hidden (view full) ---

285 stat_inc_read_hit(inode->i_sb);
286 read_unlock(&fi->ext.ext_lock);
287 return 1;
288 }
289 read_unlock(&fi->ext.ext_lock);
290 return 0;
291}
292
230 mark_inode_dirty(dn->inode);
231 sync_inode_page(dn);
232 return 0;
233}
234
235int f2fs_reserve_block(struct dnode_of_data *dn, pgoff_t index)
236{
237 bool need_put = dn->inode_page ? false : true;

--- 48 unchanged lines hidden (view full) ---

286 stat_inc_read_hit(inode->i_sb);
287 read_unlock(&fi->ext.ext_lock);
288 return 1;
289 }
290 read_unlock(&fi->ext.ext_lock);
291 return 0;
292}
293
293void update_extent_cache(block_t blk_addr, struct dnode_of_data *dn)
294void update_extent_cache(struct dnode_of_data *dn)
294{
295 struct f2fs_inode_info *fi = F2FS_I(dn->inode);
296 pgoff_t fofs, start_fofs, end_fofs;
297 block_t start_blkaddr, end_blkaddr;
298 int need_update = true;
299
295{
296 struct f2fs_inode_info *fi = F2FS_I(dn->inode);
297 pgoff_t fofs, start_fofs, end_fofs;
298 block_t start_blkaddr, end_blkaddr;
299 int need_update = true;
300
300 f2fs_bug_on(F2FS_I_SB(dn->inode), blk_addr == NEW_ADDR);
301 fofs = start_bidx_of_node(ofs_of_node(dn->node_page), fi) +
302 dn->ofs_in_node;
301 f2fs_bug_on(F2FS_I_SB(dn->inode), dn->data_blkaddr == NEW_ADDR);
303
304 /* Update the page address in the parent node */
302
303 /* Update the page address in the parent node */
305 __set_data_blkaddr(dn, blk_addr);
304 __set_data_blkaddr(dn);
306
307 if (is_inode_flag_set(fi, FI_NO_EXTENT))
308 return;
309
305
306 if (is_inode_flag_set(fi, FI_NO_EXTENT))
307 return;
308
309 fofs = start_bidx_of_node(ofs_of_node(dn->node_page), fi) +
310 dn->ofs_in_node;
311
310 write_lock(&fi->ext.ext_lock);
311
312 start_fofs = fi->ext.fofs;
313 end_fofs = fi->ext.fofs + fi->ext.len - 1;
314 start_blkaddr = fi->ext.blk_addr;
315 end_blkaddr = fi->ext.blk_addr + fi->ext.len - 1;
316
317 /* Drop and initialize the matched extent */
318 if (fi->ext.len == 1 && fofs == start_fofs)
319 fi->ext.len = 0;
320
321 /* Initial extent */
322 if (fi->ext.len == 0) {
312 write_lock(&fi->ext.ext_lock);
313
314 start_fofs = fi->ext.fofs;
315 end_fofs = fi->ext.fofs + fi->ext.len - 1;
316 start_blkaddr = fi->ext.blk_addr;
317 end_blkaddr = fi->ext.blk_addr + fi->ext.len - 1;
318
319 /* Drop and initialize the matched extent */
320 if (fi->ext.len == 1 && fofs == start_fofs)
321 fi->ext.len = 0;
322
323 /* Initial extent */
324 if (fi->ext.len == 0) {
323 if (blk_addr != NULL_ADDR) {
325 if (dn->data_blkaddr != NULL_ADDR) {
324 fi->ext.fofs = fofs;
326 fi->ext.fofs = fofs;
325 fi->ext.blk_addr = blk_addr;
327 fi->ext.blk_addr = dn->data_blkaddr;
326 fi->ext.len = 1;
327 }
328 goto end_update;
329 }
330
331 /* Front merge */
328 fi->ext.len = 1;
329 }
330 goto end_update;
331 }
332
333 /* Front merge */
332 if (fofs == start_fofs - 1 && blk_addr == start_blkaddr - 1) {
334 if (fofs == start_fofs - 1 && dn->data_blkaddr == start_blkaddr - 1) {
333 fi->ext.fofs--;
334 fi->ext.blk_addr--;
335 fi->ext.len++;
336 goto end_update;
337 }
338
339 /* Back merge */
335 fi->ext.fofs--;
336 fi->ext.blk_addr--;
337 fi->ext.len++;
338 goto end_update;
339 }
340
341 /* Back merge */
340 if (fofs == end_fofs + 1 && blk_addr == end_blkaddr + 1) {
342 if (fofs == end_fofs + 1 && dn->data_blkaddr == end_blkaddr + 1) {
341 fi->ext.len++;
342 goto end_update;
343 }
344
345 /* Split the existing extent */
346 if (fi->ext.len > 1 &&
347 fofs >= start_fofs && fofs <= end_fofs) {
348 if ((end_fofs - fofs) < (fi->ext.len >> 1)) {

--- 22 unchanged lines hidden (view full) ---

371}
372
373struct page *find_data_page(struct inode *inode, pgoff_t index, bool sync)
374{
375 struct address_space *mapping = inode->i_mapping;
376 struct dnode_of_data dn;
377 struct page *page;
378 int err;
343 fi->ext.len++;
344 goto end_update;
345 }
346
347 /* Split the existing extent */
348 if (fi->ext.len > 1 &&
349 fofs >= start_fofs && fofs <= end_fofs) {
350 if ((end_fofs - fofs) < (fi->ext.len >> 1)) {

--- 22 unchanged lines hidden (view full) ---

373}
374
375struct page *find_data_page(struct inode *inode, pgoff_t index, bool sync)
376{
377 struct address_space *mapping = inode->i_mapping;
378 struct dnode_of_data dn;
379 struct page *page;
380 int err;
381 struct f2fs_io_info fio = {
382 .type = DATA,
383 .rw = sync ? READ_SYNC : READA,
384 };
379
380 page = find_get_page(mapping, index);
381 if (page && PageUptodate(page))
382 return page;
383 f2fs_put_page(page, 0);
384
385 set_new_dnode(&dn, inode, NULL, NULL, 0);
386 err = get_dnode_of_data(&dn, index, LOOKUP_NODE);

--- 12 unchanged lines hidden (view full) ---

399 if (!page)
400 return ERR_PTR(-ENOMEM);
401
402 if (PageUptodate(page)) {
403 unlock_page(page);
404 return page;
405 }
406
385
386 page = find_get_page(mapping, index);
387 if (page && PageUptodate(page))
388 return page;
389 f2fs_put_page(page, 0);
390
391 set_new_dnode(&dn, inode, NULL, NULL, 0);
392 err = get_dnode_of_data(&dn, index, LOOKUP_NODE);

--- 12 unchanged lines hidden (view full) ---

405 if (!page)
406 return ERR_PTR(-ENOMEM);
407
408 if (PageUptodate(page)) {
409 unlock_page(page);
410 return page;
411 }
412
407 err = f2fs_submit_page_bio(F2FS_I_SB(inode), page, dn.data_blkaddr,
408 sync ? READ_SYNC : READA);
413 fio.blk_addr = dn.data_blkaddr;
414 err = f2fs_submit_page_bio(F2FS_I_SB(inode), page, &fio);
409 if (err)
410 return ERR_PTR(err);
411
412 if (sync) {
413 wait_on_page_locked(page);
414 if (unlikely(!PageUptodate(page))) {
415 f2fs_put_page(page, 0);
416 return ERR_PTR(-EIO);

--- 8 unchanged lines hidden (view full) ---

425 * whether this page exists or not.
426 */
427struct page *get_lock_data_page(struct inode *inode, pgoff_t index)
428{
429 struct address_space *mapping = inode->i_mapping;
430 struct dnode_of_data dn;
431 struct page *page;
432 int err;
415 if (err)
416 return ERR_PTR(err);
417
418 if (sync) {
419 wait_on_page_locked(page);
420 if (unlikely(!PageUptodate(page))) {
421 f2fs_put_page(page, 0);
422 return ERR_PTR(-EIO);

--- 8 unchanged lines hidden (view full) ---

431 * whether this page exists or not.
432 */
433struct page *get_lock_data_page(struct inode *inode, pgoff_t index)
434{
435 struct address_space *mapping = inode->i_mapping;
436 struct dnode_of_data dn;
437 struct page *page;
438 int err;
433
439 struct f2fs_io_info fio = {
440 .type = DATA,
441 .rw = READ_SYNC,
442 };
434repeat:
435 page = grab_cache_page(mapping, index);
436 if (!page)
437 return ERR_PTR(-ENOMEM);
438
439 set_new_dnode(&dn, inode, NULL, NULL, 0);
440 err = get_dnode_of_data(&dn, index, LOOKUP_NODE);
441 if (err) {

--- 17 unchanged lines hidden (view full) ---

459 * see, f2fs_add_link -> get_new_data_page -> init_inode_metadata.
460 */
461 if (dn.data_blkaddr == NEW_ADDR) {
462 zero_user_segment(page, 0, PAGE_CACHE_SIZE);
463 SetPageUptodate(page);
464 return page;
465 }
466
443repeat:
444 page = grab_cache_page(mapping, index);
445 if (!page)
446 return ERR_PTR(-ENOMEM);
447
448 set_new_dnode(&dn, inode, NULL, NULL, 0);
449 err = get_dnode_of_data(&dn, index, LOOKUP_NODE);
450 if (err) {

--- 17 unchanged lines hidden (view full) ---

468 * see, f2fs_add_link -> get_new_data_page -> init_inode_metadata.
469 */
470 if (dn.data_blkaddr == NEW_ADDR) {
471 zero_user_segment(page, 0, PAGE_CACHE_SIZE);
472 SetPageUptodate(page);
473 return page;
474 }
475
467 err = f2fs_submit_page_bio(F2FS_I_SB(inode), page,
468 dn.data_blkaddr, READ_SYNC);
476 fio.blk_addr = dn.data_blkaddr;
477 err = f2fs_submit_page_bio(F2FS_I_SB(inode), page, &fio);
469 if (err)
470 return ERR_PTR(err);
471
472 lock_page(page);
473 if (unlikely(!PageUptodate(page))) {
474 f2fs_put_page(page, 1);
475 return ERR_PTR(-EIO);
476 }

--- 33 unchanged lines hidden (view full) ---

510
511 if (PageUptodate(page))
512 return page;
513
514 if (dn.data_blkaddr == NEW_ADDR) {
515 zero_user_segment(page, 0, PAGE_CACHE_SIZE);
516 SetPageUptodate(page);
517 } else {
478 if (err)
479 return ERR_PTR(err);
480
481 lock_page(page);
482 if (unlikely(!PageUptodate(page))) {
483 f2fs_put_page(page, 1);
484 return ERR_PTR(-EIO);
485 }

--- 33 unchanged lines hidden (view full) ---

519
520 if (PageUptodate(page))
521 return page;
522
523 if (dn.data_blkaddr == NEW_ADDR) {
524 zero_user_segment(page, 0, PAGE_CACHE_SIZE);
525 SetPageUptodate(page);
526 } else {
518 err = f2fs_submit_page_bio(F2FS_I_SB(inode), page,
519 dn.data_blkaddr, READ_SYNC);
527 struct f2fs_io_info fio = {
528 .type = DATA,
529 .rw = READ_SYNC,
530 .blk_addr = dn.data_blkaddr,
531 };
532 err = f2fs_submit_page_bio(F2FS_I_SB(inode), page, &fio);
520 if (err)
521 goto put_err;
522
523 lock_page(page);
524 if (unlikely(!PageUptodate(page))) {
525 f2fs_put_page(page, 1);
526 err = -EIO;
527 goto put_err;

--- 17 unchanged lines hidden (view full) ---

545 return ERR_PTR(err);
546}
547
548static int __allocate_data_block(struct dnode_of_data *dn)
549{
550 struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
551 struct f2fs_inode_info *fi = F2FS_I(dn->inode);
552 struct f2fs_summary sum;
533 if (err)
534 goto put_err;
535
536 lock_page(page);
537 if (unlikely(!PageUptodate(page))) {
538 f2fs_put_page(page, 1);
539 err = -EIO;
540 goto put_err;

--- 17 unchanged lines hidden (view full) ---

558 return ERR_PTR(err);
559}
560
561static int __allocate_data_block(struct dnode_of_data *dn)
562{
563 struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
564 struct f2fs_inode_info *fi = F2FS_I(dn->inode);
565 struct f2fs_summary sum;
553 block_t new_blkaddr;
554 struct node_info ni;
566 struct node_info ni;
567 int seg = CURSEG_WARM_DATA;
555 pgoff_t fofs;
568 pgoff_t fofs;
556 int type;
557
558 if (unlikely(is_inode_flag_set(F2FS_I(dn->inode), FI_NO_ALLOC)))
559 return -EPERM;
560 if (unlikely(!inc_valid_block_count(sbi, dn->inode, 1)))
561 return -ENOSPC;
562
569
570 if (unlikely(is_inode_flag_set(F2FS_I(dn->inode), FI_NO_ALLOC)))
571 return -EPERM;
572 if (unlikely(!inc_valid_block_count(sbi, dn->inode, 1)))
573 return -ENOSPC;
574
563 __set_data_blkaddr(dn, NEW_ADDR);
564 dn->data_blkaddr = NEW_ADDR;
565
566 get_node_info(sbi, dn->nid, &ni);
567 set_summary(&sum, dn->nid, dn->ofs_in_node, ni.version);
568
575 get_node_info(sbi, dn->nid, &ni);
576 set_summary(&sum, dn->nid, dn->ofs_in_node, ni.version);
577
569 type = CURSEG_WARM_DATA;
578 if (dn->ofs_in_node == 0 && dn->inode_page == dn->node_page)
579 seg = CURSEG_DIRECT_IO;
570
580
571 allocate_data_block(sbi, NULL, NULL_ADDR, &new_blkaddr, &sum, type);
581 allocate_data_block(sbi, NULL, NULL_ADDR, &dn->data_blkaddr, &sum, seg);
572
573 /* direct IO doesn't use extent cache to maximize the performance */
582
583 /* direct IO doesn't use extent cache to maximize the performance */
574 set_inode_flag(F2FS_I(dn->inode), FI_NO_EXTENT);
575 update_extent_cache(new_blkaddr, dn);
576 clear_inode_flag(F2FS_I(dn->inode), FI_NO_EXTENT);
584 __set_data_blkaddr(dn);
577
578 /* update i_size */
579 fofs = start_bidx_of_node(ofs_of_node(dn->node_page), fi) +
580 dn->ofs_in_node;
581 if (i_size_read(dn->inode) < ((fofs + 1) << PAGE_CACHE_SHIFT))
582 i_size_write(dn->inode, ((fofs + 1) << PAGE_CACHE_SHIFT));
583
585
586 /* update i_size */
587 fofs = start_bidx_of_node(ofs_of_node(dn->node_page), fi) +
588 dn->ofs_in_node;
589 if (i_size_read(dn->inode) < ((fofs + 1) << PAGE_CACHE_SHIFT))
590 i_size_write(dn->inode, ((fofs + 1) << PAGE_CACHE_SHIFT));
591
584 dn->data_blkaddr = new_blkaddr;
585 return 0;
586}
587
588/*
589 * get_data_block() now supported readahead/bmap/rw direct_IO with mapped bh.
590 * If original data blocks are allocated, then give them to blockdev.
591 * Otherwise,
592 * a. preallocate requested block addresses

--- 147 unchanged lines hidden (view full) ---

740 return 0;
741
742 return mpage_readpages(mapping, pages, nr_pages, get_data_block);
743}
744
745int do_write_data_page(struct page *page, struct f2fs_io_info *fio)
746{
747 struct inode *inode = page->mapping->host;
592 return 0;
593}
594
595/*
596 * get_data_block() now supported readahead/bmap/rw direct_IO with mapped bh.
597 * If original data blocks are allocated, then give them to blockdev.
598 * Otherwise,
599 * a. preallocate requested block addresses

--- 147 unchanged lines hidden (view full) ---

747 return 0;
748
749 return mpage_readpages(mapping, pages, nr_pages, get_data_block);
750}
751
752int do_write_data_page(struct page *page, struct f2fs_io_info *fio)
753{
754 struct inode *inode = page->mapping->host;
748 block_t old_blkaddr, new_blkaddr;
749 struct dnode_of_data dn;
750 int err = 0;
751
752 set_new_dnode(&dn, inode, NULL, NULL, 0);
753 err = get_dnode_of_data(&dn, page->index, LOOKUP_NODE);
754 if (err)
755 return err;
756
755 struct dnode_of_data dn;
756 int err = 0;
757
758 set_new_dnode(&dn, inode, NULL, NULL, 0);
759 err = get_dnode_of_data(&dn, page->index, LOOKUP_NODE);
760 if (err)
761 return err;
762
757 old_blkaddr = dn.data_blkaddr;
763 fio->blk_addr = dn.data_blkaddr;
758
759 /* This page is already truncated */
764
765 /* This page is already truncated */
760 if (old_blkaddr == NULL_ADDR)
766 if (fio->blk_addr == NULL_ADDR)
761 goto out_writepage;
762
763 set_page_writeback(page);
764
765 /*
766 * If current allocation needs SSR,
767 * it had better in-place writes for updated data.
768 */
767 goto out_writepage;
768
769 set_page_writeback(page);
770
771 /*
772 * If current allocation needs SSR,
773 * it had better in-place writes for updated data.
774 */
769 if (unlikely(old_blkaddr != NEW_ADDR &&
775 if (unlikely(fio->blk_addr != NEW_ADDR &&
770 !is_cold_data(page) &&
771 need_inplace_update(inode))) {
776 !is_cold_data(page) &&
777 need_inplace_update(inode))) {
772 rewrite_data_page(page, old_blkaddr, fio);
778 rewrite_data_page(page, fio);
773 set_inode_flag(F2FS_I(inode), FI_UPDATE_WRITE);
774 } else {
779 set_inode_flag(F2FS_I(inode), FI_UPDATE_WRITE);
780 } else {
775 write_data_page(page, &dn, &new_blkaddr, fio);
776 update_extent_cache(new_blkaddr, &dn);
781 write_data_page(page, &dn, fio);
782 update_extent_cache(&dn);
777 set_inode_flag(F2FS_I(inode), FI_APPEND_WRITE);
778 }
779out_writepage:
780 f2fs_put_dnode(&dn);
781 return err;
782}
783
784static int f2fs_write_data_page(struct page *page,

--- 22 unchanged lines hidden (view full) ---

807 * this page does not have to be written to disk.
808 */
809 offset = i_size & (PAGE_CACHE_SIZE - 1);
810 if ((page->index >= end_index + 1) || !offset)
811 goto out;
812
813 zero_user_segment(page, offset, PAGE_CACHE_SIZE);
814write:
783 set_inode_flag(F2FS_I(inode), FI_APPEND_WRITE);
784 }
785out_writepage:
786 f2fs_put_dnode(&dn);
787 return err;
788}
789
790static int f2fs_write_data_page(struct page *page,

--- 22 unchanged lines hidden (view full) ---

813 * this page does not have to be written to disk.
814 */
815 offset = i_size & (PAGE_CACHE_SIZE - 1);
816 if ((page->index >= end_index + 1) || !offset)
817 goto out;
818
819 zero_user_segment(page, offset, PAGE_CACHE_SIZE);
820write:
815 if (unlikely(sbi->por_doing))
821 if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
816 goto redirty_out;
822 goto redirty_out;
823 if (f2fs_is_drop_cache(inode))
824 goto out;
825 if (f2fs_is_volatile_file(inode) && !wbc->for_reclaim &&
826 available_free_memory(sbi, BASE_CHECK))
827 goto redirty_out;
817
818 /* Dentry blocks are controlled by checkpoint */
819 if (S_ISDIR(inode->i_mode)) {
820 if (unlikely(f2fs_cp_error(sbi)))
821 goto redirty_out;
822 err = do_write_data_page(page, &fio);
823 goto done;
824 }
825
826 /* we should bypass data pages to proceed the kworkder jobs */
827 if (unlikely(f2fs_cp_error(sbi))) {
828 SetPageError(page);
828
829 /* Dentry blocks are controlled by checkpoint */
830 if (S_ISDIR(inode->i_mode)) {
831 if (unlikely(f2fs_cp_error(sbi)))
832 goto redirty_out;
833 err = do_write_data_page(page, &fio);
834 goto done;
835 }
836
837 /* we should bypass data pages to proceed the kworkder jobs */
838 if (unlikely(f2fs_cp_error(sbi))) {
839 SetPageError(page);
829 unlock_page(page);
830 goto out;
831 }
832
833 if (!wbc->for_reclaim)
834 need_balance_fs = true;
835 else if (has_not_enough_free_secs(sbi, 0))
836 goto redirty_out;
837

--- 159 unchanged lines hidden (view full) ---

997 /* Reading beyond i_size is simple: memset to zero */
998 zero_user_segments(page, 0, start, end, PAGE_CACHE_SIZE);
999 goto out;
1000 }
1001
1002 if (dn.data_blkaddr == NEW_ADDR) {
1003 zero_user_segment(page, 0, PAGE_CACHE_SIZE);
1004 } else {
840 goto out;
841 }
842
843 if (!wbc->for_reclaim)
844 need_balance_fs = true;
845 else if (has_not_enough_free_secs(sbi, 0))
846 goto redirty_out;
847

--- 159 unchanged lines hidden (view full) ---

1007 /* Reading beyond i_size is simple: memset to zero */
1008 zero_user_segments(page, 0, start, end, PAGE_CACHE_SIZE);
1009 goto out;
1010 }
1011
1012 if (dn.data_blkaddr == NEW_ADDR) {
1013 zero_user_segment(page, 0, PAGE_CACHE_SIZE);
1014 } else {
1005 err = f2fs_submit_page_bio(sbi, page, dn.data_blkaddr,
1006 READ_SYNC);
1015 struct f2fs_io_info fio = {
1016 .type = DATA,
1017 .rw = READ_SYNC,
1018 .blk_addr = dn.data_blkaddr,
1019 };
1020 err = f2fs_submit_page_bio(sbi, page, &fio);
1007 if (err)
1008 goto fail;
1009
1010 lock_page(page);
1011 if (unlikely(!PageUptodate(page))) {
1012 f2fs_put_page(page, 1);
1013 err = -EIO;
1014 goto fail;

--- 89 unchanged lines hidden (view full) ---

1104static void f2fs_invalidate_data_page(struct page *page, unsigned int offset,
1105 unsigned int length)
1106{
1107 struct inode *inode = page->mapping->host;
1108
1109 if (offset % PAGE_CACHE_SIZE || length != PAGE_CACHE_SIZE)
1110 return;
1111
1021 if (err)
1022 goto fail;
1023
1024 lock_page(page);
1025 if (unlikely(!PageUptodate(page))) {
1026 f2fs_put_page(page, 1);
1027 err = -EIO;
1028 goto fail;

--- 89 unchanged lines hidden (view full) ---

1118static void f2fs_invalidate_data_page(struct page *page, unsigned int offset,
1119 unsigned int length)
1120{
1121 struct inode *inode = page->mapping->host;
1122
1123 if (offset % PAGE_CACHE_SIZE || length != PAGE_CACHE_SIZE)
1124 return;
1125
1112 if (f2fs_is_atomic_file(inode) || f2fs_is_volatile_file(inode))
1113 invalidate_inmem_page(inode, page);
1114
1115 if (PageDirty(page))
1116 inode_dec_dirty_pages(inode);
1117 ClearPagePrivate(page);
1118}
1119
1120static int f2fs_release_data_page(struct page *page, gfp_t wait)
1121{
1122 ClearPagePrivate(page);

--- 4 unchanged lines hidden (view full) ---

1127{
1128 struct address_space *mapping = page->mapping;
1129 struct inode *inode = mapping->host;
1130
1131 trace_f2fs_set_page_dirty(page, DATA);
1132
1133 SetPageUptodate(page);
1134
1126 if (PageDirty(page))
1127 inode_dec_dirty_pages(inode);
1128 ClearPagePrivate(page);
1129}
1130
1131static int f2fs_release_data_page(struct page *page, gfp_t wait)
1132{
1133 ClearPagePrivate(page);

--- 4 unchanged lines hidden (view full) ---

1138{
1139 struct address_space *mapping = page->mapping;
1140 struct inode *inode = mapping->host;
1141
1142 trace_f2fs_set_page_dirty(page, DATA);
1143
1144 SetPageUptodate(page);
1145
1135 if (f2fs_is_atomic_file(inode) || f2fs_is_volatile_file(inode)) {
1146 if (f2fs_is_atomic_file(inode)) {
1136 register_inmem_page(inode, page);
1137 return 1;
1138 }
1139
1140 mark_inode_dirty(inode);
1141
1142 if (!PageDirty(page)) {
1143 __set_page_dirty_nobuffers(page);

--- 32 unchanged lines hidden ---
1147 register_inmem_page(inode, page);
1148 return 1;
1149 }
1150
1151 mark_inode_dirty(inode);
1152
1153 if (!PageDirty(page)) {
1154 __set_page_dirty_nobuffers(page);

--- 32 unchanged lines hidden ---