|
@@ -229,6 +229,37 @@ static inline void set_to_next_nat(struct f2fs_nm_info *nm_i, nid_t start_nid)
|
|
|
f2fs_change_bit(block_off, nm_i->nat_bitmap);
|
|
|
}
|
|
|
|
|
|
+static inline nid_t ino_of_node(struct page *node_page)
|
|
|
+{
|
|
|
+ struct f2fs_node *rn = F2FS_NODE(node_page);
|
|
|
+ return le32_to_cpu(rn->footer.ino);
|
|
|
+}
|
|
|
+
|
|
|
+static inline nid_t nid_of_node(struct page *node_page)
|
|
|
+{
|
|
|
+ struct f2fs_node *rn = F2FS_NODE(node_page);
|
|
|
+ return le32_to_cpu(rn->footer.nid);
|
|
|
+}
|
|
|
+
|
|
|
+static inline unsigned int ofs_of_node(struct page *node_page)
|
|
|
+{
|
|
|
+ struct f2fs_node *rn = F2FS_NODE(node_page);
|
|
|
+ unsigned flag = le32_to_cpu(rn->footer.flag);
|
|
|
+ return flag >> OFFSET_BIT_SHIFT;
|
|
|
+}
|
|
|
+
|
|
|
+static inline __u64 cpver_of_node(struct page *node_page)
|
|
|
+{
|
|
|
+ struct f2fs_node *rn = F2FS_NODE(node_page);
|
|
|
+ return le64_to_cpu(rn->footer.cp_ver);
|
|
|
+}
|
|
|
+
|
|
|
+static inline block_t next_blkaddr_of_node(struct page *node_page)
|
|
|
+{
|
|
|
+ struct f2fs_node *rn = F2FS_NODE(node_page);
|
|
|
+ return le32_to_cpu(rn->footer.next_blkaddr);
|
|
|
+}
|
|
|
+
|
|
|
static inline void fill_node_footer(struct page *page, nid_t nid,
|
|
|
nid_t ino, unsigned int ofs, bool reset)
|
|
|
{
|
|
@@ -259,40 +290,30 @@ static inline void fill_node_footer_blkaddr(struct page *page, block_t blkaddr)
|
|
|
{
|
|
|
struct f2fs_checkpoint *ckpt = F2FS_CKPT(F2FS_P_SB(page));
|
|
|
struct f2fs_node *rn = F2FS_NODE(page);
|
|
|
+ size_t crc_offset = le32_to_cpu(ckpt->checksum_offset);
|
|
|
+ __u64 cp_ver = le64_to_cpu(ckpt->checkpoint_ver);
|
|
|
|
|
|
- rn->footer.cp_ver = ckpt->checkpoint_ver;
|
|
|
+ if (is_set_ckpt_flags(ckpt, CP_CRC_RECOVERY_FLAG)) {
|
|
|
+ __u64 crc = le32_to_cpu(*((__le32 *)
|
|
|
+ ((unsigned char *)ckpt + crc_offset)));
|
|
|
+ cp_ver |= (crc << 32);
|
|
|
+ }
|
|
|
+ rn->footer.cp_ver = cpu_to_le64(cp_ver);
|
|
|
rn->footer.next_blkaddr = cpu_to_le32(blkaddr);
|
|
|
}
|
|
|
|
|
|
-static inline nid_t ino_of_node(struct page *node_page)
|
|
|
-{
|
|
|
- struct f2fs_node *rn = F2FS_NODE(node_page);
|
|
|
- return le32_to_cpu(rn->footer.ino);
|
|
|
-}
|
|
|
-
|
|
|
-static inline nid_t nid_of_node(struct page *node_page)
|
|
|
+static inline bool is_recoverable_dnode(struct page *page)
|
|
|
{
|
|
|
- struct f2fs_node *rn = F2FS_NODE(node_page);
|
|
|
- return le32_to_cpu(rn->footer.nid);
|
|
|
-}
|
|
|
-
|
|
|
-static inline unsigned int ofs_of_node(struct page *node_page)
|
|
|
-{
|
|
|
- struct f2fs_node *rn = F2FS_NODE(node_page);
|
|
|
- unsigned flag = le32_to_cpu(rn->footer.flag);
|
|
|
- return flag >> OFFSET_BIT_SHIFT;
|
|
|
-}
|
|
|
-
|
|
|
-static inline unsigned long long cpver_of_node(struct page *node_page)
|
|
|
-{
|
|
|
- struct f2fs_node *rn = F2FS_NODE(node_page);
|
|
|
- return le64_to_cpu(rn->footer.cp_ver);
|
|
|
-}
|
|
|
+ struct f2fs_checkpoint *ckpt = F2FS_CKPT(F2FS_P_SB(page));
|
|
|
+ size_t crc_offset = le32_to_cpu(ckpt->checksum_offset);
|
|
|
+ __u64 cp_ver = cur_cp_version(ckpt);
|
|
|
|
|
|
-static inline block_t next_blkaddr_of_node(struct page *node_page)
|
|
|
-{
|
|
|
- struct f2fs_node *rn = F2FS_NODE(node_page);
|
|
|
- return le32_to_cpu(rn->footer.next_blkaddr);
|
|
|
+ if (is_set_ckpt_flags(ckpt, CP_CRC_RECOVERY_FLAG)) {
|
|
|
+ __u64 crc = le32_to_cpu(*((__le32 *)
|
|
|
+ ((unsigned char *)ckpt + crc_offset)));
|
|
|
+ cp_ver |= (crc << 32);
|
|
|
+ }
|
|
|
+ return cpu_to_le64(cp_ver) == cpver_of_node(page);
|
|
|
}
|
|
|
|
|
|
/*
|