Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp26196ybp; Thu, 3 Oct 2019 09:41:19 -0700 (PDT) X-Google-Smtp-Source: APXvYqwEc0sXjD5qp9r1sJjlMBT+b4QxYRI9vijc2P8RZnTgcibDFPWghK+F5trsdbX1asAobBWW X-Received: by 2002:a05:6402:2054:: with SMTP id bc20mr10939549edb.55.1570120879505; Thu, 03 Oct 2019 09:41:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570120879; cv=none; d=google.com; s=arc-20160816; b=cQDtflj5NkGndeSnnMM01PV+PqTIqLZg/DhkHNm8hv7sAR44yHFNaMqBLSRKyktNEG WkVCsEJgZLWql6sGPLUzpuJCx7wNG59xN96qurzqvzfYJkYpbaz5ckPY+ne9dN3UxLcv tX5wPkhE+Qz4AvJs/YUrPr1ibIdB/hdZ63oz8EnlP9oh9YvajNCEGng0NcRmL6boKk7C e/rBDjo/XzSwnCXVjKDOYg2vCA3Si4k4Z4ZtGrx57eKfriD4z0cAcGzofMKGwGa2OuFL M8ntqDQ/EjC7Q2XuEV61L0spR+e2MNOQ/RjWjxq27V1+49fbMCDmqnerj68/Ppeqxe1r GwGQ== 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=8BN4XRG+5bOgqovqmoShiHFEEYkU+tEWUeOnPl/ujeQ=; b=VkF1im18mwNNhNAd3qM49WNW37K1epbAm+Gk0ozNMp907y81TIARVr/cwrfYAR32tK FMJnLWkd5kRI3VZl1wXr3zKTHs9BXJFMYWgrwshNTYEJyvPZ+t5msavLx/aW41gyA34Z Xspu84PVOHrG8N5Pj55gKo6gJUP/GRqvQRhl5eOxN91+PxGNRkinbWMsshnuQOI4reUe IoPyOfLW3wf3SCaENZZAmxE/2/f62rm75RbssR6o31kgeluMD7lAR9fa5mamjzaQNzEt Uk4SSfZdMX0BFD/LjH254QEG+d35ioV7/tHDXnDxOWI2aLGs12BelkGufwLwD5IF5uqx H1yA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=x9p7F2Kj; 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 o12si1793619edc.279.2019.10.03.09.40.54; Thu, 03 Oct 2019 09:41:19 -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=x9p7F2Kj; 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 S2404524AbfJCQhL (ORCPT + 99 others); Thu, 3 Oct 2019 12:37:11 -0400 Received: from mail.kernel.org ([198.145.29.99]:46444 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2404106AbfJCQhH (ORCPT ); Thu, 3 Oct 2019 12:37:07 -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 5AEAA20830; Thu, 3 Oct 2019 16:37:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1570120626; bh=Bacu3uB7CVGhwq+WnDKi6I86W/w+8UaQZLRGorL0fmw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=x9p7F2Kjfi64DJwexch6OUQvAZfJTGOcQEGn8l46lywmzd266Fxt/PwKty02Qp5gs 5ALsGRRXvaohG4OZqEf5yjF+zoucrVOaTxP9U42UbxYrKTkbNolBh4jxtXqQkrIYwv SJTkG+fcbPVartc0j/rM085NJYQHsfd6VUbdi/6I= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, NeilBrown , Song Liu Subject: [PATCH 5.2 293/313] md: dont report active array_state until after revalidate_disk() completes. Date: Thu, 3 Oct 2019 17:54:31 +0200 Message-Id: <20191003154602.008060778@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191003154533.590915454@linuxfoundation.org> References: <20191003154533.590915454@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: NeilBrown commit 9d4b45d6af442237560d0bb5502a012baa5234b7 upstream. Until revalidate_disk() has completed, the size of a new md array will appear to be zero. So we shouldn't report, through array_state, that the array is active until that time. udev rules check array_state to see if the array is ready. As soon as it appear to be zero, fsck can be run. If it find the size to be zero, it will fail. So add a new flag to provide an interlock between do_md_run() and array_state_show(). This flag is set while do_md_run() is active and it prevents array_state_show() from reporting that the array is active. Before do_md_run() is called, ->pers will be NULL so array is definitely not active. After do_md_run() is called, revalidate_disk() will have run and the array will be completely ready. We also move various sysfs_notify*() calls out of md_run() into do_md_run() after MD_NOT_READY is cleared. This ensure the information is ready before the notification is sent. Prior to v4.12, array_state_show() was called with the mddev->reconfig_mutex held, which provided exclusion with do_md_run(). Note that MD_NOT_READY cleared twice. This is deliberate to cover both success and error paths with minimal noise. Fixes: b7b17c9b67e5 ("md: remove mddev_lock() from md_attr_show()") Cc: stable@vger.kernel.org (v4.12++) Signed-off-by: NeilBrown Signed-off-by: Song Liu Signed-off-by: Greg Kroah-Hartman --- drivers/md/md.c | 11 +++++++---- drivers/md/md.h | 3 +++ 2 files changed, 10 insertions(+), 4 deletions(-) --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -4105,7 +4105,7 @@ array_state_show(struct mddev *mddev, ch { enum array_state st = inactive; - if (mddev->pers) + if (mddev->pers && !test_bit(MD_NOT_READY, &mddev->flags)) switch(mddev->ro) { case 1: st = readonly; @@ -5660,9 +5660,6 @@ int md_run(struct mddev *mddev) md_update_sb(mddev, 0); md_new_event(mddev); - sysfs_notify_dirent_safe(mddev->sysfs_state); - sysfs_notify_dirent_safe(mddev->sysfs_action); - sysfs_notify(&mddev->kobj, NULL, "degraded"); return 0; abort: @@ -5676,6 +5673,7 @@ static int do_md_run(struct mddev *mddev { int err; + set_bit(MD_NOT_READY, &mddev->flags); err = md_run(mddev); if (err) goto out; @@ -5696,9 +5694,14 @@ static int do_md_run(struct mddev *mddev set_capacity(mddev->gendisk, mddev->array_sectors); revalidate_disk(mddev->gendisk); + clear_bit(MD_NOT_READY, &mddev->flags); mddev->changed = 1; kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE); + sysfs_notify_dirent_safe(mddev->sysfs_state); + sysfs_notify_dirent_safe(mddev->sysfs_action); + sysfs_notify(&mddev->kobj, NULL, "degraded"); out: + clear_bit(MD_NOT_READY, &mddev->flags); return err; } --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -236,6 +236,9 @@ enum mddev_flags { MD_UPDATING_SB, /* md_check_recovery is updating the metadata * without explicitly holding reconfig_mutex. */ + MD_NOT_READY, /* do_md_run() is active, so 'array_state' + * must not report that array is ready yet + */ }; enum mddev_sb_flags {