aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHuajun Li <huajun.li@intel.com>2013-11-10 10:13:18 -0500
committerJaegeuk Kim <jaegeuk.kim@samsung.com>2013-12-22 20:18:03 -0500
commitb600965c43f9690eb481d0c19948e109b685bde7 (patch)
treea74052ffde2e60c1a179e4e72a99ba3acd5eb205
parent0daaad97dcdc5cf91d368894a0954704e9a2cf2d (diff)
f2fs: add a new function: f2fs_reserve_block()
Add the function f2fs_reserve_block() to easily reserve new blocks, and use it to clean up more codes. Signed-off-by: Huajun Li <huajun.li@intel.com> Signed-off-by: Haicheng Li <haicheng.li@linux.intel.com> Signed-off-by: Weihong Xu <weihong.xu@intel.com> Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
-rw-r--r--fs/f2fs/data.c50
-rw-r--r--fs/f2fs/f2fs.h1
-rw-r--r--fs/f2fs/file.c38
3 files changed, 30 insertions, 59 deletions
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index 711722018b8e..2d02cf36d806 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -64,6 +64,22 @@ int reserve_new_block(struct dnode_of_data *dn)
64 return 0; 64 return 0;
65} 65}
66 66
67int f2fs_reserve_block(struct dnode_of_data *dn, pgoff_t index)
68{
69 bool need_put = dn->inode_page ? false : true;
70 int err;
71
72 err = get_dnode_of_data(dn, index, ALLOC_NODE);
73 if (err)
74 return err;
75 if (dn->data_blkaddr == NULL_ADDR)
76 err = reserve_new_block(dn);
77
78 if (need_put)
79 f2fs_put_dnode(dn);
80 return err;
81}
82
67static int check_extent_cache(struct inode *inode, pgoff_t pgofs, 83static int check_extent_cache(struct inode *inode, pgoff_t pgofs,
68 struct buffer_head *bh_result) 84 struct buffer_head *bh_result)
69{ 85{
@@ -314,19 +330,10 @@ struct page *get_new_data_page(struct inode *inode,
314 int err; 330 int err;
315 331
316 set_new_dnode(&dn, inode, npage, npage, 0); 332 set_new_dnode(&dn, inode, npage, npage, 0);
317 err = get_dnode_of_data(&dn, index, ALLOC_NODE); 333 err = f2fs_reserve_block(&dn, index);
318 if (err) 334 if (err)
319 return ERR_PTR(err); 335 return ERR_PTR(err);
320 336
321 if (dn.data_blkaddr == NULL_ADDR) {
322 if (reserve_new_block(&dn)) {
323 if (!npage)
324 f2fs_put_dnode(&dn);
325 return ERR_PTR(-ENOSPC);
326 }
327 }
328 if (!npage)
329 f2fs_put_dnode(&dn);
330repeat: 337repeat:
331 page = grab_cache_page(mapping, index); 338 page = grab_cache_page(mapping, index);
332 if (!page) 339 if (!page)
@@ -707,21 +714,15 @@ repeat:
707 *pagep = page; 714 *pagep = page;
708 715
709 f2fs_lock_op(sbi); 716 f2fs_lock_op(sbi);
710
711 set_new_dnode(&dn, inode, NULL, NULL, 0); 717 set_new_dnode(&dn, inode, NULL, NULL, 0);
712 err = get_dnode_of_data(&dn, index, ALLOC_NODE); 718 err = f2fs_reserve_block(&dn, index);
713 if (err)
714 goto err;
715
716 if (dn.data_blkaddr == NULL_ADDR)
717 err = reserve_new_block(&dn);
718
719 f2fs_put_dnode(&dn);
720 if (err)
721 goto err;
722
723 f2fs_unlock_op(sbi); 719 f2fs_unlock_op(sbi);
724 720
721 if (err) {
722 f2fs_put_page(page, 1);
723 return err;
724 }
725
725 if ((len == PAGE_CACHE_SIZE) || PageUptodate(page)) 726 if ((len == PAGE_CACHE_SIZE) || PageUptodate(page))
726 return 0; 727 return 0;
727 728
@@ -754,11 +755,6 @@ out:
754 SetPageUptodate(page); 755 SetPageUptodate(page);
755 clear_cold_data(page); 756 clear_cold_data(page);
756 return 0; 757 return 0;
757
758err:
759 f2fs_unlock_op(sbi);
760 f2fs_put_page(page, 1);
761 return err;
762} 758}
763 759
764static int f2fs_write_end(struct file *file, 760static int f2fs_write_end(struct file *file,
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 417280aa0549..c8eb37e3b015 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -1130,6 +1130,7 @@ void destroy_checkpoint_caches(void);
1130 * data.c 1130 * data.c
1131 */ 1131 */
1132int reserve_new_block(struct dnode_of_data *); 1132int reserve_new_block(struct dnode_of_data *);
1133int f2fs_reserve_block(struct dnode_of_data *, pgoff_t);
1133void update_extent_cache(block_t, struct dnode_of_data *); 1134void update_extent_cache(block_t, struct dnode_of_data *);
1134struct page *find_data_page(struct inode *, pgoff_t, bool); 1135struct page *find_data_page(struct inode *, pgoff_t, bool);
1135struct page *get_lock_data_page(struct inode *, pgoff_t); 1136struct page *get_lock_data_page(struct inode *, pgoff_t);
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 7d714f4972d5..1cd8e44b637f 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -33,7 +33,6 @@ static int f2fs_vm_page_mkwrite(struct vm_area_struct *vma,
33 struct page *page = vmf->page; 33 struct page *page = vmf->page;
34 struct inode *inode = file_inode(vma->vm_file); 34 struct inode *inode = file_inode(vma->vm_file);
35 struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); 35 struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
36 block_t old_blk_addr;
37 struct dnode_of_data dn; 36 struct dnode_of_data dn;
38 int err; 37 int err;
39 38
@@ -44,24 +43,10 @@ static int f2fs_vm_page_mkwrite(struct vm_area_struct *vma,
44 /* block allocation */ 43 /* block allocation */
45 f2fs_lock_op(sbi); 44 f2fs_lock_op(sbi);
46 set_new_dnode(&dn, inode, NULL, NULL, 0); 45 set_new_dnode(&dn, inode, NULL, NULL, 0);
47 err = get_dnode_of_data(&dn, page->index, ALLOC_NODE); 46 err = f2fs_reserve_block(&dn, page->index);
48 if (err) {
49 f2fs_unlock_op(sbi);
50 goto out;
51 }
52
53 old_blk_addr = dn.data_blkaddr;
54
55 if (old_blk_addr == NULL_ADDR) {
56 err = reserve_new_block(&dn);
57 if (err) {
58 f2fs_put_dnode(&dn);
59 f2fs_unlock_op(sbi);
60 goto out;
61 }
62 }
63 f2fs_put_dnode(&dn);
64 f2fs_unlock_op(sbi); 47 f2fs_unlock_op(sbi);
48 if (err)
49 goto out;
65 50
66 file_update_time(vma->vm_file); 51 file_update_time(vma->vm_file);
67 lock_page(page); 52 lock_page(page);
@@ -532,22 +517,11 @@ static int expand_inode_data(struct inode *inode, loff_t offset,
532 517
533 f2fs_lock_op(sbi); 518 f2fs_lock_op(sbi);
534 set_new_dnode(&dn, inode, NULL, NULL, 0); 519 set_new_dnode(&dn, inode, NULL, NULL, 0);
535 ret = get_dnode_of_data(&dn, index, ALLOC_NODE); 520 ret = f2fs_reserve_block(&dn, index);
536 if (ret) { 521 f2fs_unlock_op(sbi);
537 f2fs_unlock_op(sbi); 522 if (ret)
538 break; 523 break;
539 }
540 524
541 if (dn.data_blkaddr == NULL_ADDR) {
542 ret = reserve_new_block(&dn);
543 if (ret) {
544 f2fs_put_dnode(&dn);
545 f2fs_unlock_op(sbi);
546 break;
547 }
548 }
549 f2fs_put_dnode(&dn);
550 f2fs_unlock_op(sbi);
551 525
552 if (pg_start == pg_end) 526 if (pg_start == pg_end)
553 new_size = offset + len; 527 new_size = offset + len;