data.c (cfb271d485d0ec31eb92b51f4fbe54bf6542e8e6) | data.c (6bacf52fb58aeb3e89d9a62970b85a5570aa8ace) |
---|---|
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 --- 35 unchanged lines hidden (view full) --- 44 struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1; 45 46 do { 47 struct page *page = bvec->bv_page; 48 49 if (--bvec >= bio->bi_io_vec) 50 prefetchw(&bvec->bv_page->flags); 51 | 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 --- 35 unchanged lines hidden (view full) --- 44 struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1; 45 46 do { 47 struct page *page = bvec->bv_page; 48 49 if (--bvec >= bio->bi_io_vec) 50 prefetchw(&bvec->bv_page->flags); 51 |
52 if (uptodate) { 53 SetPageUptodate(page); 54 } else { | 52 if (unlikely(!uptodate)) { |
55 ClearPageUptodate(page); 56 SetPageError(page); | 53 ClearPageUptodate(page); 54 SetPageError(page); |
55 } else { 56 SetPageUptodate(page); |
|
57 } 58 unlock_page(page); 59 } while (bvec >= bio->bi_io_vec); 60 61 bio_put(bio); 62} 63 64static void f2fs_write_end_io(struct bio *bio, int err) 65{ 66 const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); 67 struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1; 68 struct f2fs_sb_info *sbi = F2FS_SB(bvec->bv_page->mapping->host->i_sb); 69 70 do { 71 struct page *page = bvec->bv_page; 72 73 if (--bvec >= bio->bi_io_vec) 74 prefetchw(&bvec->bv_page->flags); 75 | 57 } 58 unlock_page(page); 59 } while (bvec >= bio->bi_io_vec); 60 61 bio_put(bio); 62} 63 64static void f2fs_write_end_io(struct bio *bio, int err) 65{ 66 const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); 67 struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1; 68 struct f2fs_sb_info *sbi = F2FS_SB(bvec->bv_page->mapping->host->i_sb); 69 70 do { 71 struct page *page = bvec->bv_page; 72 73 if (--bvec >= bio->bi_io_vec) 74 prefetchw(&bvec->bv_page->flags); 75 |
76 if (!uptodate) { | 76 if (unlikely(!uptodate)) { |
77 SetPageError(page); 78 set_bit(AS_EIO, &page->mapping->flags); 79 set_ckpt_flags(sbi->ckpt, CP_ERROR_FLAG); 80 sbi->sb->s_flags |= MS_RDONLY; 81 } 82 end_page_writeback(page); 83 dec_page_count(sbi, F2FS_WRITEBACK); 84 } while (bvec >= bio->bi_io_vec); --- 159 unchanged lines hidden (view full) --- 244 addr_array[ofs_in_node] = cpu_to_le32(new_addr); 245 set_page_dirty(node_page); 246} 247 248int reserve_new_block(struct dnode_of_data *dn) 249{ 250 struct f2fs_sb_info *sbi = F2FS_SB(dn->inode->i_sb); 251 | 77 SetPageError(page); 78 set_bit(AS_EIO, &page->mapping->flags); 79 set_ckpt_flags(sbi->ckpt, CP_ERROR_FLAG); 80 sbi->sb->s_flags |= MS_RDONLY; 81 } 82 end_page_writeback(page); 83 dec_page_count(sbi, F2FS_WRITEBACK); 84 } while (bvec >= bio->bi_io_vec); --- 159 unchanged lines hidden (view full) --- 244 addr_array[ofs_in_node] = cpu_to_le32(new_addr); 245 set_page_dirty(node_page); 246} 247 248int reserve_new_block(struct dnode_of_data *dn) 249{ 250 struct f2fs_sb_info *sbi = F2FS_SB(dn->inode->i_sb); 251 |
252 if (is_inode_flag_set(F2FS_I(dn->inode), FI_NO_ALLOC)) | 252 if (unlikely(is_inode_flag_set(F2FS_I(dn->inode), FI_NO_ALLOC))) |
253 return -EPERM; 254 if (unlikely(!inc_valid_block_count(sbi, dn->inode, 1))) 255 return -ENOSPC; 256 257 trace_f2fs_reserve_new_block(dn->inode, dn->nid, dn->ofs_in_node); 258 259 __set_data_blkaddr(dn, NEW_ADDR); 260 dn->data_blkaddr = NEW_ADDR; --- 158 unchanged lines hidden (view full) --- 419 if (err) 420 return ERR_PTR(err); 421 f2fs_put_dnode(&dn); 422 423 if (dn.data_blkaddr == NULL_ADDR) 424 return ERR_PTR(-ENOENT); 425 426 /* By fallocate(), there is no cached page, but with NEW_ADDR */ | 253 return -EPERM; 254 if (unlikely(!inc_valid_block_count(sbi, dn->inode, 1))) 255 return -ENOSPC; 256 257 trace_f2fs_reserve_new_block(dn->inode, dn->nid, dn->ofs_in_node); 258 259 __set_data_blkaddr(dn, NEW_ADDR); 260 dn->data_blkaddr = NEW_ADDR; --- 158 unchanged lines hidden (view full) --- 419 if (err) 420 return ERR_PTR(err); 421 f2fs_put_dnode(&dn); 422 423 if (dn.data_blkaddr == NULL_ADDR) 424 return ERR_PTR(-ENOENT); 425 426 /* By fallocate(), there is no cached page, but with NEW_ADDR */ |
427 if (dn.data_blkaddr == NEW_ADDR) | 427 if (unlikely(dn.data_blkaddr == NEW_ADDR)) |
428 return ERR_PTR(-EINVAL); 429 430 page = grab_cache_page_write_begin(mapping, index, AOP_FLAG_NOFS); 431 if (!page) 432 return ERR_PTR(-ENOMEM); 433 434 if (PageUptodate(page)) { 435 unlock_page(page); 436 return page; 437 } 438 439 err = f2fs_submit_page_bio(sbi, page, dn.data_blkaddr, 440 sync ? READ_SYNC : READA); 441 if (err) 442 return ERR_PTR(err); 443 444 if (sync) { 445 wait_on_page_locked(page); | 428 return ERR_PTR(-EINVAL); 429 430 page = grab_cache_page_write_begin(mapping, index, AOP_FLAG_NOFS); 431 if (!page) 432 return ERR_PTR(-ENOMEM); 433 434 if (PageUptodate(page)) { 435 unlock_page(page); 436 return page; 437 } 438 439 err = f2fs_submit_page_bio(sbi, page, dn.data_blkaddr, 440 sync ? READ_SYNC : READA); 441 if (err) 442 return ERR_PTR(err); 443 444 if (sync) { 445 wait_on_page_locked(page); |
446 if (!PageUptodate(page)) { | 446 if (unlikely(!PageUptodate(page))) { |
447 f2fs_put_page(page, 0); 448 return ERR_PTR(-EIO); 449 } 450 } 451 return page; 452} 453 454/* --- 17 unchanged lines hidden (view full) --- 472 set_new_dnode(&dn, inode, NULL, NULL, 0); 473 err = get_dnode_of_data(&dn, index, LOOKUP_NODE); 474 if (err) { 475 f2fs_put_page(page, 1); 476 return ERR_PTR(err); 477 } 478 f2fs_put_dnode(&dn); 479 | 447 f2fs_put_page(page, 0); 448 return ERR_PTR(-EIO); 449 } 450 } 451 return page; 452} 453 454/* --- 17 unchanged lines hidden (view full) --- 472 set_new_dnode(&dn, inode, NULL, NULL, 0); 473 err = get_dnode_of_data(&dn, index, LOOKUP_NODE); 474 if (err) { 475 f2fs_put_page(page, 1); 476 return ERR_PTR(err); 477 } 478 f2fs_put_dnode(&dn); 479 |
480 if (dn.data_blkaddr == NULL_ADDR) { | 480 if (unlikely(dn.data_blkaddr == NULL_ADDR)) { |
481 f2fs_put_page(page, 1); 482 return ERR_PTR(-ENOENT); 483 } 484 485 if (PageUptodate(page)) 486 return page; 487 488 /* --- 8 unchanged lines hidden (view full) --- 497 return page; 498 } 499 500 err = f2fs_submit_page_bio(sbi, page, dn.data_blkaddr, READ_SYNC); 501 if (err) 502 return ERR_PTR(err); 503 504 lock_page(page); | 481 f2fs_put_page(page, 1); 482 return ERR_PTR(-ENOENT); 483 } 484 485 if (PageUptodate(page)) 486 return page; 487 488 /* --- 8 unchanged lines hidden (view full) --- 497 return page; 498 } 499 500 err = f2fs_submit_page_bio(sbi, page, dn.data_blkaddr, READ_SYNC); 501 if (err) 502 return ERR_PTR(err); 503 504 lock_page(page); |
505 if (!PageUptodate(page)) { | 505 if (unlikely(!PageUptodate(page))) { |
506 f2fs_put_page(page, 1); 507 return ERR_PTR(-EIO); 508 } | 506 f2fs_put_page(page, 1); 507 return ERR_PTR(-EIO); 508 } |
509 if (page->mapping != mapping) { | 509 if (unlikely(page->mapping != mapping)) { |
510 f2fs_put_page(page, 1); 511 goto repeat; 512 } 513 return page; 514} 515 516/* 517 * Caller ensures that this data page is never allocated. --- 11 unchanged lines hidden (view full) --- 529 struct page *page; 530 struct dnode_of_data dn; 531 int err; 532 533 set_new_dnode(&dn, inode, npage, npage, 0); 534 err = f2fs_reserve_block(&dn, index); 535 if (err) 536 return ERR_PTR(err); | 510 f2fs_put_page(page, 1); 511 goto repeat; 512 } 513 return page; 514} 515 516/* 517 * Caller ensures that this data page is never allocated. --- 11 unchanged lines hidden (view full) --- 529 struct page *page; 530 struct dnode_of_data dn; 531 int err; 532 533 set_new_dnode(&dn, inode, npage, npage, 0); 534 err = f2fs_reserve_block(&dn, index); 535 if (err) 536 return ERR_PTR(err); |
537 | |
538repeat: 539 page = grab_cache_page(mapping, index); 540 if (!page) 541 return ERR_PTR(-ENOMEM); 542 543 if (PageUptodate(page)) 544 return page; 545 546 if (dn.data_blkaddr == NEW_ADDR) { 547 zero_user_segment(page, 0, PAGE_CACHE_SIZE); 548 SetPageUptodate(page); 549 } else { 550 err = f2fs_submit_page_bio(sbi, page, dn.data_blkaddr, 551 READ_SYNC); 552 if (err) 553 return ERR_PTR(err); 554 lock_page(page); | 537repeat: 538 page = grab_cache_page(mapping, index); 539 if (!page) 540 return ERR_PTR(-ENOMEM); 541 542 if (PageUptodate(page)) 543 return page; 544 545 if (dn.data_blkaddr == NEW_ADDR) { 546 zero_user_segment(page, 0, PAGE_CACHE_SIZE); 547 SetPageUptodate(page); 548 } else { 549 err = f2fs_submit_page_bio(sbi, page, dn.data_blkaddr, 550 READ_SYNC); 551 if (err) 552 return ERR_PTR(err); 553 lock_page(page); |
555 if (!PageUptodate(page)) { | 554 if (unlikely(!PageUptodate(page))) { |
556 f2fs_put_page(page, 1); 557 return ERR_PTR(-EIO); 558 } | 555 f2fs_put_page(page, 1); 556 return ERR_PTR(-EIO); 557 } |
559 if (page->mapping != mapping) { | 558 if (unlikely(page->mapping != mapping)) { |
560 f2fs_put_page(page, 1); 561 goto repeat; 562 } 563 } 564 565 if (new_i_size && 566 i_size_read(inode) < ((index + 1) << PAGE_CACHE_SHIFT)) { 567 i_size_write(inode, ((index + 1) << PAGE_CACHE_SHIFT)); --- 268 unchanged lines hidden (view full) --- 836 if (dn.data_blkaddr == NEW_ADDR) { 837 zero_user_segment(page, 0, PAGE_CACHE_SIZE); 838 } else { 839 err = f2fs_submit_page_bio(sbi, page, dn.data_blkaddr, 840 READ_SYNC); 841 if (err) 842 return err; 843 lock_page(page); | 559 f2fs_put_page(page, 1); 560 goto repeat; 561 } 562 } 563 564 if (new_i_size && 565 i_size_read(inode) < ((index + 1) << PAGE_CACHE_SHIFT)) { 566 i_size_write(inode, ((index + 1) << PAGE_CACHE_SHIFT)); --- 268 unchanged lines hidden (view full) --- 835 if (dn.data_blkaddr == NEW_ADDR) { 836 zero_user_segment(page, 0, PAGE_CACHE_SIZE); 837 } else { 838 err = f2fs_submit_page_bio(sbi, page, dn.data_blkaddr, 839 READ_SYNC); 840 if (err) 841 return err; 842 lock_page(page); |
844 if (!PageUptodate(page)) { | 843 if (unlikely(!PageUptodate(page))) { |
845 f2fs_put_page(page, 1); 846 return -EIO; 847 } | 844 f2fs_put_page(page, 1); 845 return -EIO; 846 } |
848 if (page->mapping != mapping) { | 847 if (unlikely(page->mapping != mapping)) { |
849 f2fs_put_page(page, 1); 850 goto repeat; 851 } 852 } 853out: 854 SetPageUptodate(page); 855 clear_cold_data(page); 856 return 0; --- 88 unchanged lines hidden --- | 848 f2fs_put_page(page, 1); 849 goto repeat; 850 } 851 } 852out: 853 SetPageUptodate(page); 854 clear_cold_data(page); 855 return 0; --- 88 unchanged lines hidden --- |