Hi,
在 2023/03/22 10:02, Yu Kuai 写道:
Hi,
在 2023/03/22 9:34, Ming Lei 写道:
On Wed, Mar 22, 2023 at 09:26:07AM +0800, Yu Kuai wrote:
Hi,
在 2023/03/21 19:43, Ming Lei 写道:
On Fri, Feb 17, 2023 at 10:21:58AM +0800, Yu Kuai wrote:
From: Yu Kuai <yukuai3@xxxxxxxxxx>
Changes from RFC:
- remove the patch to factor out GD_NEED_PART_SCAN
Yu Kuai (2):
block: Revert "block: Do not reread partition table on exclusively
open device"
block: fix scan partition for exclusively open device again
Hi Yu kuai,
Looks the original issue starts to re-appear now with the two patches:
https://lore.kernel.org/linux-block/20221130135344.2ul4cyfstfs3znxg@quack3/
And underlying disk partition and raid partition can be observed at the
same time.
Can you take a look?
Yes, thanks for the report. I realize that sda1 adn sdb1 is created
while raid open sda and sdb excl, and I think this problem should exist
before this patchset.
Looks not reproduced before applying your two patches, that is exactly
what Jan
tried to fix with 36369f46e917 ("block: Do not reread partition table
on exclusively open device").
Hi, Ming
I just tried your test with this patchset reverted, and I can still
reporduce the problem myself.
Oops, I forgot to revert the first patch. It's right the problem can't
be reporduced.
raid only open this device excl, and disk_scan_partitions is not called:
md_import_device
blkdev_get_by_devo
I need to add some debuginfo to figure out how GD_NEED_PART_SCAN is set
for sda after raid is stopped. And this should explain why sda1 is
created.
I found how GD_NEED_PART_SCAN is set now, in patch 2, this is set before
bd_prepare_to_claim, so preciously faild part scan will still set this
bit, and following patch shold fix this problem:
diff --git a/block/genhd.c b/block/genhd.c
index 08bb1a9ec22c..2487c9452b94 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -368,7 +368,6 @@ int disk_scan_partitions(struct gendisk *disk,
fmode_t mode)
if (disk->open_partitions)
return -EBUSY;
- set_bit(GD_NEED_PART_SCAN, &disk->state);
/*
* If the device is opened exclusively by current thread
already, it's
* safe to scan partitons, otherwise, use bd_prepare_to_claim() to
@@ -381,6 +380,7 @@ int disk_scan_partitions(struct gendisk *disk,
fmode_t mode)
return ret;
}
+ set_bit(GD_NEED_PART_SCAN, &disk->state);
bdev = blkdev_get_by_dev(disk_devt(disk), mode & ~FMODE_EXCL,
NULL);
if (IS_ERR(bdev))
ret = PTR_ERR(bdev);
Thanks,
Kuai
The issue is reported by Changhui's block regression test.
Thanks,
Ming
.
.