aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk@kernel.org>2015-02-25 22:25:01 -0500
committerJaegeuk Kim <jaegeuk@kernel.org>2015-04-10 18:08:26 -0400
commit2bca1e2388a8a9e8a3db0daf54fcc124516a3e83 (patch)
treee16f44f83f83a18ab3785f336812fb64d71a1023
parent3c64298579a1343cbdf3d2f17adf774a58546aae (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.c6
-rw-r--r--fs/f2fs/dir.c1
-rw-r--r--fs/f2fs/node.c2
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);
1356out: 1358out:
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;