aboutsummaryrefslogtreecommitdiffstats
path: root/fs/f2fs
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk@kernel.org>2014-12-23 19:26:31 -0500
committerJaegeuk Kim <jaegeuk@kernel.org>2015-01-09 20:02:25 -0500
commit09eb483e895f36fd002e88c878e9578c359aa468 (patch)
tree8237cf3cae658a3cb1e79728617bb1ecfa2fadb1 /fs/f2fs
parentb9a2c252071d44d4a22082611db84272be1f3b49 (diff)
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,
212 nid_t ino, unsigned int ofs, bool reset) 212 nid_t ino, unsigned int ofs, bool reset)
213{ 213{
214 struct f2fs_node *rn = F2FS_NODE(page); 214 struct f2fs_node *rn = F2FS_NODE(page);
215 unsigned int old_flag = 0;
216
215 if (reset) 217 if (reset)
216 memset(rn, 0, sizeof(*rn)); 218 memset(rn, 0, sizeof(*rn));
219 else
220 old_flag = le32_to_cpu(rn->footer.flag);
221
217 rn->footer.nid = cpu_to_le32(nid); 222 rn->footer.nid = cpu_to_le32(nid);
218 rn->footer.ino = cpu_to_le32(ino); 223 rn->footer.ino = cpu_to_le32(ino);
219 rn->footer.flag = cpu_to_le32(ofs << OFFSET_BIT_SHIFT); 224
225 /* should remain old flag bits such as COLD_BIT_SHIFT */
226 rn->footer.flag = cpu_to_le32((ofs << OFFSET_BIT_SHIFT) |
227 (old_flag & OFFSET_BIT_MASK));
220} 228}
221 229
222static inline void copy_node_footer(struct page *dst, struct page *src) 230static inline void copy_node_footer(struct page *dst, struct page *src)