From patchwork Mon Feb 9 20:03:05 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 5803101 Return-Path: X-Original-To: patchwork-linux-btrfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 8C4B1BF440 for ; Mon, 9 Feb 2015 20:03:42 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 1467220123 for ; Mon, 9 Feb 2015 20:03:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id CB26720120 for ; Mon, 9 Feb 2015 20:03:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1760753AbbBIUDd (ORCPT ); Mon, 9 Feb 2015 15:03:33 -0500 Received: from mx0a-00082601.pphosted.com ([67.231.145.42]:61243 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759087AbbBIUDb (ORCPT ); Mon, 9 Feb 2015 15:03:31 -0500 Received: from pps.filterd (m0004347 [127.0.0.1]) by m0004347.ppops.net (8.14.5/8.14.5) with SMTP id t19K1RGx024632; Mon, 9 Feb 2015 12:03:28 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wit.ai; h=from : to : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=mx2; bh=WEEFQDJSE2FpfOI1kSRFtkb6D9SyppMZYf4+D08D+G8=; b=lcamonh+whzCuil7Y0Jubs+9M9xajKERjS5DUvCqq5tax1q1cb57/IkxADYx/Yz5OeG5 fBGw2bB+8Ne/dXCINow86+4izKIGjBIxS42qc4mqmvtg3Ja9ha4dUHt+2vvzRwTFuO6n JoVSIX031WJ1x2hWRgxW9kpb9lpwe+lHxeQFIsC2A1cdWl4V83Bp6V/9Gvi6Bl/RTjdu X0Zua78onbrmkv4BSHYBMhIvN+dhGot1ihzS1wMmXYc431SZacpXhDS/zFUHIPa7vziz fdP1ltFQ7v+9m2PT/rY7A4q+LT15hdKtZcpA2GJSD1RElI8I1yzzOvVBjkftdHkQCC+h QA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=from : to : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=facebook; bh=WEEFQDJSE2FpfOI1kSRFtkb6D9SyppMZYf4+D08D+G8=; b=j4v6nm7W9S3DQbQVeJSjehfFHF1n/klVQwkDXYJX7GDXp74IAzSs/m5nbSXMkfx8sCV8 NTvNiTwjqUHQ2Rj6ibs4d/iqihrOAuiUQ+HerZtmAmFc8Vi7bZ6DazQuf41nfgW1Olhu XOZzrhkFikUdNnHxs2Ppn/9qPzoujINPMm4= Received: from mail.thefacebook.com ([199.201.64.23]) by m0004347.ppops.net with ESMTP id 1sf38pg1ea-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NOT); Mon, 09 Feb 2015 12:03:28 -0800 Received: from localhost (192.168.57.29) by mail.thefacebook.com (192.168.16.16) with Microsoft SMTP Server (TLS) id 14.3.195.1; Mon, 9 Feb 2015 12:03:26 -0800 From: Josef Bacik To: , Subject: [PATCH 02/16] btrfs-progs: deal with no extent info Date: Mon, 9 Feb 2015 15:03:05 -0500 Message-ID: <1423512199-16552-3-git-send-email-jbacik@fb.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1423512199-16552-1-git-send-email-jbacik@fb.com> References: <1423512199-16552-1-git-send-email-jbacik@fb.com> MIME-Version: 1.0 X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.13.68, 1.0.33, 0.0.0000 definitions=2015-02-09_02:2015-02-09, 2015-02-08, 1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=0 kscore.compositescore=0 circleOfTrustscore=2.00421954885187 compositescore=0.980601336099369 urlsuspect_oldscore=0.980601336099369 suspectscore=3 recipient_domain_to_sender_totalscore=0 phishscore=0 bulkscore=0 kscore.is_spamscore=0 recipient_to_sender_totalscore=0 recipient_domain_to_sender_domain_totalscore=62764 rbsscore=0.980601336099369 spamscore=0 recipient_to_sender_domain_totalscore=0 urlsuspectscore=0.9 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1402240000 definitions=main-1502090197 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=-6.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID,T_RP_MATCHES_RCVD,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 Previously we used to just set FULL_BACKREF if we couldn't lookup an extent info for an extent. Now we just bail out if we can't lookup the extent info, which is less than good since fsck is supposed to fix these very problems. So instead figure out the flag we are supposed to use and pass that along instead. This patch also provides a test image to test this functionality. Thanks, Signed-off-by: Josef Bacik --- cmds-check.c | 43 +++++++++------------ .../fsck-tests/014-no-extent-info/default_case.img | Bin 0 -> 4096 bytes 2 files changed, 19 insertions(+), 24 deletions(-) create mode 100644 tests/fsck-tests/014-no-extent-info/default_case.img diff --git a/tests/fsck-tests/014-no-extent-info/default_case.img b/tests/fsck-tests/014-no-extent-info/default_case.img new file mode 100644 index 0000000000000000000000000000000000000000..1ff27434a59f0b94ce18109690525aadf017b9ad GIT binary patch literal 4096 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 } @@ -5758,20 +5757,30 @@ static int run_next_block(struct btrfs_trans_handle *trans, * FIXME, this only works only if we don't have any full * backref mode. */ + flags = 0; if (!init_extent_tree) { ret = btrfs_lookup_extent_info(NULL, root, bytenr, btrfs_header_level(buf), 1, NULL, &flags); - if (ret < 0) - goto out; + if (ret < 0) { + ret = calc_extent_flag(root, extent_cache, buf, ri, &flags); + if (ret < 0) { + fprintf(stderr, "Couldn't calc extent flags\n"); + flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF; + } + } } else { flags = 0; ret = calc_extent_flag(root, extent_cache, buf, ri, &flags); - if (ret < 0) - goto out; + if (ret < 0) { + fprintf(stderr, "Couldn't calc extent flags\n"); + flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF; + } } if (flags & BTRFS_BLOCK_FLAG_FULL_BACKREF) { + if (rec) + rec->flag_block_full_backref = 1; parent = bytenr; owner = 0; } else { @@ -7030,21 +7039,8 @@ static int fixup_extent_refs(struct btrfs_trans_handle *trans, int allocated = 0; u64 flags = 0; - /* - * remember our flags for recreating the extent. - * FIXME, if we have cleared extent tree, we can not - * lookup extent info in extent tree. - */ - if (!init_extent_tree) { - ret = btrfs_lookup_extent_info(NULL, info->extent_root, - rec->start, rec->max_size, - rec->metadata, NULL, &flags); - if (ret < 0) - return ret; - } else { - if (rec->flag_block_full_backref) - flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF; - } + if (rec->flag_block_full_backref) + flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF; path = btrfs_alloc_path(); if (!path) @@ -7691,8 +7687,6 @@ static int deal_root_from_list(struct list_head *list, * one by one, otherwise we deal with node firstly which * can maximize readahead. */ - if (!init_extent_tree && !rec->drop_level) - goto skip; while (1) { ret = run_next_block(trans, root, bits, bits_nr, &last, pending, seen, reada, @@ -7703,10 +7697,11 @@ static int deal_root_from_list(struct list_head *list, if (ret != 0) break; } -skip: free_extent_buffer(buf); list_del(&rec->list); free(rec); + if (ret < 0) + break; } while (ret >= 0) { ret = run_next_block(trans, root, bits, bits_nr, &last,