2002-11-17 23:57:11

by Doug Ledford

[permalink] [raw]
Subject: Failure to reread partition tables on non-busy devices

This patch (almost certainly wrong BTW) makes it work. Obviously,
somewhere there should be a call to invalidate_bdev(); that doesn't exist.
I'm not sure A) where that call should be and B) what checks there should
be to avoid calling invalidate_bdev() on a device that is busy.

fs/partitions/check.c: 1.85 1.86 dledford 02/11/17 17:22:37 (modified,
needs delta)

@@ -453,8 +453,8 @@ int rescan_partitions()
struct parsed_partitions *state;
int p, res;

- if (!bdev->bd_invalidated)
- return 0;
+ //if (!bdev->bd_invalidated)
+ // return 0;
if (bdev->bd_part_count)
return -EBUSY;
res = invalidate_device(dev, 1);

--
Doug Ledford <[email protected]> 919-754-3700 x44233
Red Hat, Inc.
1801 Varsity Dr.
Raleigh, NC 27606


2002-11-18 00:29:04

by Douglas Gilbert

[permalink] [raw]
Subject: Re: Failure to reread partition tables on non-busy devices

Doug,
Your patch below fixes the problem I was seeing with fdisk
creating new partitions (on a scsi_debug ram disk) not being
visible outside fdisk.

Doug Gilbert

Doug Ledford wrote:
> This patch (almost certainly wrong BTW) makes it work. Obviously,
> somewhere there should be a call to invalidate_bdev(); that doesn't exist.
> I'm not sure A) where that call should be and B) what checks there should
> be to avoid calling invalidate_bdev() on a device that is busy.
>
> fs/partitions/check.c: 1.85 1.86 dledford 02/11/17 17:22:37 (modified,
> needs delta)
>
> @@ -453,8 +453,8 @@ int rescan_partitions()
> struct parsed_partitions *state;
> int p, res;
>
> - if (!bdev->bd_invalidated)
> - return 0;
> + //if (!bdev->bd_invalidated)
> + // return 0;
> if (bdev->bd_part_count)
> return -EBUSY;
> res = invalidate_device(dev, 1);
>



2002-11-18 00:36:29

by Alexander Viro

[permalink] [raw]
Subject: Re: Failure to reread partition tables on non-busy devices



On Sun, 17 Nov 2002, Doug Ledford wrote:

> This patch (almost certainly wrong BTW) makes it work. Obviously,
> somewhere there should be a call to invalidate_bdev(); that doesn't exist.
> I'm not sure A) where that call should be and B) what checks there should
> be to avoid calling invalidate_bdev() on a device that is busy.


Not really. Correct fix is:
a) in fs/block_dev.c::full_check_disk_change() replace

if (check_disk_change(bdev)) {
with
if (check_disk_change(bdev) && bdev->bd_invalidated) {

b) lost the check in rescan_partitions().

Other callers either do that check themselves or don't want that check to
happen at all (BLKRRPART).

2002-11-18 02:59:03

by Doug Ledford

[permalink] [raw]
Subject: Re: Failure to reread partition tables on non-busy devices

On Sun, Nov 17, 2002 at 07:43:27PM -0500, Alexander Viro wrote:
> Not really. Correct fix is:
> a) in fs/block_dev.c::full_check_disk_change() replace
>
> if (check_disk_change(bdev)) {
> with
> if (check_disk_change(bdev) && bdev->bd_invalidated) {
>
> b) lost the check in rescan_partitions().
>
> Other callers either do that check themselves or don't want that check to
> happen at all (BLKRRPART).

Well, since you didn't attach the patch, here it is.

--
Doug Ledford <[email protected]> 919-754-3700 x44233
Red Hat, Inc.
1801 Varsity Dr.
Raleigh, NC 27606


Attachments:
(No filename) (611.00 B)
part.patch (735.00 B)
Download all attachments