Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b600965c authored by Huajun Li's avatar Huajun Li Committed by Jaegeuk Kim
Browse files

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: default avatarHuajun Li <huajun.li@intel.com>
Signed-off-by: default avatarHaicheng Li <haicheng.li@linux.intel.com>
Signed-off-by: default avatarWeihong Xu <weihong.xu@intel.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk.kim@samsung.com>
parent 0daaad97
Loading
Loading
Loading
Loading
+23 −27
Original line number Diff line number Diff line
@@ -64,6 +64,22 @@ int reserve_new_block(struct dnode_of_data *dn)
	return 0;
}

int f2fs_reserve_block(struct dnode_of_data *dn, pgoff_t index)
{
	bool need_put = dn->inode_page ? false : true;
	int err;

	err = get_dnode_of_data(dn, index, ALLOC_NODE);
	if (err)
		return err;
	if (dn->data_blkaddr == NULL_ADDR)
		err = reserve_new_block(dn);

	if (need_put)
		f2fs_put_dnode(dn);
	return err;
}

static int check_extent_cache(struct inode *inode, pgoff_t pgofs,
					struct buffer_head *bh_result)
{
@@ -314,19 +330,10 @@ struct page *get_new_data_page(struct inode *inode,
	int err;

	set_new_dnode(&dn, inode, npage, npage, 0);
	err = get_dnode_of_data(&dn, index, ALLOC_NODE);
	err = f2fs_reserve_block(&dn, index);
	if (err)
		return ERR_PTR(err);

	if (dn.data_blkaddr == NULL_ADDR) {
		if (reserve_new_block(&dn)) {
			if (!npage)
				f2fs_put_dnode(&dn);
			return ERR_PTR(-ENOSPC);
		}
	}
	if (!npage)
		f2fs_put_dnode(&dn);
repeat:
	page = grab_cache_page(mapping, index);
	if (!page)
@@ -707,21 +714,15 @@ static int f2fs_write_begin(struct file *file, struct address_space *mapping,
	*pagep = page;

	f2fs_lock_op(sbi);

	set_new_dnode(&dn, inode, NULL, NULL, 0);
	err = get_dnode_of_data(&dn, index, ALLOC_NODE);
	if (err)
		goto err;

	if (dn.data_blkaddr == NULL_ADDR)
		err = reserve_new_block(&dn);

	f2fs_put_dnode(&dn);
	if (err)
		goto err;

	err = f2fs_reserve_block(&dn, index);
	f2fs_unlock_op(sbi);

	if (err) {
		f2fs_put_page(page, 1);
		return err;
	}

	if ((len == PAGE_CACHE_SIZE) || PageUptodate(page))
		return 0;

@@ -754,11 +755,6 @@ static int f2fs_write_begin(struct file *file, struct address_space *mapping,
	SetPageUptodate(page);
	clear_cold_data(page);
	return 0;

err:
	f2fs_unlock_op(sbi);
	f2fs_put_page(page, 1);
	return err;
}

static int f2fs_write_end(struct file *file,
+1 −0
Original line number Diff line number Diff line
@@ -1130,6 +1130,7 @@ void destroy_checkpoint_caches(void);
 * data.c
 */
int reserve_new_block(struct dnode_of_data *);
int f2fs_reserve_block(struct dnode_of_data *, pgoff_t);
void update_extent_cache(block_t, struct dnode_of_data *);
struct page *find_data_page(struct inode *, pgoff_t, bool);
struct page *get_lock_data_page(struct inode *, pgoff_t);
+6 −32
Original line number Diff line number Diff line
@@ -33,7 +33,6 @@ static int f2fs_vm_page_mkwrite(struct vm_area_struct *vma,
	struct page *page = vmf->page;
	struct inode *inode = file_inode(vma->vm_file);
	struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
	block_t old_blk_addr;
	struct dnode_of_data dn;
	int err;

@@ -44,24 +43,10 @@ static int f2fs_vm_page_mkwrite(struct vm_area_struct *vma,
	/* block allocation */
	f2fs_lock_op(sbi);
	set_new_dnode(&dn, inode, NULL, NULL, 0);
	err = get_dnode_of_data(&dn, page->index, ALLOC_NODE);
	if (err) {
		f2fs_unlock_op(sbi);
		goto out;
	}

	old_blk_addr = dn.data_blkaddr;

	if (old_blk_addr == NULL_ADDR) {
		err = reserve_new_block(&dn);
		if (err) {
			f2fs_put_dnode(&dn);
	err = f2fs_reserve_block(&dn, page->index);
	f2fs_unlock_op(sbi);
	if (err)
		goto out;
		}
	}
	f2fs_put_dnode(&dn);
	f2fs_unlock_op(sbi);

	file_update_time(vma->vm_file);
	lock_page(page);
@@ -532,22 +517,11 @@ static int expand_inode_data(struct inode *inode, loff_t offset,

		f2fs_lock_op(sbi);
		set_new_dnode(&dn, inode, NULL, NULL, 0);
		ret = get_dnode_of_data(&dn, index, ALLOC_NODE);
		if (ret) {
		ret = f2fs_reserve_block(&dn, index);
		f2fs_unlock_op(sbi);
		if (ret)
			break;
		}

		if (dn.data_blkaddr == NULL_ADDR) {
			ret = reserve_new_block(&dn);
			if (ret) {
				f2fs_put_dnode(&dn);
				f2fs_unlock_op(sbi);
				break;
			}
		}
		f2fs_put_dnode(&dn);
		f2fs_unlock_op(sbi);

		if (pg_start == pg_end)
			new_size = offset + len;