Commit d54c795b authored by Chao Yu's avatar Chao Yu Committed by Jaegeuk Kim
Browse files

f2fs: fix error path when fail to read inline data



We should unlock page in ->readpage() path and also should unlock & release page
in error path of ->write_begin() to avoid deadlock or memory leak.
So let's add release code to fix the problem when we fail to read inline data.

Signed-off-by: default avatarChao Yu <chao2.yu@samsung.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk.kim@samsung.com>
parent 2d7b822a
Loading
Loading
Loading
Loading
+10 −4
Original line number Original line Diff line number Diff line
@@ -942,13 +942,19 @@ inline_data:
	if (dn.data_blkaddr == NEW_ADDR) {
	if (dn.data_blkaddr == NEW_ADDR) {
		zero_user_segment(page, 0, PAGE_CACHE_SIZE);
		zero_user_segment(page, 0, PAGE_CACHE_SIZE);
	} else {
	} else {
		if (f2fs_has_inline_data(inode))
		if (f2fs_has_inline_data(inode)) {
			err = f2fs_read_inline_data(inode, page);
			err = f2fs_read_inline_data(inode, page);
		else
			if (err) {
				page_cache_release(page);
				return err;
			}
		} else {
			err = f2fs_submit_page_bio(sbi, page, dn.data_blkaddr,
			err = f2fs_submit_page_bio(sbi, page, dn.data_blkaddr,
							READ_SYNC);
							READ_SYNC);
			if (err)
			if (err)
				return err;
				return err;
		}

		lock_page(page);
		lock_page(page);
		if (unlikely(!PageUptodate(page))) {
		if (unlikely(!PageUptodate(page))) {
			f2fs_put_page(page, 1);
			f2fs_put_page(page, 1);
+3 −1
Original line number Original line Diff line number Diff line
@@ -45,8 +45,10 @@ int f2fs_read_inline_data(struct inode *inode, struct page *page)
	}
	}


	ipage = get_node_page(sbi, inode->i_ino);
	ipage = get_node_page(sbi, inode->i_ino);
	if (IS_ERR(ipage))
	if (IS_ERR(ipage)) {
		unlock_page(page);
		return PTR_ERR(ipage);
		return PTR_ERR(ipage);
	}


	zero_user_segment(page, MAX_INLINE_DATA, PAGE_CACHE_SIZE);
	zero_user_segment(page, MAX_INLINE_DATA, PAGE_CACHE_SIZE);