summaryrefslogtreecommitdiffstats
path: root/fs/f2fs
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk@kernel.org>2014-12-23 16:26:31 -0800
committerJaegeuk Kim <jaegeuk@kernel.org>2015-01-09 17:02:25 -0800
commit09eb483e895f36fd002e88c878e9578c359aa468 (patch)
tree8237cf3cae658a3cb1e79728617bb1ecfa2fadb1 /fs/f2fs
parentb9a2c252071d44d4a22082611db84272be1f3b49 (diff)
downloadlinux-09eb483e895f36fd002e88c878e9578c359aa468.tar.gz
linux-09eb483e895f36fd002e88c878e9578c359aa468.tar.bz2
linux-09eb483e895f36fd002e88c878e9578c359aa468.zip
f2fs: fix missing cold bit during recovery
In do_recover_data, we find and update previous node pages after updating its new block addresses. After then, we call fill_node_footer without reset field, we erase its cold bit so that this new cold node block is written to wrong log area. This patch fixes not to miss its old flag. Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs/f2fs')
-rw-r--r--fs/f2fs/node.h10
1 files changed, 9 insertions, 1 deletions
diff --git a/fs/f2fs/node.h b/fs/f2fs/node.h
index fa6f95968b42..cac8a3d9acbd 100644
--- a/fs/f2fs/node.h
+++ b/fs/f2fs/node.h
@@ -212,11 +212,19 @@ static inline void fill_node_footer(struct page *page, nid_t nid,
nid_t ino, unsigned int ofs, bool reset)
{
struct f2fs_node *rn = F2FS_NODE(page);
+ unsigned int old_flag = 0;
+
if (reset)
memset(rn, 0, sizeof(*rn));
+ else
+ old_flag = le32_to_cpu(rn->footer.flag);
+
rn->footer.nid = cpu_to_le32(nid);
rn->footer.ino = cpu_to_le32(ino);
- rn->footer.flag = cpu_to_le32(ofs << OFFSET_BIT_SHIFT);
+
+ /* should remain old flag bits such as COLD_BIT_SHIFT */
+ rn->footer.flag = cpu_to_le32((ofs << OFFSET_BIT_SHIFT) |
+ (old_flag & OFFSET_BIT_MASK));
}
static inline void copy_node_footer(struct page *dst, struct page *src)