From patchwork Thu Jul 15 04:55:26 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luis Chamberlain X-Patchwork-Id: 12378815 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.0 required=3.0 tests=BAYES_00,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 40957C47E48 for ; Thu, 15 Jul 2021 04:55:43 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 25A9361396 for ; Thu, 15 Jul 2021 04:55:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238684AbhGOE6e (ORCPT ); Thu, 15 Jul 2021 00:58:34 -0400 Received: from mail-pg1-f170.google.com ([209.85.215.170]:36353 "EHLO mail-pg1-f170.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238661AbhGOE6e (ORCPT ); Thu, 15 Jul 2021 00:58:34 -0400 Received: by mail-pg1-f170.google.com with SMTP id s18so4777405pgq.3; Wed, 14 Jul 2021 21:55:38 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=RwWOR0IhmOLWqkK1O+cYkuwCpPGb+kOKJBNKG5jnTpU=; b=LE9wWrqhfKrZn0VU411WAHANZIErX4fRvj2MHVL1yzFV48+DrUe6Pcl5teh0pX6HW1 HmWfbqBt679mMvZCOuxfBqv1DonNStN3zlh8dTKwFigiygrngq8MF+Lu+EcBs2KU/kBn UxNaVATRmsFKiQR5PBHwtF+AKY57H2a7hP6krMurgNVZ5ON79HZ6tDVz1haZLvjCpxKx O+z6sxwEJJj6YLVb5m/PwD3rKby29NeZNow1bbneKFjiV8t3bxsvCyVm+RRmiFLiAHWB 8No0gKxtkUoIWu4LfGE25wLqWKuPCCPW3HjJZVo01TbzY35GQoMeXDcOmzbfm/gbqCDF cS5g== X-Gm-Message-State: AOAM530i3/MM15qKxpbQpaFSZIcilZC0/9KT9o2OYgqN40qOExfRnsx8 lheUx+72gEDVs3AXMVAV2+w= X-Google-Smtp-Source: ABdhPJxFKtIYg8/oXrVU/5djMsZbWQlaJM2lU7R9GYHkOBQe9vzWrdPOCBqgGCp0ivlpcsSc0Ec02w== X-Received: by 2002:aa7:8d56:0:b029:327:6dc:d254 with SMTP id s22-20020aa78d560000b029032706dcd254mr2376165pfe.69.1626324938050; Wed, 14 Jul 2021 21:55:38 -0700 (PDT) Received: from localhost ([191.96.120.37]) by smtp.gmail.com with ESMTPSA id d2sm4665819pfa.84.2021.07.14.21.55.36 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 14 Jul 2021 21:55:37 -0700 (PDT) From: Luis Chamberlain To: axboe@kernel.dk Cc: hare@suse.de, bvanassche@acm.org, ming.lei@redhat.com, hch@infradead.org, jack@suse.cz, osandov@fb.com, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, Luis Chamberlain Subject: [PATCH v2 1/6] block: refcount the request_queue early in __device_add_disk() Date: Wed, 14 Jul 2021 21:55:26 -0700 Message-Id: <20210715045531.420201-2-mcgrof@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210715045531.420201-1-mcgrof@kernel.org> References: <20210715045531.420201-1-mcgrof@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org We refcount the request_queue right now towards the end of the __device_add_disk(), however when we add error handling on this function we'll want to refcount the request_queue first, so that we can simply bail right away on error. No point in doing any work on the queue if its invalid. Otherwise we'd also be unwinding all the work we had done towards the very end. Signed-off-by: Luis Chamberlain Reviewed-by: Christoph Hellwig --- block/genhd.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/block/genhd.c b/block/genhd.c index af4d2ab4a633..4dd6db3618f2 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -464,6 +464,15 @@ static void __device_add_disk(struct device *parent, struct gendisk *disk, { int ret; + /* + * Take an extra ref on queue which will be put on disk_release() + * so that it sticks around as long as @disk is there. + */ + if (blk_get_queue(disk->queue)) + set_bit(GD_QUEUE_REF, &disk->state); + else + WARN_ON_ONCE(1); + /* * The disk queue should now be all set with enough information about * the device for the elevator code to pick an adequate default @@ -528,15 +537,6 @@ static void __device_add_disk(struct device *parent, struct gendisk *disk, if (register_queue) blk_register_queue(disk); - /* - * Take an extra ref on queue which will be put on disk_release() - * so that it sticks around as long as @disk is there. - */ - if (blk_get_queue(disk->queue)) - set_bit(GD_QUEUE_REF, &disk->state); - else - WARN_ON_ONCE(1); - disk_add_events(disk); blk_integrity_add(disk); } From patchwork Thu Jul 15 04:55:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luis Chamberlain X-Patchwork-Id: 12378813 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.0 required=3.0 tests=BAYES_00,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id F35EDC07E96 for ; Thu, 15 Jul 2021 04:55:42 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D352B61360 for ; Thu, 15 Jul 2021 04:55:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238668AbhGOE6e (ORCPT ); Thu, 15 Jul 2021 00:58:34 -0400 Received: from mail-pl1-f172.google.com ([209.85.214.172]:43906 "EHLO mail-pl1-f172.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231739AbhGOE6d (ORCPT ); Thu, 15 Jul 2021 00:58:33 -0400 Received: by mail-pl1-f172.google.com with SMTP id b12so2551727plh.10; Wed, 14 Jul 2021 21:55:40 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=gIg7Rqg1ikL9rnJkxSzC8R1IAU7njxjl/m0vF2ydy4Y=; b=Q/gZQ88tzFhaF4ILY1aXAv1em4+MdYwrsbSontgP6FBOwMZQ3Wlw4EtPIuUI3jWeIS pI+QfdJ0S+SLXolJEQNTWFq1nq0gZiWsI22BGpYZMl/dHvv99Y9oV6/9z11lvZA9Idsn G/J8b+xywXuJc8kLVu6qj5IKYo18W3viNg9mu/Sz/IvRveKXZMe/jik3dVQCzaK6H3/0 AxaeC4lgqxtg+RkWaeBpNzfODrE9NokIaCZWbK8907/E0ogdjgzuQdULGiCbIkcojq5K nVX+PS4B6A6F91wDrLDjFyQE31ELRYEpeu90WyWW04fTlyq1q+oGDfPkvFqq2be6swSb twKw== X-Gm-Message-State: AOAM532fhYyTT2hcj+KtqmMhQZIHkOnDatcpCs3QSpOQMzabs3++H3+0 rqIlND6ugWYcbFPduPLvSMU= X-Google-Smtp-Source: ABdhPJw6MFxckQzjbD1qYvV+wBpK+PLhMIPHurJS2V6jWS20oCazLNxm8pppX+3o4ebJaZHlRZ9N1Q== X-Received: by 2002:a17:90b:234e:: with SMTP id ms14mr6659096pjb.118.1626324940237; Wed, 14 Jul 2021 21:55:40 -0700 (PDT) Received: from localhost ([191.96.120.37]) by smtp.gmail.com with ESMTPSA id e21sm4576192pfc.172.2021.07.14.21.55.38 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 14 Jul 2021 21:55:39 -0700 (PDT) From: Luis Chamberlain To: axboe@kernel.dk Cc: hare@suse.de, bvanassche@acm.org, ming.lei@redhat.com, hch@infradead.org, jack@suse.cz, osandov@fb.com, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, Luis Chamberlain Subject: [PATCH v2 2/6] block: move disk announce work from register_disk() to a helper Date: Wed, 14 Jul 2021 21:55:27 -0700 Message-Id: <20210715045531.420201-3-mcgrof@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210715045531.420201-1-mcgrof@kernel.org> References: <20210715045531.420201-1-mcgrof@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org This moves quite a bit of code which does one thing into a helper. We currently do not check for errors but we may decide that might be desirable later. This also makes the code easier to read. This change has no functional changes. Signed-off-by: Luis Chamberlain --- block/genhd.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/block/genhd.c b/block/genhd.c index 4dd6db3618f2..520e23b25ed5 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -390,6 +390,15 @@ static void disk_scan_partitions(struct gendisk *disk) blkdev_put(bdev, FMODE_READ); } +static void disk_announce(struct gendisk *disk) +{ + struct device *ddev = disk_to_dev(disk); + + /* announce the disk and partitions after all partitions are created */ + dev_set_uevent_suppress(ddev, 0); + disk_uevent(disk, KOBJ_ADD); +} + static void register_disk(struct device *parent, struct gendisk *disk, const struct attribute_group **groups) { @@ -433,10 +442,7 @@ static void register_disk(struct device *parent, struct gendisk *disk, return; disk_scan_partitions(disk); - - /* announce the disk and partitions after all partitions are created */ - dev_set_uevent_suppress(ddev, 0); - disk_uevent(disk, KOBJ_ADD); + disk_announce(disk); if (disk->queue->backing_dev_info->dev) { err = sysfs_create_link(&ddev->kobj, From patchwork Thu Jul 15 04:55:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luis Chamberlain X-Patchwork-Id: 12378817 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.0 required=3.0 tests=BAYES_00,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1E506C47E48 for ; Thu, 15 Jul 2021 04:55:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0829C6128B for ; Thu, 15 Jul 2021 04:55:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238750AbhGOE6h (ORCPT ); Thu, 15 Jul 2021 00:58:37 -0400 Received: from mail-pj1-f41.google.com ([209.85.216.41]:53111 "EHLO mail-pj1-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238737AbhGOE6g (ORCPT ); Thu, 15 Jul 2021 00:58:36 -0400 Received: by mail-pj1-f41.google.com with SMTP id bt15so2990065pjb.2; Wed, 14 Jul 2021 21:55:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=6oo98c6UbKQTMijd+O7s8Vz8iegr55iCRTENQPQsTlE=; b=MrKst64tmSoWHrAemNQQhMdez/5QoDZNnzoQhfcHCbfbL4/Z7Yv43sel1ED+8GLew5 l68ZQqi1dGMAWn2H45vcOVZbgZwOCuzjXtH8KxAjTTqoRiPtpFcC723BvuFmJbJzG6Dk 6SFHSPuZs7jOkuuoxCX/0JJWesHqZz1lAm3DTIaY4FlRepvsoeTuYhAUUlW392p5BEdD QyD4geks9fa5g4lP+ah+JlFbXDLf8heqRgrJmh51AOpOLrntHKeB0rLyZqsI0aQwA2Zy 014PKL+Ow14UNx6JsL965BuNnv7Am+b1KbGptHVotaKnQyVZhLoeOaF7rZqUQjrqgiQ2 h6Cg== X-Gm-Message-State: AOAM531BxfvADCPSwmZd67lh1e5PPZnTflnYuWQuBcBY2yHWdBJqAAQZ D2PWWOKeZO+YDQLlEfmKhN0= X-Google-Smtp-Source: ABdhPJwAvcBq2p3kJoCOdkLZfaE/p4uuhROOjDLOrUxpIx9yWz1XKNQ9o4drzfOFzPdXzBfOpcxl/g== X-Received: by 2002:a17:90b:184:: with SMTP id t4mr8073637pjs.161.1626324942651; Wed, 14 Jul 2021 21:55:42 -0700 (PDT) Received: from localhost ([191.96.120.37]) by smtp.gmail.com with ESMTPSA id m34sm5295387pgb.85.2021.07.14.21.55.41 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 14 Jul 2021 21:55:41 -0700 (PDT) From: Luis Chamberlain To: axboe@kernel.dk Cc: hare@suse.de, bvanassche@acm.org, ming.lei@redhat.com, hch@infradead.org, jack@suse.cz, osandov@fb.com, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, Luis Chamberlain Subject: [PATCH v2 3/6] block: move disk invalidation from del_gendisk() into a helper Date: Wed, 14 Jul 2021 21:55:28 -0700 Message-Id: <20210715045531.420201-4-mcgrof@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210715045531.420201-1-mcgrof@kernel.org> References: <20210715045531.420201-1-mcgrof@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org Move the disk / partition invalidation into a helper. This will make reading del_gendisk easier to read, in preparation for adding support to add error handling later on register_disk() and to later share more code with del_gendisk. This change has no functional changes. Signed-off-by: Luis Chamberlain --- block/genhd.c | 47 ++++++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/block/genhd.c b/block/genhd.c index 520e23b25ed5..e5535879d629 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -399,6 +399,31 @@ static void disk_announce(struct gendisk *disk) disk_uevent(disk, KOBJ_ADD); } +static void disk_invalidate(struct gendisk *disk) +{ + if (!(disk->flags & GENHD_FL_HIDDEN)) { + sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi"); + + /* + * Unregister bdi before releasing device numbers (as they can + * get reused and we'd get clashes in sysfs). + */ + bdi_unregister(disk->queue->backing_dev_info); + } + + blk_unregister_queue(disk); + + kobject_put(disk->part0->bd_holder_dir); + kobject_put(disk->slave_dir); + + part_stat_set_all(disk->part0, 0); + disk->part0->bd_stamp = 0; + if (!sysfs_deprecated) + sysfs_remove_link(block_depr, dev_name(disk_to_dev(disk))); + pm_runtime_set_memalloc_noio(disk_to_dev(disk), false); + device_del(disk_to_dev(disk)); +} + static void register_disk(struct device *parent, struct gendisk *disk, const struct attribute_group **groups) { @@ -606,27 +631,7 @@ void del_gendisk(struct gendisk *disk) set_capacity(disk, 0); - if (!(disk->flags & GENHD_FL_HIDDEN)) { - sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi"); - - /* - * Unregister bdi before releasing device numbers (as they can - * get reused and we'd get clashes in sysfs). - */ - bdi_unregister(disk->queue->backing_dev_info); - } - - blk_unregister_queue(disk); - - kobject_put(disk->part0->bd_holder_dir); - kobject_put(disk->slave_dir); - - part_stat_set_all(disk->part0, 0); - disk->part0->bd_stamp = 0; - if (!sysfs_deprecated) - sysfs_remove_link(block_depr, dev_name(disk_to_dev(disk))); - pm_runtime_set_memalloc_noio(disk_to_dev(disk), false); - device_del(disk_to_dev(disk)); + disk_invalidate(disk); } EXPORT_SYMBOL(del_gendisk); From patchwork Thu Jul 15 04:55:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luis Chamberlain X-Patchwork-Id: 12378819 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.0 required=3.0 tests=BAYES_00,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0B7A9C47E48 for ; Thu, 15 Jul 2021 04:55:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id EA0FD6136E for ; Thu, 15 Jul 2021 04:55:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238763AbhGOE6l (ORCPT ); Thu, 15 Jul 2021 00:58:41 -0400 Received: from mail-pl1-f181.google.com ([209.85.214.181]:36585 "EHLO mail-pl1-f181.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238764AbhGOE6i (ORCPT ); Thu, 15 Jul 2021 00:58:38 -0400 Received: by mail-pl1-f181.google.com with SMTP id x16so2566288plg.3; Wed, 14 Jul 2021 21:55:45 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=gzAKa7kt8ZT7pS8b4C7kOkEXTr3fcPAutgO6swoD5sI=; b=fXQiy1FVsndr9c4fb3DoxsLQmkXLa5XT/ECGdn/Y043US4w1qGljD/u3oclD/wq2CN rk9QmUbHNDWBs1ytg5wNSWHIbbMpRsyhOtvaHNDuvkyVu4ycbEFZLbS/K5IvQQqMWRyH 8vfMcu7f2RZNLAZtsu2QUWayrP5GFpiPG7+hFB43hTO4fjUt2uO5l7vhmuyjDjqLGqb+ Z7DObXnw6ck67J4EVv3Gvl4uhU0pXSjB1VuKK5V+HCN5652BnauC1yg8CWq4kj4H01A1 ZDBiTs7PRH4w9LZDbWzwbGln525fO6DdBWvjNFH+QtkYpcQMEtL5l7EoreevO97EdvhS 365g== X-Gm-Message-State: AOAM532QNL3pxZh1ifhC/9jz1sI1Sfm9xWT2dN3YcKFCOqe4WoG5ii2s PIC0Lhpmf0iKa+nEI6PSEIA= X-Google-Smtp-Source: ABdhPJwfCObClM2Tb2jRMyLjkFno0TcPw/O3hx89udETKxN8IwYQB2MvcT4kuWNJGWZPHZqZ+HlT7w== X-Received: by 2002:a17:902:b409:b029:129:a9a6:fc76 with SMTP id x9-20020a170902b409b0290129a9a6fc76mr1828699plr.68.1626324945195; Wed, 14 Jul 2021 21:55:45 -0700 (PDT) Received: from localhost ([191.96.120.37]) by smtp.gmail.com with ESMTPSA id u37sm4702796pfg.140.2021.07.14.21.55.43 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 14 Jul 2021 21:55:44 -0700 (PDT) From: Luis Chamberlain To: axboe@kernel.dk Cc: hare@suse.de, bvanassche@acm.org, ming.lei@redhat.com, hch@infradead.org, jack@suse.cz, osandov@fb.com, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, Luis Chamberlain Subject: [PATCH v2 4/6] block: move disk unregistration work from del_gendisk() to a helper Date: Wed, 14 Jul 2021 21:55:29 -0700 Message-Id: <20210715045531.420201-5-mcgrof@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210715045531.420201-1-mcgrof@kernel.org> References: <20210715045531.420201-1-mcgrof@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org There is quite a bit of code on del_gendisk() which relates to unregistering the disk, using register_disk() as an counter. Move all this code into a helper instead of re-writing our own, which we'll need later to handle errors on add_disk(). Since disk unregistrationa also deals with partition unregistration, provide a halper for that as well, as we'll later need this when adding error handling for add_disk(). Signed-off-by: Luis Chamberlain --- block/genhd.c | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/block/genhd.c b/block/genhd.c index e5535879d629..b84ba22eed39 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -399,6 +399,25 @@ static void disk_announce(struct gendisk *disk) disk_uevent(disk, KOBJ_ADD); } +static void unregister_disk_partitions(struct gendisk *disk) +{ + mutex_lock(&disk->open_mutex); + disk->flags &= ~GENHD_FL_UP; + blk_drop_partitions(disk); + mutex_unlock(&disk->open_mutex); + + fsync_bdev(disk->part0); + __invalidate_device(disk->part0, true); + + /* + * Unhash the bdev inode for this device so that it can't be looked + * up any more even if openers still hold references to it. + */ + remove_inode_hash(disk->part0->bd_inode); + + set_capacity(disk, 0); +} + static void disk_invalidate(struct gendisk *disk) { if (!(disk->flags & GENHD_FL_HIDDEN)) { @@ -424,6 +443,12 @@ static void disk_invalidate(struct gendisk *disk) device_del(disk_to_dev(disk)); } +static void unregister_disk(struct gendisk *disk) +{ + unregister_disk_partitions(disk); + disk_invalidate(disk); +} + static void register_disk(struct device *parent, struct gendisk *disk, const struct attribute_group **groups) { @@ -614,24 +639,7 @@ void del_gendisk(struct gendisk *disk) blk_integrity_del(disk); disk_del_events(disk); - - mutex_lock(&disk->open_mutex); - disk->flags &= ~GENHD_FL_UP; - blk_drop_partitions(disk); - mutex_unlock(&disk->open_mutex); - - fsync_bdev(disk->part0); - __invalidate_device(disk->part0, true); - - /* - * Unhash the bdev inode for this device so that it can't be looked - * up any more even if openers still hold references to it. - */ - remove_inode_hash(disk->part0->bd_inode); - - set_capacity(disk, 0); - - disk_invalidate(disk); + unregister_disk(disk); } EXPORT_SYMBOL(del_gendisk); From patchwork Thu Jul 15 04:55:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luis Chamberlain X-Patchwork-Id: 12378821 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.0 required=3.0 tests=BAYES_00,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 85200C07E96 for ; Thu, 15 Jul 2021 04:55:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 722EB61370 for ; Thu, 15 Jul 2021 04:55:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234741AbhGOE6l (ORCPT ); Thu, 15 Jul 2021 00:58:41 -0400 Received: from mail-pj1-f44.google.com ([209.85.216.44]:43991 "EHLO mail-pj1-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238815AbhGOE6k (ORCPT ); Thu, 15 Jul 2021 00:58:40 -0400 Received: by mail-pj1-f44.google.com with SMTP id x21-20020a17090aa395b029016e25313bfcso3185656pjp.2; Wed, 14 Jul 2021 21:55:47 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=uIY5YsFS9a/gTtxa0zx/TpcbACx+0EdBSHCqP5kfZEw=; b=qWUxq/ddA6BWp/GRFF4WHkXgQknAS6X+XPJrLhu3nEfbvrqWlEa1aRR3Q4iOTL+khb E2Xp/uFJ4befbTCkRmPKDMw4XHdi/o65xXkb5qz9O9PVkAxePeZN/FHx/zxwhU9mfS1w fOXxBvUQsPLVINDCx94ZqqRtuuqjhUmvut/8uCqLpFknSuLGJepo8CG8GYdHWnGYLsxn JNEaY2XjwKSq/qvcV9U/ljaiTGLtTajzOrWx0NHwK0AI8oFxL5CARzadacPwC0ip3a8l ywBaj2VcpNjhETGh3udXm8rPSa/uUQeg39WTskGyU1vGDekX05uDfHRjGHNb52oAwIs3 1gjg== X-Gm-Message-State: AOAM531lJPZk84UvDWZNJ6nE6VxDTTRTVbFRnB5Ocapo8f7ijen+LvXE WlhKeg/ic/KhycbZYA1fY5Q= X-Google-Smtp-Source: ABdhPJwiTp2QLY3F1oVtCotj3f0Q8MEaNTAyl0bVVI9ah/j6Eq6KnkOvyDFlcjTkCYBZivAM2tkf/A== X-Received: by 2002:a17:90a:b398:: with SMTP id e24mr2017658pjr.151.1626324947276; Wed, 14 Jul 2021 21:55:47 -0700 (PDT) Received: from localhost ([191.96.120.37]) by smtp.gmail.com with ESMTPSA id a15sm4539321pff.128.2021.07.14.21.55.45 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 14 Jul 2021 21:55:46 -0700 (PDT) From: Luis Chamberlain To: axboe@kernel.dk Cc: hare@suse.de, bvanassche@acm.org, ming.lei@redhat.com, hch@infradead.org, jack@suse.cz, osandov@fb.com, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, Luis Chamberlain Subject: [PATCH v2 5/6] block: add initial error handling for *add_disk()* and friends Date: Wed, 14 Jul 2021 21:55:30 -0700 Message-Id: <20210715045531.420201-6-mcgrof@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210715045531.420201-1-mcgrof@kernel.org> References: <20210715045531.420201-1-mcgrof@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org This adds error handling to the *add_disk*() callers and the functions it depends on. This is initial work as drivers are not converted. That is separate work. Signed-off-by: Luis Chamberlain --- block/blk-integrity.c | 12 +++-- block/blk-sysfs.c | 5 +- block/blk.h | 7 +-- block/disk-events.c | 8 +-- block/genhd.c | 118 ++++++++++++++++++++++++++++++------------ include/linux/genhd.h | 14 ++--- 6 files changed, 112 insertions(+), 52 deletions(-) diff --git a/block/blk-integrity.c b/block/blk-integrity.c index 410da060d1f5..e46f47f2dec9 100644 --- a/block/blk-integrity.c +++ b/block/blk-integrity.c @@ -431,13 +431,17 @@ void blk_integrity_unregister(struct gendisk *disk) } EXPORT_SYMBOL(blk_integrity_unregister); -void blk_integrity_add(struct gendisk *disk) +int blk_integrity_add(struct gendisk *disk) { - if (kobject_init_and_add(&disk->integrity_kobj, &integrity_ktype, - &disk_to_dev(disk)->kobj, "%s", "integrity")) - return; + int ret; + + ret = kobject_init_and_add(&disk->integrity_kobj, &integrity_ktype, + &disk_to_dev(disk)->kobj, "%s", "integrity"); + if (ret) + return ret; kobject_uevent(&disk->integrity_kobj, KOBJ_ADD); + return 0; } void blk_integrity_del(struct gendisk *disk) diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c index 370d83c18057..7fd53bf3f8ad 100644 --- a/block/blk-sysfs.c +++ b/block/blk-sysfs.c @@ -862,9 +862,10 @@ int blk_register_queue(struct gendisk *disk) if (WARN_ON(!q)) return -ENXIO; - WARN_ONCE(blk_queue_registered(q), + if (WARN_ONCE(blk_queue_registered(q), "%s is registering an already registered queue\n", - kobject_name(&dev->kobj)); + kobject_name(&dev->kobj))) + return -ENXIO; blk_queue_update_readahead(q); diff --git a/block/blk.h b/block/blk.h index 4b885c0f6708..e24273ebc4bd 100644 --- a/block/blk.h +++ b/block/blk.h @@ -132,7 +132,7 @@ static inline bool integrity_req_gap_front_merge(struct request *req, bip_next->bip_vec[0].bv_offset); } -void blk_integrity_add(struct gendisk *); +int blk_integrity_add(struct gendisk *); void blk_integrity_del(struct gendisk *); #else /* CONFIG_BLK_DEV_INTEGRITY */ static inline bool blk_integrity_merge_rq(struct request_queue *rq, @@ -166,8 +166,9 @@ static inline bool bio_integrity_endio(struct bio *bio) static inline void bio_integrity_free(struct bio *bio) { } -static inline void blk_integrity_add(struct gendisk *disk) +static inline int blk_integrity_add(struct gendisk *disk) { + return 0; } static inline void blk_integrity_del(struct gendisk *disk) { @@ -360,7 +361,7 @@ int bio_add_hw_page(struct request_queue *q, struct bio *bio, struct request_queue *blk_alloc_queue(int node_id); -void disk_alloc_events(struct gendisk *disk); +int disk_alloc_events(struct gendisk *disk); void disk_add_events(struct gendisk *disk); void disk_del_events(struct gendisk *disk); void disk_release_events(struct gendisk *disk); diff --git a/block/disk-events.c b/block/disk-events.c index a75931ff5da4..0262784be34c 100644 --- a/block/disk-events.c +++ b/block/disk-events.c @@ -410,17 +410,17 @@ module_param_cb(events_dfl_poll_msecs, &disk_events_dfl_poll_msecs_param_ops, /* * disk_{alloc|add|del|release}_events - initialize and destroy disk_events. */ -void disk_alloc_events(struct gendisk *disk) +int disk_alloc_events(struct gendisk *disk) { struct disk_events *ev; if (!disk->fops->check_events || !disk->events) - return; + return 0; ev = kzalloc(sizeof(*ev), GFP_KERNEL); if (!ev) { pr_warn("%s: failed to initialize events\n", disk->disk_name); - return; + return -ENOMEM; } INIT_LIST_HEAD(&ev->node); @@ -432,6 +432,8 @@ void disk_alloc_events(struct gendisk *disk) INIT_DELAYED_WORK(&ev->dwork, disk_events_workfn); disk->ev = ev; + + return 0; } void disk_add_events(struct gendisk *disk) diff --git a/block/genhd.c b/block/genhd.c index b84ba22eed39..c6c9c196ff27 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -449,8 +449,9 @@ static void unregister_disk(struct gendisk *disk) disk_invalidate(disk); } -static void register_disk(struct device *parent, struct gendisk *disk, - const struct attribute_group **groups) +static int __must_check register_disk(struct device *parent, + struct gendisk *disk, + const struct attribute_group **groups) { struct device *ddev = disk_to_dev(disk); int err; @@ -466,15 +467,21 @@ static void register_disk(struct device *parent, struct gendisk *disk, WARN_ON(ddev->groups); ddev->groups = groups; } - if (device_add(ddev)) - return; + err = device_add(ddev); + if (err) { + /* + * We don't put_device(ddev), the driver is responsible to + * issue the last put_device(ddev), however it does this + * inderectly with put_disk(), or typically more often with + * just blk_cleanup_disk(). + */ + return err; + } if (!sysfs_deprecated) { err = sysfs_create_link(block_depr, &ddev->kobj, kobject_name(&ddev->kobj)); - if (err) { - device_del(ddev); - return; - } + if (err) + goto exit_del_device; } /* @@ -489,7 +496,7 @@ static void register_disk(struct device *parent, struct gendisk *disk, disk->slave_dir = kobject_create_and_add("slaves", &ddev->kobj); if (disk->flags & GENHD_FL_HIDDEN) - return; + return 0; disk_scan_partitions(disk); disk_announce(disk); @@ -498,8 +505,19 @@ static void register_disk(struct device *parent, struct gendisk *disk, err = sysfs_create_link(&ddev->kobj, &disk->queue->backing_dev_info->dev->kobj, "bdi"); - WARN_ON(err); + if (WARN_ON(err)) + goto exit_del_block_depr; } + return 0; + +exit_del_block_depr: + unregister_disk_partitions(disk); + if (!sysfs_deprecated) + sysfs_remove_link(block_depr, dev_name(disk_to_dev(disk))); +exit_del_device: + device_del(ddev); + + return err; } /** @@ -512,22 +530,24 @@ static void register_disk(struct device *parent, struct gendisk *disk, * This function registers the partitioning information in @disk * with the kernel. * - * FIXME: error handling */ -static void __device_add_disk(struct device *parent, struct gendisk *disk, - const struct attribute_group **groups, - bool register_queue) +static int __device_add_disk(struct device *parent, struct gendisk *disk, + const struct attribute_group **groups, + bool register_queue) { int ret; /* * Take an extra ref on queue which will be put on disk_release() - * so that it sticks around as long as @disk is there. + * so that it sticks around as long as @disk is there. The driver + * must call blk_cleanup_disk() on error from this function. */ - if (blk_get_queue(disk->queue)) - set_bit(GD_QUEUE_REF, &disk->state); - else - WARN_ON_ONCE(1); + if (WARN_ON_ONCE(!blk_get_queue(disk->queue))) { + disk->queue = NULL; + return -ESHUTDOWN; + } + + set_bit(GD_QUEUE_REF, &disk->state); /* * The disk queue should now be all set with enough information about @@ -546,7 +566,8 @@ static void __device_add_disk(struct device *parent, struct gendisk *disk, * and all partitions from the extended dev_t space. */ if (disk->major) { - WARN_ON(!disk->minors); + if (WARN_ON(!disk->minors)) + return -EINVAL; if (disk->minors > DISK_MAX_PARTS) { pr_err("block: can't allocate more than %d partitions\n", @@ -554,12 +575,13 @@ static void __device_add_disk(struct device *parent, struct gendisk *disk, disk->minors = DISK_MAX_PARTS; } } else { - WARN_ON(disk->minors); + if (WARN_ON(disk->minors)) + return -EINVAL; ret = blk_alloc_ext_minor(); if (ret < 0) { WARN_ON(1); - return; + return ret; } disk->major = BLOCK_EXT_MAJOR; disk->first_minor = MINOR(ret); @@ -568,7 +590,9 @@ static void __device_add_disk(struct device *parent, struct gendisk *disk, disk->flags |= GENHD_FL_UP; - disk_alloc_events(disk); + ret = disk_alloc_events(disk); + if (ret) + goto exit_free_ext_minor; if (disk->flags & GENHD_FL_HIDDEN) { /* @@ -585,29 +609,57 @@ static void __device_add_disk(struct device *parent, struct gendisk *disk, dev->devt = MKDEV(disk->major, disk->first_minor); ret = bdi_register(bdi, "%u:%u", disk->major, disk->first_minor); - WARN_ON(ret); + if (WARN_ON(ret)) + goto exit_disk_release_events; bdi_set_owner(bdi, dev); bdev_add(disk->part0, dev->devt); } - register_disk(parent, disk, groups); - if (register_queue) - blk_register_queue(disk); + ret = register_disk(parent, disk, groups); + if (ret) + goto exit_unregister_bdi; + + if (register_queue) { + ret = blk_register_queue(disk); + if (ret) + goto exit_unregister_disk; + } disk_add_events(disk); - blk_integrity_add(disk); + + ret = blk_integrity_add(disk); + if (ret) + goto exit_del_events; + + return 0; +exit_del_events: + disk_del_events(disk); +exit_unregister_disk: + unregister_disk(disk); + return ret; + +exit_unregister_bdi: + if (disk->queue && !(disk->flags & GENHD_FL_HIDDEN)) + bdi_unregister(disk->queue->backing_dev_info); +exit_disk_release_events: + disk_release_events(disk); +exit_free_ext_minor: + if (disk->major == BLOCK_EXT_MAJOR) + blk_free_ext_minor(disk->first_minor); + + return ret; } -void device_add_disk(struct device *parent, struct gendisk *disk, - const struct attribute_group **groups) +int device_add_disk(struct device *parent, struct gendisk *disk, + const struct attribute_group **groups) { - __device_add_disk(parent, disk, groups, true); + return __device_add_disk(parent, disk, groups, true); } EXPORT_SYMBOL(device_add_disk); -void device_add_disk_no_queue_reg(struct device *parent, struct gendisk *disk) +int device_add_disk_no_queue_reg(struct device *parent, struct gendisk *disk) { - __device_add_disk(parent, disk, NULL, false); + return __device_add_disk(parent, disk, NULL, false); } EXPORT_SYMBOL(device_add_disk_no_queue_reg); diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 13b34177cc85..51f27b9b38b5 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -210,16 +210,16 @@ static inline dev_t disk_devt(struct gendisk *disk) void disk_uevent(struct gendisk *disk, enum kobject_action action); /* block/genhd.c */ -extern void device_add_disk(struct device *parent, struct gendisk *disk, - const struct attribute_group **groups); -static inline void add_disk(struct gendisk *disk) +extern int device_add_disk(struct device *parent, struct gendisk *disk, + const struct attribute_group **groups); +static inline int add_disk(struct gendisk *disk) { - device_add_disk(NULL, disk, NULL); + return device_add_disk(NULL, disk, NULL); } -extern void device_add_disk_no_queue_reg(struct device *parent, struct gendisk *disk); -static inline void add_disk_no_queue_reg(struct gendisk *disk) +extern int device_add_disk_no_queue_reg(struct device *parent, struct gendisk *disk); +static inline int add_disk_no_queue_reg(struct gendisk *disk) { - device_add_disk_no_queue_reg(NULL, disk); + return device_add_disk_no_queue_reg(NULL, disk); } extern void del_gendisk(struct gendisk *gp); From patchwork Thu Jul 15 04:55:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luis Chamberlain X-Patchwork-Id: 12378823 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.0 required=3.0 tests=BAYES_00,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 92F4DC07E96 for ; Thu, 15 Jul 2021 04:55:52 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7A2EB6128B for ; Thu, 15 Jul 2021 04:55:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238796AbhGOE6n (ORCPT ); Thu, 15 Jul 2021 00:58:43 -0400 Received: from mail-pf1-f176.google.com ([209.85.210.176]:44733 "EHLO mail-pf1-f176.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238811AbhGOE6m (ORCPT ); Thu, 15 Jul 2021 00:58:42 -0400 Received: by mail-pf1-f176.google.com with SMTP id p36so3961762pfw.11; Wed, 14 Jul 2021 21:55:50 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=pOI+K4se5F+tjOo+nofYA29zCaWihWWoanvceJ6H/xU=; b=lf7/jppG/vhzD2IQbiX4XOm/jOk5Ns2OqzfsOYzEtYYhLW4D9bwIL6KXkL57+CHgE+ bLWaljI4SgGZNDzE+P7d9bzrCUqhdUVcQZYP1PchhYTpybY3skZym8xdj1v9pi6JrVxx gHEXCFhnSKCmR87ru6oiXPsoKcRJbZxBzAlp3yW9PruktNKnh2JN+qfpo+lnBXtfniYN slux/mtXnD0blkUP4rCs1Eizcq+ai4NKjuelry4uNvZyy7U1V7w2bAqyksWFF8m5dJqA zsoXpcFE/nSpv1itIwbI2hdYdTUNAyVwcUdFW2oS7CQ+cqSuLVz8cXzvB3mtXFRN0RKu 0yrg== X-Gm-Message-State: AOAM530Wf6Wry+JgeVTUEdgQwf4OwW7ynbO3VYKSFzkCj4zgq8lsiZNK 8hGlHFsUou3xxpnjwPKpse8= X-Google-Smtp-Source: ABdhPJzg/unAdwX1mLJAowB5+WGRjSo9XkLzoOJAxLVtb3bUrtqCUVr0/U3td/GkmhClBUcuWjNfJw== X-Received: by 2002:a63:c62:: with SMTP id 34mr2414998pgm.32.1626324949607; Wed, 14 Jul 2021 21:55:49 -0700 (PDT) Received: from localhost ([191.96.120.37]) by smtp.gmail.com with ESMTPSA id g141sm4630465pfb.210.2021.07.14.21.55.48 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 14 Jul 2021 21:55:48 -0700 (PDT) From: Luis Chamberlain To: axboe@kernel.dk Cc: hare@suse.de, bvanassche@acm.org, ming.lei@redhat.com, hch@infradead.org, jack@suse.cz, osandov@fb.com, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, Luis Chamberlain Subject: [PATCH v2 6/6] block: skip queue if NULL on blk_cleanup_queue() Date: Wed, 14 Jul 2021 21:55:31 -0700 Message-Id: <20210715045531.420201-7-mcgrof@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210715045531.420201-1-mcgrof@kernel.org> References: <20210715045531.420201-1-mcgrof@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org Now that error handling for add_disk*() calls is added, we must accept a common form for when errors are detected on the the add_disk*() calls, and that is to call blk_cleanup_disk() on error always. One of the corner cases possible is a driver bug where the queue is already gone and we cannot blk_get_queue(), and so may be NULL. When blk_cleanup_disk() is called in this case blk_cleanup_queue() will crash with a null dereference. Make this an accepted condition and just skip it. This allows us to also test for it safely with error injection. Signed-off-by: Luis Chamberlain --- block/blk-core.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/block/blk-core.c b/block/blk-core.c index 04477697ee4b..156f7d3b4bd9 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -372,6 +372,9 @@ void blk_cleanup_queue(struct request_queue *q) /* cannot be called from atomic context */ might_sleep(); + if (!q) + return; + WARN_ON_ONCE(blk_queue_registered(q)); /* mark @q DYING, no new request or merges will be allowed afterwards */