From patchwork Wed Oct 1 14:34:51 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 5012081 Return-Path: X-Original-To: patchwork-linux-btrfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id D53AB9F32B for ; Wed, 1 Oct 2014 14:35:00 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id F148C20221 for ; Wed, 1 Oct 2014 14:34:59 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 044342015A for ; Wed, 1 Oct 2014 14:34:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751855AbaJAOez (ORCPT ); Wed, 1 Oct 2014 10:34:55 -0400 Received: from mx0a-00082601.pphosted.com ([67.231.145.42]:16098 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751662AbaJAOey (ORCPT ); Wed, 1 Oct 2014 10:34:54 -0400 Received: from pps.filterd (m0044008 [127.0.0.1]) by mx0a-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s91EQ6eW023957 for ; Wed, 1 Oct 2014 07:34:54 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=from : to : subject : date : message-id : mime-version : content-type; s=facebook; bh=TSrRA3kEg2xYC1q2nVRGWEWa9c5R7xtdvAVDMu5czD4=; b=CWE6gEWzsSrLOrbtFTLHuAQTEyQdnZyxIMbV9o1HX40GeH51pCVGRpyNFHKSOEikP6mr ouDCXRY2F4Q8YaEiN6t/gSCT+9fivzEtSmXcByjZWJIZzquyI0LrMkNoMU2KYqoy2kwo XZwqm+IhHGFrZsCZT0MZS+ySQMWw6Vb8ZF0= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0a-00082601.pphosted.com with ESMTP id 1pqwxb2s2f-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK) for ; Wed, 01 Oct 2014 07:34:54 -0700 Received: from localhost (192.168.57.29) by mail.TheFacebook.com (192.168.16.18) with Microsoft SMTP Server (TLS) id 14.3.195.1; Wed, 1 Oct 2014 07:34:52 -0700 From: Josef Bacik To: Subject: [PATCH] Btrfs-progs: rebuild the crc tree with --init-csum-tree Date: Wed, 1 Oct 2014 10:34:51 -0400 Message-ID: <1412174091-5409-1-git-send-email-jbacik@fb.com> X-Mailer: git-send-email 1.8.3.1 MIME-Version: 1.0 X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.12.52, 1.0.28, 0.0.0000 definitions=2014-10-01_06:2014-10-01, 2014-10-01, 1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 spamscore=0 suspectscore=3 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1402240000 definitions=main-1410010147 X-FB-Internal: deliver Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Spam-Status: No, score=-7.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP We have --init-csum-tree, which just empties the csum tree. I'm not sure why we would ever need this, but we definitely need to be able to rebuild the csum tree in some cases. This patch adds the ability to completely rebuild the crc tree by reading all of the data and adding csum entries for them. This patch doesn't pay attention to NODATASUM inodes, it'll happily add csums for everything. Thanks, Signed-off-by: Josef Bacik --- cmds-check.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/cmds-check.c b/cmds-check.c index 03b0fbd..3141aa4 100644 --- a/cmds-check.c +++ b/cmds-check.c @@ -6625,6 +6625,98 @@ out: return ret; } +static int populate_csum(struct btrfs_trans_handle *trans, + struct btrfs_root *csum_root, char *buf, u64 start, + u64 len) +{ + u64 offset = 0; + u64 sectorsize; + int ret = 0; + + while (offset < len) { + sectorsize = csum_root->sectorsize; + ret = read_extent_data(csum_root, buf, start + offset, + §orsize, 0); + if (ret) + break; + ret = btrfs_csum_file_block(trans, csum_root, start + len, + start + offset, buf, sectorsize); + if (ret) + break; + offset += sectorsize; + } + return ret; +} + +static int fill_csum_tree(struct btrfs_trans_handle *trans, + struct btrfs_root *csum_root) +{ + struct btrfs_root *extent_root = csum_root->fs_info->extent_root; + struct btrfs_path *path; + struct btrfs_extent_item *ei; + struct extent_buffer *leaf; + char *buf; + struct btrfs_key key; + int ret; + + path = btrfs_alloc_path(); + if (!path) + return -ENOMEM; + + key.objectid = 0; + key.type = BTRFS_EXTENT_ITEM_KEY; + key.offset = 0; + + ret = btrfs_search_slot(NULL, extent_root, &key, path, 0, 0); + if (ret < 0) { + btrfs_free_path(path); + return ret; + } + + buf = malloc(csum_root->sectorsize); + if (!buf) { + btrfs_free_path(path); + return -ENOMEM; + } + + while (1) { + if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) { + ret = btrfs_next_leaf(extent_root, path); + if (ret < 0) + break; + if (ret) { + ret = 0; + break; + } + } + leaf = path->nodes[0]; + + btrfs_item_key_to_cpu(leaf, &key, path->slots[0]); + if (key.type != BTRFS_EXTENT_ITEM_KEY) { + path->slots[0]++; + continue; + } + + ei = btrfs_item_ptr(leaf, path->slots[0], + struct btrfs_extent_item); + if (!(btrfs_extent_flags(leaf, ei) & + BTRFS_EXTENT_FLAG_DATA)) { + path->slots[0]++; + continue; + } + + ret = populate_csum(trans, csum_root, buf, key.objectid, + key.offset); + if (ret) + break; + path->slots[0]++; + } + + btrfs_free_path(path); + free(buf); + return ret; +} + static struct option long_options[] = { { "super", 1, NULL, 's' }, { "repair", 0, NULL, 0 }, @@ -6794,6 +6886,12 @@ int cmd_check(int argc, char **argv) ret = -EIO; goto close_out; } + + ret = fill_csum_tree(trans, info->csum_root); + if (ret) { + fprintf(stderr, "crc refilling failed\n"); + return -EIO; + } } /* * Ok now we commit and run the normal fsck, which will add