--- parted-1.6.15/libparted/linux.c.dasd_geometry 2004-10-07 21:20:42.436922904 -0400 +++ parted-1.6.15/libparted/linux.c 2004-10-07 21:21:46.175233208 -0400 @@ -731,8 +731,27 @@ LinuxSpecific* arch_specific = LINUX_SPECIFIC (dev); - if (!_device_probe_geometry (dev)) - goto error_close_dev; + PED_ASSERT (S_ISBLK (dev_stat.st_mode), return 0); + + dev->length = _device_get_length (dev); + if (!dev->length) + goto error_close_dev; + + dev->sector_size = _device_get_sector_size (dev); + if (!dev->sector_size) + goto error_close_dev; + + if (!ioctl (arch_specific->fd, HDIO_GETGEO, &geo)) { + dev->hw_geom.sectors = geo.sectors; + dev->hw_geom.heads = geo.heads; + dev->hw_geom.cylinders = dev->length / (dev->hw_geom.heads * dev->hw_geom.sectors) / (dev->sector_size / PED_SECTOR_SIZE); + dev->bios_geom = dev->hw_geom; + } else { + dev->bios_geom.sectors = 12; + dev->bios_geom.heads = 15; + dev->bios_geom.cylinders = dev->length / (dev->hw_geom.heads * dev->hw_geom.sectors) / (dev->sector_size / PED_SECTOR_SIZE); + dev->hw_geom = dev->bios_geom; + } dev->model = strdup (model_name);