net/mlx4_core: Avoid setting ports to auto when only one port type is supported
[cascardo/linux.git] / fs / f2fs / node.h
index fc76845..868bec6 100644 (file)
@@ -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);
 }
 
 /*