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 ---