From: Daan De Meyer via B4 Relay <devnull+daan.amutable.com@kernel.org>
To: Jens Axboe <axboe@kernel.dk>,
Christian Brauner <brauner@kernel.org>,
Daan De Meyer <daan.j.demeyer@gmail.com>,
Josef Bacik <josef@toxicpanda.com>
Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org,
nbd@other.debian.org, Daan De Meyer <daan@amutable.com>,
stable@vger.kernel.org
Subject: [PATCH 1/2] loop: drop stale partitions on LOOP_CHANGE_FD
Date: Thu, 06 Aug 2026 12:36:57 +0200 [thread overview]
Message-ID: <20260806-b4-loop-nbd-stale-partitions-v1-1-67bb75a8d7be@amutable.com> (raw)
In-Reply-To: <20260806-b4-loop-nbd-stale-partitions-v1-0-67bb75a8d7be@amutable.com>
From: Daan De Meyer <daan@amutable.com>
Commit 267ec4d7223a ("loop: fix partition scan race between udev and
loop_reread_partitions()") stopped disk_force_media_change() from
setting GD_NEED_PART_SCAN. That bit did more than request a rescan:
bdev_disk_changed() drops every partition before it consults
disk_has_partscan(), so the lazy scan on the next open was also what
removed partitions from a loop device without LO_FLAGS_PARTSCAN.
Such devices are not unusual. bdev_add_partition() only rejects
GENHD_FL_NO_PART disks, so BLKPG_ADD_PARTITION works while
GD_SUPPRESS_PART_SCAN is set, and parted, libfdisk and systemd all fall
back to BLKPG when BLKRRPART fails with -EINVAL, which is what a loop
device without LO_FLAGS_PARTSCAN returns.
loop_change_fd() only rescans when LO_FLAGS_PARTSCAN is set, so those
partitions now survive the backing file swap and keep describing the old
file. The new backing file must have the same size, but its partition
table can be completely different, leaving the partition devices mapping
the wrong ranges.
Call loop_reread_partitions() unconditionally. Without LO_FLAGS_PARTSCAN,
blk_add_partitions() returns early, so this drops the stale partitions
without scanning the new backing file.
Fixes: 267ec4d7223a ("loop: fix partition scan race between udev and loop_reread_partitions()")
Cc: stable@vger.kernel.org
Signed-off-by: Daan De Meyer <daan@amutable.com>
---
drivers/block/loop.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 1faecef33009..416a9c651f97 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -538,7 +538,6 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
struct file *old_file;
unsigned int memflags;
int error;
- bool partscan;
bool is_loop;
if (!file)
@@ -592,7 +591,6 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
loop_assign_backing_file(lo, file);
loop_update_dio(lo);
blk_mq_unfreeze_queue(lo->lo_queue, memflags);
- partscan = lo->lo_flags & LO_FLAGS_PARTSCAN;
loop_global_unlock(lo, is_loop);
/*
@@ -610,8 +608,12 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
*/
fput(old_file);
dev_set_uevent_suppress(disk_to_dev(lo->lo_disk), 0);
- if (partscan)
- loop_reread_partitions(lo);
+ /*
+ * Rescan or, without LO_FLAGS_PARTSCAN, just drop the partitions of the
+ * old backing file. They can exist without LO_FLAGS_PARTSCAN as they may
+ * have been added manually with BLKPG.
+ */
+ loop_reread_partitions(lo);
error = 0;
done:
--
2.54.0
next prev parent reply other threads:[~2026-08-06 10:37 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-06 10:36 [PATCH 0/2] loop, nbd: drop partitions left behind by the GD_NEED_PART_SCAN removal Daan De Meyer via B4 Relay
2026-08-06 10:36 ` Daan De Meyer via B4 Relay [this message]
2026-08-06 10:36 ` [PATCH 2/2] nbd: drop stale partitions on NBD_CLEAR_SOCK Daan De Meyer via B4 Relay
2026-08-06 16:48 ` [PATCH 0/2] loop, nbd: drop partitions left behind by the GD_NEED_PART_SCAN removal Bart Van Assche
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=20260806-b4-loop-nbd-stale-partitions-v1-1-67bb75a8d7be@amutable.com \
--to=devnull+daan.amutable.com@kernel.org \
--cc=axboe@kernel.dk \
--cc=brauner@kernel.org \
--cc=daan.j.demeyer@gmail.com \
--cc=daan@amutable.com \
--cc=josef@toxicpanda.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=nbd@other.debian.org \
--cc=stable@vger.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).