Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp750121ybl; Wed, 4 Dec 2019 10:13:51 -0800 (PST) X-Google-Smtp-Source: APXvYqxoi7waKNr/aA+uZZO1U8FfAUcDK1vP2qgGaxtqLH0/48EINhJ/V1YeszXpCzTIhw+M0+cI X-Received: by 2002:a9d:1d07:: with SMTP id m7mr3606518otm.261.1575483231740; Wed, 04 Dec 2019 10:13:51 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1575483231; cv=none; d=google.com; s=arc-20160816; b=y21Qodz1Vns3VI72fUIjcyNAASw8ZqB3dDBkJj/flHv/x8Y6hSAsXZ9JLZCOmvjxjF h895wGkwZF8K6gJZVkMxjCY3B0+b+P57pILDAlDjEXhkSbQYieTbfmEaAfsn6Zs14zo9 znoa9AJeQSIjaO1TvnRyWczf8mfsYhhMjLze1Mur59JpZBpcDllpNZbpv+DOG4DuGo57 +e45gft+EXDDWvF4U4mchODUl/8HLEgDD1T2w4tjH7rrOLAmfYO0gQ+Z8XxdZdMk1eYG jC1Jg7W9S7KfJzKn5eV3T1j/z4YLOWFtM2oQlgc6K1XzBfsaT4j3401OdCLJzLpu5ZNk eaOg== 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=hG+w4LxLvVYXZZm0+PD0PGDOk3p2PYKvw1Yez/Js2Kw=; b=EoV7NmIrelpeQnMEwEGJFijzFag+r/Esu6Sxjyho4Zjd5AvoWzRtaq69Co7hxIYJQn lKSJ0QPQw0WQGFh3UPRdwhiqNEyF+kMdE5ZkFs3T87CxekW8GbK8rPATgeoJwLO87Eah LcN/kdEzvHXiwBWZ6zFDLy49RqEVweGqte9ghthGoRVX7jS13nI2yTf93NMiMAXreMrs RfZsPRCzfm/mIM6dp72j8/oMATI+FFGl7jf8dFPSrt3DiD51zTExBC6c0BnnfCMDLPrP 6I7+2yK7GHx1W4VOBrC8emn9q29hYBXoPNju6g4t41Ox9DL75jsEsIwTl6nQfaMIWIw2 VURg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=bpsjrKXQ; 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 f17si3733919otq.96.2019.12.04.10.13.38; Wed, 04 Dec 2019 10:13:51 -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=bpsjrKXQ; 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 S1731064AbfLDSMX (ORCPT + 99 others); Wed, 4 Dec 2019 13:12:23 -0500 Received: from mail.kernel.org ([198.145.29.99]:40952 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731594AbfLDSMV (ORCPT ); Wed, 4 Dec 2019 13:12:21 -0500 Received: from localhost (unknown [217.68.49.72]) (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 A188120675; Wed, 4 Dec 2019 18:12:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1575483140; bh=LHiUdUHDdThUMjt+1McqXD4GQsQ6DLH4P+4atOmQcvU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bpsjrKXQCYUM6ddudViiuisxB3TRHvsHAbN1EWrIzuPVqQyFa9/rPadLX12rgbYYM ++EbmwfPOD60axc4gCKzbWRWh+fNFd+GiRW0H8V6ZoWfHhw+hy4x/gJXOoD/UBdnP6 obk0/a2iyMEdTtjKLtwfqRQBXgPfdg1K2qrkBjHo= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Lars Ellenberg , Jens Axboe , Sasha Levin Subject: [PATCH 4.9 067/125] drbd: do not block when adjusting "disk-options" while IO is frozen Date: Wed, 4 Dec 2019 18:56:12 +0100 Message-Id: <20191204175323.049531441@linuxfoundation.org> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191204175308.377746305@linuxfoundation.org> References: <20191204175308.377746305@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: Lars Ellenberg [ Upstream commit f708bd08ecbdc23d03aaedf5b3311ebe44cfdb50 ] "suspending" IO is overloaded. It can mean "do not allow new requests" (obviously), but it also may mean "must not complete pending IO", for example while the fencing handlers do their arbitration. When adjusting disk options, we suspend io (disallow new requests), then wait for the activity-log to become unused (drain all IO completions), and possibly replace it with a new activity log of different size. If the other "suspend IO" aspect is active, pending IO completions won't happen, and we would block forever (unkillable drbdsetup process). Fix this by skipping the activity log adjustment if the "al-extents" setting did not change. Also, in case it did change, fail early without blocking if it looks like we would block forever. Signed-off-by: Lars Ellenberg Signed-off-by: Jens Axboe Signed-off-by: Sasha Levin --- drivers/block/drbd/drbd_nl.c | 37 ++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index ff26f676f24d1..b809f325c2bea 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c @@ -1508,6 +1508,30 @@ static void sanitize_disk_conf(struct drbd_device *device, struct disk_conf *dis } } +static int disk_opts_check_al_size(struct drbd_device *device, struct disk_conf *dc) +{ + int err = -EBUSY; + + if (device->act_log && + device->act_log->nr_elements == dc->al_extents) + return 0; + + drbd_suspend_io(device); + /* If IO completion is currently blocked, we would likely wait + * "forever" for the activity log to become unused. So we don't. */ + if (atomic_read(&device->ap_bio_cnt)) + goto out; + + wait_event(device->al_wait, lc_try_lock(device->act_log)); + drbd_al_shrink(device); + err = drbd_check_al_size(device, dc); + lc_unlock(device->act_log); + wake_up(&device->al_wait); +out: + drbd_resume_io(device); + return err; +} + int drbd_adm_disk_opts(struct sk_buff *skb, struct genl_info *info) { struct drbd_config_context adm_ctx; @@ -1570,15 +1594,12 @@ int drbd_adm_disk_opts(struct sk_buff *skb, struct genl_info *info) } } - drbd_suspend_io(device); - wait_event(device->al_wait, lc_try_lock(device->act_log)); - drbd_al_shrink(device); - err = drbd_check_al_size(device, new_disk_conf); - lc_unlock(device->act_log); - wake_up(&device->al_wait); - drbd_resume_io(device); - + err = disk_opts_check_al_size(device, new_disk_conf); if (err) { + /* Could be just "busy". Ignore? + * Introduce dedicated error code? */ + drbd_msg_put_info(adm_ctx.reply_skb, + "Try again without changing current al-extents setting"); retcode = ERR_NOMEM; goto fail_unlock; } -- 2.20.1