Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp680332ybl; Fri, 24 Jan 2020 07:37:50 -0800 (PST) X-Google-Smtp-Source: APXvYqyXomxbtlZwvAv/mvSiG1ltMbk363/5Iur3evkjBqKKtDEwcHxlv/SLBwc2fYhci14aESxI X-Received: by 2002:aca:d4c1:: with SMTP id l184mr2416261oig.172.1579880270451; Fri, 24 Jan 2020 07:37:50 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579880270; cv=none; d=google.com; s=arc-20160816; b=lq8RMVWG9sNRyru5RWl/8R5XKGtnLE0ZoIK75y/ue8EAa6Em3DtnhtIwG8idRuEIDu b1KvLeQsSOYg9R9Z90FKyAl9EOW+hSuaEHZyOSu3LsuLyU+k3QzptuzqjICNYn5MzQuW iQzFDKOJ9TcysI/HH5K27/rjvNKEcUqPzkbPCp5tWtEaZJyg7zYGT1CgFiGFO3Yls0yU JGLmIngSB0iZsLc4zUxHpPvBZ0pe9+ZxnaMeEa1Nz1jRiZSf78AYEvNplqb160wgmP1Y TILnVEuwzQjibYvttQzohmyj191Qk0UBhxiVIQYOT6LCknItvWRT9jFQuDRYkeUwK50l Vkyg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=f52zUF7NePLwSvw85dfPpEa8NRT0JU8lxWDKtHt2aCM=; b=UYbraOI/2RoJ5zzmpJVO3OQ1wxTgdBHRvY0lm+6d9Th4C0CyoQgwJMMagK6yKEy1nD PNU5T7uQ+iJtyg6jKeoxGVIKOUAMH+6l5FpH1zhOwV/U38SHf8f9fpEPnTCGiFmwlyYV zqqi2nPhGRJWLiiknTYAuFf+Lo8S0UegjjO5RH/wIHhoXcD8+bs0lniJg3/1Rhm7FT2S rwFn/Ta+oj9kDMVxI80kNG8mHXK2VsR0bMJRD7V98PNQOrKRd2oRn0+HE1lZPOJzLsXs omWWuDt44wekit7rYj/BIX1E/m+3ypZMsIqnFV5fezbYoGPtcyR9Al1MN4juT4CqTFOV 2GHg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Vp2NuKR3; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id r15si3345073ota.264.2020.01.24.07.37.37; Fri, 24 Jan 2020 07:37:50 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Vp2NuKR3; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389119AbgAXKET (ORCPT + 99 others); Fri, 24 Jan 2020 05:04:19 -0500 Received: from mail.kernel.org ([198.145.29.99]:40484 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389107AbgAXKES (ORCPT ); Fri, 24 Jan 2020 05:04:18 -0500 Received: from localhost (unknown [145.15.244.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 795F020709; Fri, 24 Jan 2020 10:04:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1579860258; bh=q/e9MxBlZ/HVtg15LkGoOQje4ifmpAajn2FcMp4o1Lw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Vp2NuKR3aQHJwKRnPqMgqbmlOjTR/FXSbNOp7yylljwIlDR59kBqpFsIoTEnV/Y6j +wUDsHX/FM+PR0Zygw15M1B7sHFHaQwnu+NvcuANvzShclsrQYgYWInL+eCTawPhsp hjLnV/qTBUbPxClfbcAXlkkNGMcveKNN9oqA4U7I= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Nikolay Borisov , Filipe Manana , David Sterba , Sasha Levin Subject: [PATCH 4.14 297/343] Btrfs: fix inode cache waiters hanging on failure to start caching thread Date: Fri, 24 Jan 2020 10:31:55 +0100 Message-Id: <20200124092959.012578787@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200124092919.490687572@linuxfoundation.org> References: <20200124092919.490687572@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Filipe Manana [ Upstream commit a68ebe0790fc88b4314d17984a2cf99ce2361901 ] If we fail to start the inode caching thread, we print an error message and disable the inode cache, however we never wake up any waiters, so they hang forever waiting for the caching to finish. Fix this by waking them up and have them fallback to a call to btrfs_find_free_objectid(). Fixes: e60efa84252c05 ("Btrfs: avoid triggering bug_on() when we fail to start inode caching task") Reviewed-by: Nikolay Borisov Signed-off-by: Filipe Manana Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- fs/btrfs/inode-map.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/fs/btrfs/inode-map.c b/fs/btrfs/inode-map.c index 7dc2923655d98..b1c3a4ec76c8c 100644 --- a/fs/btrfs/inode-map.c +++ b/fs/btrfs/inode-map.c @@ -26,6 +26,19 @@ #include "inode-map.h" #include "transaction.h" +static void fail_caching_thread(struct btrfs_root *root) +{ + struct btrfs_fs_info *fs_info = root->fs_info; + + btrfs_warn(fs_info, "failed to start inode caching task"); + btrfs_clear_pending_and_info(fs_info, INODE_MAP_CACHE, + "disabling inode map caching"); + spin_lock(&root->ino_cache_lock); + root->ino_cache_state = BTRFS_CACHE_ERROR; + spin_unlock(&root->ino_cache_lock); + wake_up(&root->ino_cache_wait); +} + static int caching_kthread(void *data) { struct btrfs_root *root = data; @@ -178,11 +191,8 @@ static void start_caching(struct btrfs_root *root) tsk = kthread_run(caching_kthread, root, "btrfs-ino-cache-%llu", root->root_key.objectid); - if (IS_ERR(tsk)) { - btrfs_warn(fs_info, "failed to start inode caching task"); - btrfs_clear_pending_and_info(fs_info, INODE_MAP_CACHE, - "disabling inode map caching"); - } + if (IS_ERR(tsk)) + fail_caching_thread(root); } int btrfs_find_free_ino(struct btrfs_root *root, u64 *objectid) @@ -200,11 +210,14 @@ again: wait_event(root->ino_cache_wait, root->ino_cache_state == BTRFS_CACHE_FINISHED || + root->ino_cache_state == BTRFS_CACHE_ERROR || root->free_ino_ctl->free_space > 0); if (root->ino_cache_state == BTRFS_CACHE_FINISHED && root->free_ino_ctl->free_space == 0) return -ENOSPC; + else if (root->ino_cache_state == BTRFS_CACHE_ERROR) + return btrfs_find_free_objectid(root, objectid); else goto again; } -- 2.20.1