Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp3380619ybp; Sun, 6 Oct 2019 10:40:01 -0700 (PDT) X-Google-Smtp-Source: APXvYqy5TuE5cy7B3fbANNPX6E8E+BHmR7iIDIwjtPwQFIig7YMTBhsiM27zh6s98ravdzFfFF4h X-Received: by 2002:a17:906:b6d5:: with SMTP id ec21mr20123912ejb.33.1570383601366; Sun, 06 Oct 2019 10:40:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570383601; cv=none; d=google.com; s=arc-20160816; b=fRE5826qM5dN0Nk01bB3zixC9ug5/63z/WrpB74Y6S9NVFKSJzcosVTPN913dYiOG5 is2Q9HmKs+JnnCO5oCjse33chp/V5z+NAUZpWvYxUhV0SucramwvgLrMzFVoW6z7DYel 7fiXBmKhLl3XKBLMWop62GJrwQtKiq6gkqbRzRXp6If1jcQV/dlP2AKJz0P9UmrrWyec vBi93NHn+4yd6SLcyLYeiXsHCbFiHZzNCBHAlJML1NEkNCuep5efoIHnqbGArua5ozX1 OYUnBErxtOHjOZHWkkWR+WtOOfDEmyjBTRrfrL5a1dFlZ6v0Cbpl9L5+v0uCHpSXlm9N lUsA== 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=4werKQzUTCH4j1iNAUd6cRq2aujf3o4qrtMVFckuHI4=; b=RxP9sXjHETAjwSIn1QQHAmFh5CTV0eg+qEkQdBiFPblkkbDA1XbIqBwpXSnyoG8VDw BSN+avLmMM6NOcyENgeFG2WoudBW/KsGguVyGfFxnL9yc3GTD8Hsv+8Xx0jSXWhmoLrx AoiUwvNXKHmnUnXFZVQi34IuB4C4Ju7okrySRueGJSN5+5B+2N6TrExfF5Ldk61AjOiu JTs26+pFO4y9LhIy6QPwS0ZII5NRig0WL99a+rCBUp/6aD9k2hEOURWZZx5hcdKbl16v HoT1NRt3QUpaAqN4t5I/rbsWKdroj35ElqoYcJlSHNag4X2Q9Vq4uYyiN20xGDxZbI3g qZ0w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=QOm4AQpc; 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 c48si7210332eda.100.2019.10.06.10.39.37; Sun, 06 Oct 2019 10:40:01 -0700 (PDT) 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=QOm4AQpc; 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 S1730582AbfJFRiS (ORCPT + 99 others); Sun, 6 Oct 2019 13:38:18 -0400 Received: from mail.kernel.org ([198.145.29.99]:37430 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730575AbfJFRiP (ORCPT ); Sun, 6 Oct 2019 13:38:15 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (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 594452080F; Sun, 6 Oct 2019 17:38:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1570383494; bh=GDnE7TWM084jLv/9o7QScr1HLC3+SE6bcqhm2DZWlOs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QOm4AQpcLxcHBOuAGVk6/JbHi8OikgCsYvdBpmy6KoYQFvIPfupObU1NmXk1Idy2+ G5u/mfO00buZg1QZCvxfsGAUXCF4cL9kNwL00bBEbhFfchAFC1k2DUwLJzRqaXWRVI aPWVu0fAT8Jr/n8E7AXI4A7J6j/izqKHPsAIhFJ8= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Changwei Ge , Joseph Qi , Mark Fasheh , Joel Becker , Junxiao Bi , Andrew Morton , Linus Torvalds , Sasha Levin Subject: [PATCH 5.2 123/137] ocfs2: wait for recovering done after direct unlock request Date: Sun, 6 Oct 2019 19:21:47 +0200 Message-Id: <20191006171219.541645995@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191006171209.403038733@linuxfoundation.org> References: <20191006171209.403038733@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: Changwei Ge [ Upstream commit 0a3775e4f883912944481cf2ef36eb6383a9cc74 ] There is a scenario causing ocfs2 umount hang when multiple hosts are rebooting at the same time. NODE1 NODE2 NODE3 send unlock requset to NODE2 dies become recovery master recover NODE2 find NODE2 dead mark resource RECOVERING directly remove lock from grant list calculate usage but RECOVERING marked **miss the window of purging clear RECOVERING To reproduce this issue, crash a host and then umount ocfs2 from another node. To solve this, just let unlock progress wait for recovery done. Link: http://lkml.kernel.org/r/1550124866-20367-1-git-send-email-gechangwei@live.cn Signed-off-by: Changwei Ge Reviewed-by: Joseph Qi Cc: Mark Fasheh Cc: Joel Becker Cc: Junxiao Bi Cc: Changwei Ge Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds Signed-off-by: Sasha Levin --- fs/ocfs2/dlm/dlmunlock.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/fs/ocfs2/dlm/dlmunlock.c b/fs/ocfs2/dlm/dlmunlock.c index e78657742bd89..3883633e82eb9 100644 --- a/fs/ocfs2/dlm/dlmunlock.c +++ b/fs/ocfs2/dlm/dlmunlock.c @@ -90,7 +90,8 @@ static enum dlm_status dlmunlock_common(struct dlm_ctxt *dlm, enum dlm_status status; int actions = 0; int in_use; - u8 owner; + u8 owner; + int recovery_wait = 0; mlog(0, "master_node = %d, valblk = %d\n", master_node, flags & LKM_VALBLK); @@ -193,9 +194,12 @@ static enum dlm_status dlmunlock_common(struct dlm_ctxt *dlm, } if (flags & LKM_CANCEL) lock->cancel_pending = 0; - else - lock->unlock_pending = 0; - + else { + if (!lock->unlock_pending) + recovery_wait = 1; + else + lock->unlock_pending = 0; + } } /* get an extra ref on lock. if we are just switching @@ -229,6 +233,17 @@ leave: spin_unlock(&res->spinlock); wake_up(&res->wq); + if (recovery_wait) { + spin_lock(&res->spinlock); + /* Unlock request will directly succeed after owner dies, + * and the lock is already removed from grant list. We have to + * wait for RECOVERING done or we miss the chance to purge it + * since the removement is much faster than RECOVERING proc. + */ + __dlm_wait_on_lockres_flags(res, DLM_LOCK_RES_RECOVERING); + spin_unlock(&res->spinlock); + } + /* let the caller's final dlm_lock_put handle the actual kfree */ if (actions & DLM_UNLOCK_FREE_LOCK) { /* this should always be coupled with list removal */ -- 2.20.1