All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dongsheng Yang <dongsheng.yang@linux.dev>
To: jaeyuel.im@lge.com, Alasdair Kergon <agk@redhat.com>,
	Mike Snitzer <snitzer@kernel.org>,
	Mikulas Patocka <mpatocka@redhat.com>
Cc: dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] dm init: ensure block device is ready before creating mapped device
Date: Thu, 11 Dec 2025 16:19:56 +0800	[thread overview]
Message-ID: <ef533f19-96a9-4e14-be1d-2290677cbfd2@linux.dev> (raw)
In-Reply-To: <20251211073426.123026-1-jaeyuel.im@lge.com>


在 12/11/2025 3:34 PM, jaeyuel.im@lge.com 写道:
> From: "jaeyuel.im" <jaeyuel.im@lge.com>
>
> The current implementation of dm_init_init() uses early_lookup_bdev() to
> wait for the device node to appear. However, early_lookup_bdev() only
> verifies that the device node exists and returns the dev_t. It does not
> guarantee that the underlying block device structure is fully initialized
> and ready for I/O operations or to be opened.
>
> On certain platforms (e.g., embedded systems with specific storage
> drivers), this can lead to a race condition where dm_early_create()
> attempts to open the device immediately after early_lookup_bdev() returns,
> but fails because the device is not yet fully ready. This results in boot
> failures as the mapped device cannot be created.
>
> This patch adds an additional check using blkdev_get_no_open() after
> early_lookup_bdev() returns. This ensures that the struct block_device is
> actually available and the device is ready to be opened, effectively
> preventing the race condition.
>
> Signed-off-by: jaeyuel.im <jaeyuel.im@lge.com>
> ---
>   drivers/md/dm-init.c | 14 ++++++++++++++
>   1 file changed, 14 insertions(+)
>
> diff --git a/drivers/md/dm-init.c b/drivers/md/dm-init.c
> index ff9420f06483..76b84ca39906 100644
> --- a/drivers/md/dm-init.c
> +++ b/drivers/md/dm-init.c
> @@ -299,10 +299,24 @@ static int __init dm_init_init(void)
>   	for (i = 0; i < ARRAY_SIZE(waitfor); i++) {
>   		if (waitfor[i]) {
>   			dev_t dev;
> +			struct block_device *bdev;
>   
>   			DMINFO("waiting for device %s ...", waitfor[i]);
>   			while (early_lookup_bdev(waitfor[i], &dev))
>   				fsleep(5000);
> +
> +			/*
> +			 * early_lookup_bdev() only checks if the device node exists and
> +			 * returns the dev_t. It does not guarantee that the underlying
> +			 * block device is fully initialized and ready to be opened. On
> +			 * some platforms, this can lead to a race condition where
> +			 * dm_early_create() fails because the device is not yet ready.
> +			 * Ensure the block device is truly available by attempting to
> +			 * get it.
> +			 */
> +			while (!(bdev = blkdev_get_no_open(dev)))

You need to pass autoload parameter for new blkdev_get_no_open()

"struct block_device *blkdev_get_no_open(dev_t dev, bool autoload)"


Thanx

> +				fsleep(5000);
> +			blkdev_put_no_open(bdev);
>   		}
>   	}
>   

  reply	other threads:[~2025-12-11  8:20 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-12-11  7:34 [PATCH] dm init: ensure block device is ready before creating mapped device jaeyuel.im
2025-12-11  8:19 ` Dongsheng Yang [this message]
  -- strict thread matches above, loose matches on Subject: below --
2025-12-12  0:09 [PATCH v2] " jaeyuel.im
2026-02-06  5:05 ` [PATCH] " jaeyuel.im
2026-02-08  6:21   ` Benjamin Marzinski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ef533f19-96a9-4e14-be1d-2290677cbfd2@linux.dev \
    --to=dongsheng.yang@linux.dev \
    --cc=agk@redhat.com \
    --cc=dm-devel@lists.linux.dev \
    --cc=jaeyuel.im@lge.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mpatocka@redhat.com \
    --cc=snitzer@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.