From patchwork Mon Dec 13 21:47:11 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12674623 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C7F59C433FE for ; Mon, 13 Dec 2021 21:47:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243153AbhLMVrS (ORCPT ); Mon, 13 Dec 2021 16:47:18 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58308 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232880AbhLMVrR (ORCPT ); Mon, 13 Dec 2021 16:47:17 -0500 Received: from mail-qt1-x830.google.com (mail-qt1-x830.google.com [IPv6:2607:f8b0:4864:20::830]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 66DCBC061574 for ; Mon, 13 Dec 2021 13:47:17 -0800 (PST) Received: by mail-qt1-x830.google.com with SMTP id o17so16708665qtk.1 for ; Mon, 13 Dec 2021 13:47:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=CcAm90px8d0P0fksmrE6dkUaatA8uCDPJ4P8G8Cjj/A=; b=EMpH/MLr1GM8NPlSjkL0qV/ZyWES9EkFRC2qcanle1N0YB/G9f/+kGwJvQ0Mz/Ohga fjqQORJrVuhzl3O0D/oODXC2lIhkhJV7iWG4qLNE3zdKDac8jp2FmDHpjEx+dR6JtIgA R2ge5sU7U6J9Mvq+pGsE5ggHp4C6h75+z1brWjyvl6Wdu3RpVaEqR+Z4e7EUV1eKMBKb /Ff+/t68jHODDr8hSnAvcNkjaFbtdaeiiH0Db3i0h7F1PT0H7LArklO85ZXbyS5XdaZd 5rUp9RZmYaoK9tk6uuZ1tS7fV3wn50FA693gQf8GL4AZcjkI4Y7sIZaH3b1+WbCkawaW 33Hw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=CcAm90px8d0P0fksmrE6dkUaatA8uCDPJ4P8G8Cjj/A=; b=jLxHX8YN+TX3H58h650BtQsz/x4I+E5jqxmz8Vuku5lTltlFL8FVhHgbrGaUlERJ1f /9XpIB46uzWcfZZLQzfUqVIlS+vhSOiad/9FIltAgNNGFamZrz7KoSnNShliLBnImuWq yHl2s7r7wlwE7SqJhCCNhr2GPvGDMw/mAyljHP1YDcd3ATF0nsTh0v5foTAYTsNvxK7Y 5Su0faxtEHAawW7M4uHv0pIHVN1KeX3gLjfZSBjVNo23evDMuJw77i9jnR6jhhfvRh4u un2FjyJtdiOz1LaDk0rUdfsVB+RxqeS8dx2voXMN9He0FostFEN3m/1SUTd+HZzkGKC2 sxKw== X-Gm-Message-State: AOAM533t9ulSP6nUXOcD067AParSmUYY67tUJKN5JQirHekrqb3ujHyK DNG3g39AmRRnyMiBi+/O/a2EJ9WWI2Z9pw== X-Google-Smtp-Source: ABdhPJw9163rgEz0Nk/9pBuuhnaBDJdz3j22QYUW2SR43H/8Fv43nukZ1fxPoO5xc6qHH32aiTrkTA== X-Received: by 2002:ac8:7f4f:: with SMTP id g15mr1232817qtk.309.1639432036207; Mon, 13 Dec 2021 13:47:16 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id y11sm11230218qta.6.2021.12.13.13.47.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Dec 2021 13:47:15 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 1/2] btrfs-progs: handle orphan directories properly Date: Mon, 13 Dec 2021 16:47:11 -0500 Message-Id: <08a5d84c7f4b7fccf4e9f51130867e5c7e643bfc.1639431951.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org When implementing the GC tree I started getting btrfsck errors when a test rm -rf with files inside of it and immediately unmount, leaving behind orphaned directory items that have GC items for them. This made me realize that we don't actually handle this case currently for our normal orphan path. If we fail to clean everything up and leave behind the orphan items we'll fail fsck. Fix this by not processing any backrefs we find if we found an inode item and its nlink is 0. This allows us to pass the test case I've provided to validate this patch. Signed-off-by: Josef Bacik --- check/main.c | 15 ++++++++++++++- check/mode-lowmem.c | 6 ++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/check/main.c b/check/main.c index e67d2f72..966a68ab 100644 --- a/check/main.c +++ b/check/main.c @@ -1018,6 +1018,16 @@ static int merge_inode_recs(struct inode_record *src, struct inode_record *dst, int ret = 0; dst->merging = 1; + + /* + * If we wandered into a shared node while we were processing an inode + * we may have added backrefs for a directory that had nlink == 0, so + * skip adding these backrefs to our src inode if we have nlink == 0 and + * we actually found the inode item. + */ + if (src->found_inode_item && src->nlink == 0) + goto skip_backrefs; + list_for_each_entry(backref, &src->backrefs, list) { if (backref->found_dir_index) { add_inode_backref(dst_cache, dst->ino, backref->dir, @@ -1039,7 +1049,7 @@ static int merge_inode_recs(struct inode_record *src, struct inode_record *dst, backref->ref_type, backref->errors); } } - +skip_backrefs: if (src->found_dir_item) dst->found_dir_item = 1; if (src->found_file_extent) @@ -1394,6 +1404,9 @@ static int process_dir_item(struct extent_buffer *eb, rec = active_node->current; rec->found_dir_item = 1; + if (rec->found_inode_item && rec->nlink == 0) + return 0; + di = btrfs_item_ptr(eb, slot, struct btrfs_dir_item); total = btrfs_item_size_nr(eb, slot); while (cur < total) { diff --git a/check/mode-lowmem.c b/check/mode-lowmem.c index 696ad215..8aa70f9e 100644 --- a/check/mode-lowmem.c +++ b/check/mode-lowmem.c @@ -2726,6 +2726,8 @@ static int check_inode_item(struct btrfs_root *root, struct btrfs_path *path) imode_to_type(mode), key.objectid, key.offset); } + if (is_orphan && key.type == BTRFS_DIR_INDEX_KEY) + break; ret = check_dir_item(root, &key, path, &size); err |= ret; break; @@ -2768,7 +2770,7 @@ out: &nlink); } - if (nlink != 1) { + if (nlink > 1) { err |= LINK_COUNT_ERROR; error("root %llu DIR INODE[%llu] shouldn't have more than one link(%llu)", root->objectid, inode_id, nlink); @@ -2784,7 +2786,7 @@ out: gfs_info->nodesize); } - if (isize != size) { + if (isize != size && !is_orphan) { if (repair) ret = repair_dir_isize_lowmem(root, path, inode_id, size); From patchwork Mon Dec 13 21:47:12 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 12674625 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C3A3EC433F5 for ; Mon, 13 Dec 2021 21:47:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242947AbhLMVrT (ORCPT ); Mon, 13 Dec 2021 16:47:19 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58316 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242779AbhLMVrT (ORCPT ); Mon, 13 Dec 2021 16:47:19 -0500 Received: from mail-qt1-x830.google.com (mail-qt1-x830.google.com [IPv6:2607:f8b0:4864:20::830]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B352CC061574 for ; Mon, 13 Dec 2021 13:47:18 -0800 (PST) Received: by mail-qt1-x830.google.com with SMTP id z9so16656075qtj.9 for ; Mon, 13 Dec 2021 13:47:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toxicpanda-com.20210112.gappssmtp.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=HPWL2tmV+j/82fwrmbHL/o55oDNXP1BfYYdklwaVjY0=; b=uyQpcjs46m3e9AKX6IrFN0nliyYcm9d6i/ucDG4fw3NZHbMM+heLYyn/FKOSxYi68X cWUK9JpT9m4CHJBG8rKOHOnJilM6XAbbBBvHMVEp1thJSKYHXBjgUVnUl2TaymexGlXG 7o6YleKh1nfEi+Ad4WuQTJMltZIjggUB6J5YF47upHCtiHF1yB+xk2JlWkhqGYDitUB+ 8+WS650wexN/wL4bnYoR/XjV9/RfO036MXjWZhWXnTLCr80MxnB0FtIxkhtsPaUoyvga NWctnxoiemx7Pocn6hKDaO8rhmXA52muc47JqT/AYQ8063dmV+Zjf7M3FBlQS82xsMQx OmZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=HPWL2tmV+j/82fwrmbHL/o55oDNXP1BfYYdklwaVjY0=; b=t7WqW1ukmibEF32cSe1CgFWz+wFjth46NqSX7j+1ImGG905O+bcYivdgxGFTj1vyYf 0MUVMV0SVUT2Yku2+YV0JO8W1dWavZmj8JEd4NPjgYgGB4GCaHSvWJobDaY/Wts7duKf vapEiBCBSN0t0yWW2FKQrPqMHVBbKwcA9YKFMN4UKOKT/IOKxx/HzUjs3Ktb/gFxpMMU eCSlHazZREcWaDO4YhXZx+G8rWDtjbPnpvSuKUnuMoLKw7pPzSn6d0HBwZW59fEc8Xe7 MP144s9mcSvZfXi/BXEVYZHqsWb6bJvhNYChGmnrlzklUMYQrzxA0EO+qx8fNvgi2a+E 8Z3Q== X-Gm-Message-State: AOAM532xVsw4zz7iMrL0D5+9lj0ts2uVjRSOZspQ+9N+lR2hSzAQha3F jH+rGArVo+CN16iy7kqh9UK/ipV5mGMcMg== X-Google-Smtp-Source: ABdhPJzrFqI3ovZfXPuxRmCZHPBI9Y1zF+oyyXsvDdGJm/GwHef96g29Jcj/FSZ+0W+G8GuTKBoQ2Q== X-Received: by 2002:ac8:7f43:: with SMTP id g3mr1218791qtk.127.1639432037617; Mon, 13 Dec 2021 13:47:17 -0800 (PST) Received: from localhost (cpe-174-109-172-136.nc.res.rr.com. [174.109.172.136]) by smtp.gmail.com with ESMTPSA id 22sm10563152qtw.12.2021.12.13.13.47.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Dec 2021 13:47:17 -0800 (PST) From: Josef Bacik To: linux-btrfs@vger.kernel.org, kernel-team@fb.com Subject: [PATCH v2 2/2] btrfs-progs: add a test to check orphaned directories Date: Mon, 13 Dec 2021 16:47:12 -0500 Message-Id: <0d4cd68862571a27ee21b49ff4c4b32b4c2fc587.1639431951.git.josef@toxicpanda.com> X-Mailer: git-send-email 2.26.3 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org When adding the GC support I noticed we were failing fsck when we had a directory that hadn't been cleaned up yet because of rm -rf. However this isn't limited to extent-tree-v2, we'll actually fail in the same way if we were unable to do the evict portion of the deletion and left the orphan items around for everybody. This is a valid file system, it'll be cleaned up properly at mount time, so fsck shouldn't fail in this case. Signed-off-by: Josef Bacik --- .../052-orphan-directory/default.img.xz | Bin 0 -> 1432 bytes tests/fsck-tests/052-orphan-directory/test.sh | 20 ++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 tests/fsck-tests/052-orphan-directory/default.img.xz create mode 100755 tests/fsck-tests/052-orphan-directory/test.sh diff --git a/tests/fsck-tests/052-orphan-directory/default.img.xz b/tests/fsck-tests/052-orphan-directory/default.img.xz new file mode 100644 index 0000000000000000000000000000000000000000..4fac926c579034d29d51065f07ede7f1528f67f7 GIT binary patch literal 1432 zcmV;J1!wyGH+ooF000E$*0e?f03iVu0001VFXf}+Q~w23T>wRyj;C3^v%$$4d1rE0 zjjaF1$3^@a-*CI>b`;Xhem%7aGMP*V_w!KDE5R0R%IUtZRb^s9 zi6n6B>Al(Z6(ck4q8BzTqu}wwoMuwumm_b;EKiEFys%e}Wy|!(G_fi_h+~MXJ*v!* z@OLKOM3;uD5@h-)C*pAwm1MKZL8@)8Fx4fxHjW<>)`e6g5Zm!NQG2}Cra-*62)SQH>=$5N;D zLM%3pZc}+`?rkRWv6>4}Fn$cATpC3hqVBR=9q-6#R0-)Cv(^T!T^t|EJMyV#*Lx0$ zf$^BY!nwl}m6w4}rp>Bh;*?$D`Z0yB_~Xov?rO4k_j5?t8Q&*8i?W?!?mAmKZCuI` z%gJCR%)(WR?_bDW+`#$%Tt|AU_z6xe7R7ZS%%9Os&Lc?G$dNiKqoDnk;MffP4}V9N zd=6Jgv3s~w8vCXvoJMalb-txXc$zKKONI6HCiC3{T0XyE?KUar>YVQnbBIDW@3mph z+fJaSb-Bs2XRuNDn54yg<6>;z(;dbEEMA#YW?jQo?<7Z9tLF4#29`O%V)eC=fe{+@ zOTcDGQK~um*|~2NzP9juZ=P-Z4hvf^4+S(2(_}HP90h+E zUAt|w*rN(OiS2g_A_{WB!x!EI!)NN7AKz>y-4*7gusX@GuK)7rA^6nsyYhfmS=c2S zmTvHr3dg>OxD-C-0OH&hiler`!mpohSrQ zZ4_AJ-GO*{fJne0Aqn|}wma;<$xff>CSI8OA`{QC-tZAdFMafuQTWkEbU5qcPg@;n zB=?3LtMx2@lD@fV?V zp2$zK&{(*L`0ya5+$0hk=O~H)T}&J2bgEzK%`E=vRtkm2b_ZqBl9Hy3WWHN7ly#aWWD)V9wEY+vq6x* zK{I25VZCb|ex+OQdZj+Oe8nQ22S6r}qgqZH@Q^pivE*;Tyug)0=#sr;J=xb6AXkNK z4M-}MG^z0~YX(ExEW{9ZY`Vv%FW;{>7ZY?YmLY9Vb*ly4+t@btt*W$tHKqz2P(!(@ zLjby7n;YV$$h}qS-=*#5>AjJ zHZ+k~u~BE-A8o`$m>Aska*;l6_n{70@b{)EFyyUbN<*QPMB;FW4_|{Y)Nw+J5j?R+ z=H3KRTkCRE@D>im$ZO;&`*U@4M@Lo)0mP1T447cNe(|C=OY>X-?7%+G zrr;G*7ws0{$62R6#9Xmq m0001|VXy=UD-dA-0r3ies0jdS2iv@{#Ao{g000001X)_$1G{+u literal 0 HcmV?d00001 diff --git a/tests/fsck-tests/052-orphan-directory/test.sh b/tests/fsck-tests/052-orphan-directory/test.sh new file mode 100755 index 00000000..f3d380d9 --- /dev/null +++ b/tests/fsck-tests/052-orphan-directory/test.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# We could potentially have a directory and it's children with ORPHAN items left +# for them without having been cleaned up. +# +# fsck shouldn't complain about this or attempt to do anything about it, the +# orphan cleanup will do the correct thing. +# +# To create this image I simply modified the kernel to skip doing the +# btrfs_truncate_inode_items() and removing the orphan item at evict time, and +# then rm -rf'ed a directory. + +source "$TEST_TOP/common" + +check_prereq btrfs + +check_image() { + run_check "$TOP/btrfs" check "$1" +} + +check_all_images