Vince.
Alexander Viro wrote:
>
> On Thu, 11 Oct 2001, Vincent Sweeney wrote:
>
> > I have just upgrade my kernel to 2.4.12 and in the process I've lost a
> > partition on my secondary IDE drive. Since this is my /usr partition
> > it's kind of important ;)
>
> Please, see if the following fixes the problem.
>
> --- S11/fs/partitions/msdos.c Tue Oct 9 21:47:27 2001
> +++ /tmp/msdos.c Thu Oct 11 09:18:22 2001
> @@ -103,21 +103,20 @@
> */
>
> static void extended_partition(struct gendisk *hd, struct block_device *bdev,
> - int minor, int *current_minor)
> + int minor, unsigned long first_size, int *current_minor)
> {
> struct partition *p;
> Sector sect;
> unsigned char *data;
> - unsigned long first_sector, first_size, this_sector, this_size;
> + unsigned long first_sector, this_sector, this_size;
> int mask = (1 << hd->minor_shift) - 1;
> int sector_size = get_hardsect_size(to_kdev_t(bdev->bd_dev)) / 512;
> int loopct = 0; /* number of links followed
> without finding a data partition */
> int i;
>
> - first_sector = hd->part[minor].start_sect;
> - first_size = hd->part[minor].nr_sects;
> - this_sector = first_sector;
> + this_sector = first_sector = hd->part[minor].start_sect;
> + this_size = first_size;
>
> while (1) {
> if (++loopct > 100)
> @@ -133,8 +132,6 @@
>
> p = (struct partition *) (data + 0x1be);
>
> - this_size = hd->part[minor].nr_sects;
> -
> /*
> * Usually, the first entry is the real data partition,
> * the 2nd entry is the next extended partition, or empty,
> @@ -196,6 +193,7 @@
> goto done; /* nothing left to do */
>
> this_sector = first_sector + START_SECT(p) * sector_size;
> + this_size = NR_SECTS(p) * sector_size;
> minor = *current_minor;
> put_dev_sector(sect);
> }
> @@ -586,12 +584,13 @@
> }
> #endif
> if (is_extended_partition(p)) {
> + unsigned long size = hd->part[minor].nr_sects;
> printk(" <");
> /* prevent someone doing mkfs or mkswap on an
> extended partition, but leave room for LILO */
> - if (hd->part[minor].nr_sects > 2)
> + if (size > 2)
> hd->part[minor].nr_sects = 2;
> - extended_partition(hd, bdev, minor, ¤t_minor);
> + extended_partition(hd, bdev, minor, size, ¤t_minor);
> printk(" >");
> }
> }
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/