From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S937054AbcIXGB0 (ORCPT ); Sat, 24 Sep 2016 02:01:26 -0400 Received: from szxga02-in.huawei.com ([119.145.14.65]:50376 "EHLO szxga02-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752053AbcIXGBZ (ORCPT ); Sat, 24 Sep 2016 02:01:25 -0400 Subject: Re: [f2fs-dev] [PATCH 1/2] f2fs: use crc and cp version to determine roll-forward recovery To: Jaegeuk Kim , Chao Yu References: <20160920025504.72524-1-jaegeuk@kernel.org> <6d5c6ce9-b9d6-badd-244a-b6126ce14546@kernel.org> <20160921004554.GB77057@jaegeuk> CC: , , From: Chao Yu Message-ID: <64ec1af3-f9ca-77ce-9f99-3ceaee48e9f8@huawei.com> Date: Sat, 24 Sep 2016 14:00:41 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.0 MIME-Version: 1.0 In-Reply-To: <20160921004554.GB77057@jaegeuk> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit X-Originating-IP: [10.134.22.195] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020204.57E6168E.0171,ss=1,re=0.000,recu=0.000,reip=0.000,cl=1,cld=1,fgs=0, ip=0.0.0.0, so=2013-06-18 04:22:30, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: c60af5ca02b15cfa5c4f60f7e065ab83 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2016/9/21 8:45, Jaegeuk Kim wrote: > @@ -259,40 +290,26 @@ 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); > + __u64 crc; > > - rn->footer.cp_ver = ckpt->checkpoint_ver; > + crc = le32_to_cpu(*((__le32 *)((unsigned char *)ckpt + crc_offset))); > + cp_ver |= (crc << 32); How about using '^=' here? > + 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) > -{ > - 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) > +static inline bool is_recoverable_dnode(struct page *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); > + __u64 crc; > > -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); > + crc = le32_to_cpu(*((__le32 *)((unsigned char *)ckpt + crc_offset))); > + cp_ver |= (crc << 32); > + return cpu_to_le64(cp_ver) == cpver_of_node(page); > } cpu_to_le64(cp_ver) == cpver_of_node(page) ^ (crc << 32) Thanks,