diff options
author | Jaegeuk Kim <jaegeuk@kernel.org> | 2015-02-25 22:25:01 -0500 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2015-04-10 18:08:26 -0400 |
commit | 2bca1e2388a8a9e8a3db0daf54fcc124516a3e83 (patch) | |
tree | e16f44f83f83a18ab3785f336812fb64d71a1023 | |
parent | 3c64298579a1343cbdf3d2f17adf774a58546aae (diff) |
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: Jaegeuk Kim <jaegeuk@kernel.org>
-rw-r--r-- | fs/f2fs/data.c | 6 | ||||
-rw-r--r-- | fs/f2fs/dir.c | 1 | ||||
-rw-r--r-- | fs/f2fs/node.c | 2 |
3 files changed, 8 insertions, 1 deletions
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index ae5c41444e8f..62e31b2aa131 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c | |||
@@ -1259,8 +1259,10 @@ int do_write_data_page(struct page *page, struct f2fs_io_info *fio) | |||
1259 | fio->blk_addr = dn.data_blkaddr; | 1259 | fio->blk_addr = dn.data_blkaddr; |
1260 | 1260 | ||
1261 | /* This page is already truncated */ | 1261 | /* This page is already truncated */ |
1262 | if (fio->blk_addr == NULL_ADDR) | 1262 | if (fio->blk_addr == NULL_ADDR) { |
1263 | ClearPageUptodate(page); | ||
1263 | goto out_writepage; | 1264 | goto out_writepage; |
1265 | } | ||
1264 | 1266 | ||
1265 | set_page_writeback(page); | 1267 | set_page_writeback(page); |
1266 | 1268 | ||
@@ -1355,6 +1357,8 @@ done: | |||
1355 | clear_cold_data(page); | 1357 | clear_cold_data(page); |
1356 | out: | 1358 | out: |
1357 | inode_dec_dirty_pages(inode); | 1359 | inode_dec_dirty_pages(inode); |
1360 | if (err) | ||
1361 | ClearPageUptodate(page); | ||
1358 | unlock_page(page); | 1362 | unlock_page(page); |
1359 | if (need_balance_fs) | 1363 | if (need_balance_fs) |
1360 | f2fs_balance_fs(sbi); | 1364 | f2fs_balance_fs(sbi); |
diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c index 583896cb5346..590aeef6f85e 100644 --- a/fs/f2fs/dir.c +++ b/fs/f2fs/dir.c | |||
@@ -682,6 +682,7 @@ void f2fs_delete_entry(struct f2fs_dir_entry *dentry, struct page *page, | |||
682 | if (bit_pos == NR_DENTRY_IN_BLOCK) { | 682 | if (bit_pos == NR_DENTRY_IN_BLOCK) { |
683 | truncate_hole(dir, page->index, page->index + 1); | 683 | truncate_hole(dir, page->index, page->index + 1); |
684 | clear_page_dirty_for_io(page); | 684 | clear_page_dirty_for_io(page); |
685 | ClearPagePrivate(page); | ||
685 | ClearPageUptodate(page); | 686 | ClearPageUptodate(page); |
686 | inode_dec_dirty_pages(dir); | 687 | inode_dec_dirty_pages(dir); |
687 | } | 688 | } |
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index 28423697e97a..35a911722d59 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c | |||
@@ -1002,6 +1002,7 @@ static int read_node_page(struct page *page, int rw) | |||
1002 | get_node_info(sbi, page->index, &ni); | 1002 | get_node_info(sbi, page->index, &ni); |
1003 | 1003 | ||
1004 | if (unlikely(ni.blk_addr == NULL_ADDR)) { | 1004 | if (unlikely(ni.blk_addr == NULL_ADDR)) { |
1005 | ClearPageUptodate(page); | ||
1005 | f2fs_put_page(page, 1); | 1006 | f2fs_put_page(page, 1); |
1006 | return -ENOENT; | 1007 | return -ENOENT; |
1007 | } | 1008 | } |
@@ -1313,6 +1314,7 @@ static int f2fs_write_node_page(struct page *page, | |||
1313 | 1314 | ||
1314 | /* This page is already truncated */ | 1315 | /* This page is already truncated */ |
1315 | if (unlikely(ni.blk_addr == NULL_ADDR)) { | 1316 | if (unlikely(ni.blk_addr == NULL_ADDR)) { |
1317 | ClearPageUptodate(page); | ||
1316 | dec_page_count(sbi, F2FS_DIRTY_NODES); | 1318 | dec_page_count(sbi, F2FS_DIRTY_NODES); |
1317 | unlock_page(page); | 1319 | unlock_page(page); |
1318 | return 0; | 1320 | return 0; |