From patchwork Wed Aug 23 07:57:59 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qu Wenruo X-Patchwork-Id: 9916803 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id E5B9E60327 for ; Wed, 23 Aug 2017 07:58:22 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D872C288BD for ; Wed, 23 Aug 2017 07:58:22 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id CD3AD28948; Wed, 23 Aug 2017 07:58:22 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7D95F288BD for ; Wed, 23 Aug 2017 07:58:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753494AbdHWH6P (ORCPT ); Wed, 23 Aug 2017 03:58:15 -0400 Received: from mout.gmx.net ([212.227.17.20]:52639 "EHLO mout.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753415AbdHWH6N (ORCPT ); Wed, 23 Aug 2017 03:58:13 -0400 Received: from localhost.localdomain ([45.32.39.184]) by mail.gmx.com (mrgmx103 [212.227.17.174]) with ESMTPSA (Nemesis) id 0M3R1g-1dT2Bu0TLs-00qzJV; Wed, 23 Aug 2017 09:58:10 +0200 From: Qu Wenruo To: linux-btrfs@vger.kernel.org Cc: dsterba@suse.cz Subject: [PATCH v2 4/4] btrfs: Add checker for EXTENT_CSUM Date: Wed, 23 Aug 2017 16:57:59 +0900 Message-Id: <20170823075759.13982-5-quwenruo.btrfs@gmx.com> X-Mailer: git-send-email 2.13.3 In-Reply-To: <20170823075759.13982-1-quwenruo.btrfs@gmx.com> References: <20170823075759.13982-1-quwenruo.btrfs@gmx.com> X-Provags-ID: V03:K0:+Bm/ehBxh9BHjV66ZKjM1ZoiG5cgCE9TEA4ERU+Nfdz98hoZbh5 yhwMV//PExhsmvjmHQifiYVCvxwouvvInwNKz9YEFQI7FDjvCMzAt8yW0IcS6D2J9msy0T7 IMr3E+1dp0vYVrAxNaqYqZUanj/zMQsfqJ9GvRo6/vgFKhwROXqaosxRXlrY6VelQCrnz/g CX++lHZu8hn1bX3vGQRoA== X-UI-Out-Filterresults: notjunk:1; V01:K0:q9uEpsH/934=:TK3HENpZDHOk6BrBHOqX+U bQ6GsevZTvcfTrUT5uyFdgqhnj0qAo3SZGzUy/BXLDYmWPe0DDbdKSoabv2JI12foV4il5fig eIe8GTfTOXbt7mR8M0jajzD5bfYW4ExFU8hkmFVcwIzl5bRrYTDXd7/bn82lFD9WcZnSbij6w dHqXFzNUZh6+mU4Zo+rbdO8CbbTQC4mDd7dgVrUuDQqLigm8qASQEvJ1zE1sabSzLTPw9CEbM /BU7lKivL3Qa+nQHpc0HOEou1kCNwEWLI42hkZ9raYRS8678Hj9I8xoBnHjQ+ly4aIEb/CItZ K7ljohrqcYviAE6NbJqaY/cCCAE+8HFYy7fEo5yfHi29jKlmTETejrTy4869X+JNjWI9FMLK3 NAVGbIrefgqgtKnUTMRKhtjol+9Ym0kRKDR/iXSfrEbInbvpb2aJpRBHPSlyJxnGSuvqhRzDP I4t6r6IJ0ldy9kLMfOfD61Fdf+Zt2mzahJCIIh8W4UU9M9pZn5cN3o9Nl+/9j8taFCd+QASZX xvhs8DnrMwRC1/BXiz1zamrl19nfMsOYJbzUakqBLOCRBCWLGwRyf6aIQftaoXSIqwkxV3Una LYFgGg1/wpnzOQi9lBGPSErbYL+TaX0IsWFKpbCDDCVmz4Lfe7k8swlkJuWIQ/cccjTr7fL+b IgWoUg/8Jeo52rzM5eoej4Ye7ikGequlScBVlxORQpLF+ZnCkeUl+BGSNJAVmU2UdvklFAaWJ LSoX7g+s/EJf2Uqi2zBzgIFeG3q4yUl5yGtolRVY9YGG02PVZgcw9tolvlVp/a0QizNGbY4lE bsfqqa3nbG4rZLxXlmk94vs+3QE7w== Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP EXTENT_CSUM checker is a relatively easy checker, only needs to check: 1) Objectid Fixed to BTRFS_EXTENT_CSUM_OBJECTID. 2) Key offset alignment Must be aligned to sectorsize 3) Item size alignedment Must be aligned to csum size. Signed-off-by: Qu Wenruo --- fs/btrfs/disk-io.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index b92296c6a698..1746c5a2a7f7 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -628,6 +628,27 @@ static int check_extent_data_item(struct btrfs_root *root, return 0; } +static int check_csum_item(struct btrfs_root *root, struct extent_buffer *leaf, + struct btrfs_key *key, int slot) +{ + u32 sectorsize = root->fs_info->sectorsize; + u32 csumsize = btrfs_super_csum_size(root->fs_info->super_copy); + + if (key->objectid != BTRFS_EXTENT_CSUM_OBJECTID) { + CORRUPT("invalid objectid for csum item", leaf, root, slot); + return -EUCLEAN; + } + if (!IS_ALIGNED(key->offset, sectorsize)) { + CORRUPT("unaligned key offset for csum item", leaf, root, slot); + return -EUCLEAN; + } + if (!IS_ALIGNED(btrfs_item_size_nr(leaf, slot), csumsize)) { + CORRUPT("unaligned csum item size", leaf, root, slot); + return -EUCLEAN; + } + return 0; +} + static int check_leaf_item(struct btrfs_root *root, struct extent_buffer *leaf, struct btrfs_key *key, int slot) @@ -642,6 +663,9 @@ static int check_leaf_item(struct btrfs_root *root, case BTRFS_EXTENT_DATA_KEY: ret = check_extent_data_item(root, leaf, key, slot); break; + case BTRFS_EXTENT_CSUM_KEY: + ret = check_csum_item(root, leaf, key, slot); + break; } return ret; }