From: Ming Lei <ming.lei@redhat.com>
To: Alexander Atanasov <alex@zazolabs.com>
Cc: Jens Axboe <axboe@kernel.dk>,
linux-block@vger.kernel.org, Yoav Cohen <yoav@nvidia.com>
Subject: Re: [PATCH] ublk: cleanup flag handling and fix UBLK_F_NO_AUTO_PART_SCAN
Date: Fri, 13 Feb 2026 11:48:18 +0800 [thread overview]
Message-ID: <aY6fAlXmzQZCKwmM@fedora> (raw)
In-Reply-To: <20260212152553.1737373-1-alex@zazolabs.com>
On Thu, Feb 12, 2026 at 03:25:52PM +0000, Alexander Atanasov wrote:
> Currently the code misuse GD_SUPPRESS_PART_SCAN flag
> as it tries to use it as a switch for the auto partition scan.
> When UBLK_F_NO_AUTO_PART_SCAN is not passed a proper
> auto partition scanning is not done because the first
> call to ublk_partition_scan_work will clear the bit
> GD_SUPPRESS_PART_SCAN but not actually load the partitions.
>
> How it should work:
> Unprivileged daemons - never scan partitions, they have
> GD_SUPPRESS_PART_SCAN always set - they are marked as devices
> without partitions. While ioctl(BLKRRPART) does require
> CAP_SYS_ADMIN, block layer have its own a check in
> disk_has_partscan(...) if partitions are supported.
>
> Trusted daemons - auto scan partitions by default
> and they do not have the bit set, so they do have partitions.
>
> For trusted daemons auto partitions scan is performed but it can
> be skipped if user have set UBLK_F_NO_AUTO_PART_SCAN flag.
>
> Rework the code to work as described above:
> - remove checks in ublk_partition_scan_work and rely on
> the caller to schedule the work only if it has to be done.
> - keep GD_SUPPRESS_PART_SCAN always set on unprivileged
> - keep GD_SUPPRESS_PART_SCAN always clear on trusted
> - Properly handle user request to skip auto partitioning scanning
>
> Fixes: 8443e2087e70 ("ublk: add UBLK_F_NO_AUTO_PART_SCAN feature flag")
> Signed-off-by: Alexander Atanasov <alex@zazolabs.com>
> ---
> drivers/block/ublk_drv.c | 14 ++++----------
> 1 file changed, 4 insertions(+), 10 deletions(-)
>
> Cc: Yoav Cohen <yoav@nvidia.com>
>
> diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c
> index 3c918db4905c..e662c6e8e722 100644
> --- a/drivers/block/ublk_drv.c
> +++ b/drivers/block/ublk_drv.c
> @@ -2361,14 +2361,9 @@ static void ublk_partition_scan_work(struct work_struct *work)
> if (!disk)
> return;
>
> - if (WARN_ON_ONCE(!test_and_clear_bit(GD_SUPPRESS_PART_SCAN,
> - &disk->state)))
> - goto out;
> -
It is wrong to remove clearing GD_SUPPRESS_PART_SCAN, otherwise ioctl(BLKRRPART)
can't succeed.
> mutex_lock(&disk->open_mutex);
> bdev_disk_changed(disk, false);
> mutex_unlock(&disk->open_mutex);
> -out:
> ublk_put_disk(disk);
> }
>
> @@ -4429,12 +4424,11 @@ static int ublk_ctrl_start_dev(struct ublk_device *ub,
>
> set_bit(UB_STATE_USED, &ub->state);
>
> - /* Skip partition scan if disabled by user */
> - if (ub->dev_info.flags & UBLK_F_NO_AUTO_PART_SCAN) {
> + if (!ub->unprivileged_daemons) {
> + /* Enable partition scanning for trusted daemons */
> clear_bit(GD_SUPPRESS_PART_SCAN, &disk->state);
> - } else {
> - /* Schedule async partition scan for trusted daemons */
> - if (!ub->unprivileged_daemons)
> + /* Skip auto partition scan if requested by user */
> + if (!(ub->dev_info.flags & UBLK_F_NO_AUTO_PART_SCAN))
> schedule_work(&ub->partition_scan_work);
We may switch to disallow partition scan permanently for UBLK_F_NO_AUTO_PART_SCAN
per discussion in the following thread:
https://lore.kernel.org/linux-block/0535f4dd-ada3-414a-84c6-7abc232aa670@kernel.dk/
So the change may can be simplified as below, meantime
selftests/ublk/test_part_01.sh need to be updated.
Alexander, please let us know if you'd like work this way?
diff --git a/include/uapi/linux/ublk_cmd.h b/include/uapi/linux/ublk_cmd.h
index a88876756805..d6f479fff75b 100644
--- a/include/uapi/linux/ublk_cmd.h
+++ b/include/uapi/linux/ublk_cmd.h
@@ -367,8 +367,8 @@
*/
#define UBLK_F_SAFE_STOP_DEV (1ULL << 17)
-/* Disable automatic partition scanning when device is started */
-#define UBLK_F_NO_AUTO_PART_SCAN (1ULL << 18)
+/* Disable partition scanning */
+#define UBLK_F_NO_PART_SCAN (1ULL << 18)
/* device state */
#define UBLK_S_DEV_DEAD 0
[root@ktest-40 linux]# git diff
diff --git a/drivers/block/ublk_drv.c b/drivers/block/ublk_drv.c
index c13cda58a7c6..f1a104222fb1 100644
--- a/drivers/block/ublk_drv.c
+++ b/drivers/block/ublk_drv.c
@@ -81,7 +81,7 @@
| (IS_ENABLED(CONFIG_BLK_DEV_INTEGRITY) ? UBLK_F_INTEGRITY : 0) \
| UBLK_F_SAFE_STOP_DEV \
| UBLK_F_BATCH_IO \
- | UBLK_F_NO_AUTO_PART_SCAN)
+ | UBLK_F_NO_PART_SCAN)
#define UBLK_F_ALL_RECOVERY_FLAGS (UBLK_F_USER_RECOVERY \
| UBLK_F_USER_RECOVERY_REISSUE \
@@ -4438,14 +4438,13 @@ static int ublk_ctrl_start_dev(struct ublk_device *ub,
set_bit(UB_STATE_USED, &ub->state);
- /* Skip partition scan if disabled by user */
- if (ub->dev_info.flags & UBLK_F_NO_AUTO_PART_SCAN) {
- clear_bit(GD_SUPPRESS_PART_SCAN, &disk->state);
- } else {
- /* Schedule async partition scan for trusted daemons */
- if (!ub->unprivileged_daemons)
- schedule_work(&ub->partition_scan_work);
- }
+ /*
+ * Only schedule async partition scan in case of
+ * !UBLK_F_NO_PART_SCAN and trusted daemons
+ */
+ if (!(ub->dev_info.flags & UBLK_F_NO_PART_SCAN) &&
+ !ub->unprivileged_daemons)
+ schedule_work(&ub->partition_scan_work);
out_put_cdev:
if (ret) {
diff --git a/include/uapi/linux/ublk_cmd.h b/include/uapi/linux/ublk_cmd.h
index a88876756805..d6f479fff75b 100644
--- a/include/uapi/linux/ublk_cmd.h
+++ b/include/uapi/linux/ublk_cmd.h
@@ -367,8 +367,8 @@
*/
#define UBLK_F_SAFE_STOP_DEV (1ULL << 17)
-/* Disable automatic partition scanning when device is started */
-#define UBLK_F_NO_AUTO_PART_SCAN (1ULL << 18)
+/* Disable partition scanning */
+#define UBLK_F_NO_PART_SCAN (1ULL << 18)
/* device state */
#define UBLK_S_DEV_DEAD 0
Thanks,
Ming
next prev parent reply other threads:[~2026-02-13 3:48 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-12 15:25 [PATCH] ublk: cleanup flag handling and fix UBLK_F_NO_AUTO_PART_SCAN Alexander Atanasov
2026-02-13 3:48 ` Ming Lei [this message]
2026-02-13 6:56 ` Hannes Reinecke
2026-02-13 11:05 ` Alexander Atanasov
2026-02-20 3:58 ` Ming Lei
2026-02-21 13:00 ` Alexander Atanasov
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=aY6fAlXmzQZCKwmM@fedora \
--to=ming.lei@redhat.com \
--cc=alex@zazolabs.com \
--cc=axboe@kernel.dk \
--cc=linux-block@vger.kernel.org \
--cc=yoav@nvidia.com \
/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.