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

Commit 2bca1e23 authored by Jaegeuk Kim's avatar Jaegeuk Kim
Browse files

f2fs: clear page's up-to-date if block was deallocated



If page's on-disk block was deallocated, let's remove up-to-date flag to avoid
further access with wrong contents.

Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 3c642985
Loading
Loading
Loading
Loading
+5 −1
Original line number Original line Diff line number Diff line
@@ -1259,8 +1259,10 @@ int do_write_data_page(struct page *page, struct f2fs_io_info *fio)
	fio->blk_addr = dn.data_blkaddr;
	fio->blk_addr = dn.data_blkaddr;


	/* This page is already truncated */
	/* This page is already truncated */
	if (fio->blk_addr == NULL_ADDR)
	if (fio->blk_addr == NULL_ADDR) {
		ClearPageUptodate(page);
		goto out_writepage;
		goto out_writepage;
	}


	set_page_writeback(page);
	set_page_writeback(page);


@@ -1355,6 +1357,8 @@ static int f2fs_write_data_page(struct page *page,
	clear_cold_data(page);
	clear_cold_data(page);
out:
out:
	inode_dec_dirty_pages(inode);
	inode_dec_dirty_pages(inode);
	if (err)
		ClearPageUptodate(page);
	unlock_page(page);
	unlock_page(page);
	if (need_balance_fs)
	if (need_balance_fs)
		f2fs_balance_fs(sbi);
		f2fs_balance_fs(sbi);
+1 −0
Original line number Original line Diff line number Diff line
@@ -682,6 +682,7 @@ void f2fs_delete_entry(struct f2fs_dir_entry *dentry, struct page *page,
	if (bit_pos == NR_DENTRY_IN_BLOCK) {
	if (bit_pos == NR_DENTRY_IN_BLOCK) {
		truncate_hole(dir, page->index, page->index + 1);
		truncate_hole(dir, page->index, page->index + 1);
		clear_page_dirty_for_io(page);
		clear_page_dirty_for_io(page);
		ClearPagePrivate(page);
		ClearPageUptodate(page);
		ClearPageUptodate(page);
		inode_dec_dirty_pages(dir);
		inode_dec_dirty_pages(dir);
	}
	}
+2 −0
Original line number Original line Diff line number Diff line
@@ -1002,6 +1002,7 @@ static int read_node_page(struct page *page, int rw)
	get_node_info(sbi, page->index, &ni);
	get_node_info(sbi, page->index, &ni);


	if (unlikely(ni.blk_addr == NULL_ADDR)) {
	if (unlikely(ni.blk_addr == NULL_ADDR)) {
		ClearPageUptodate(page);
		f2fs_put_page(page, 1);
		f2fs_put_page(page, 1);
		return -ENOENT;
		return -ENOENT;
	}
	}
@@ -1313,6 +1314,7 @@ static int f2fs_write_node_page(struct page *page,


	/* This page is already truncated */
	/* This page is already truncated */
	if (unlikely(ni.blk_addr == NULL_ADDR)) {
	if (unlikely(ni.blk_addr == NULL_ADDR)) {
		ClearPageUptodate(page);
		dec_page_count(sbi, F2FS_DIRTY_NODES);
		dec_page_count(sbi, F2FS_DIRTY_NODES);
		unlock_page(page);
		unlock_page(page);
		return 0;
		return 0;