Re: Partition check considered as error is breaking mounting in 2.6.27

From: Bill Davidsen
Date: Sat Sep 13 2008 - 11:55:23 EST


Andrew Morton wrote:
On Fri, 12 Sep 2008 13:56:49 -0300
Herton Ronaldo Krzesinski <herton@xxxxxxxxxxxxxxx> wrote:

Recently I found a problem with a buggy camera that doesn't mount anymore with 2.6.27 (its memory is available via usb-storage), since commit 04ebd4aee52b06a2c38127d9208546e5b96f3a19

The camera is an Olympus X-840. The original issue comes from the camera itself: its format program creates a partition with an off by one error, while the device reports that its memory has 42079 sectors, the partition table reports also that the only partition on the disk has the size of 42079, but it fails to account for the first sector in the memory that contains the partition table, so in the end the partition exceeds the limit of the device size (42080, first sector plus 42079 from the first partition).

In previous kernels (2.6.26 and before), I still could mount and access the device (/dev/sdb1), although with the following errors:

Yeah.

Can you test this please?

From: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>

Herton Krzesinski reports that the error-checking changes in
04ebd4aee52b06a2c38127d9208546e5b96f3a19 ("block/ioctl.c and
fs/partition/check.c: check value returned by add_partition") cause his
buggy USB camera to no longer mount. "The camera is an Olympus X-840. The original issue comes from the camera itself: its format program
creates a partition with an off by one error".

Buggy devices happen. It is better for the kernel to warn and to proceed
with the mount.

Reported-by: Herton Ronaldo Krzesinski <herton@xxxxxxxxxxxxxxx>
Cc: Abdel Benamrouche <draconux@xxxxxxxxx>
Cc: Jens Axboe <jens.axboe@xxxxxxxxxx>
Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
---

fs/partitions/check.c | 1 -
1 file changed, 1 deletion(-)

diff -puN fs/partitions/check.c~rescan_partitions-make-device-capacity-errors-non-fatal fs/partitions/check.c
--- a/fs/partitions/check.c~rescan_partitions-make-device-capacity-errors-non-fatal
+++ a/fs/partitions/check.c
@@ -540,7 +540,6 @@ int rescan_partitions(struct gendisk *di
if (from + size > get_capacity(disk)) {
printk(KERN_ERR " %s: p%d exceeds device capacity\n",
disk->disk_name, p);
- continue;
}
res = add_partition(disk, p, from, size, state->parts[p].flags);
if (res) {
_

I really like the patch Herton posted, with the big comment on why you don't want continue, to avoid repeating this conversation in a few years.

--
Bill Davidsen <davidsen@xxxxxxx>
"We have more to fear from the bungling of the incompetent than from
the machinations of the wicked." - from Slashdot

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/