Messages in this thread Patch in this message | | | Subject | Re: [PATCH -next 0/2] block: fix scan partition for exclusively open device again | From | Yu Kuai <> | Date | Wed, 22 Mar 2023 10:15:30 +0800 |
| |
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@huawei.com> >>>>> >>>>> 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 >> >> >> . >> > > > . >
| |