--- /opt/kernel/linux-2.4.15-pre4-kdb/drivers/ide/ide.c Thu Nov 15 09:58:37 2001 +++ linux/drivers/ide/ide.c Thu Nov 15 09:52:43 2001 @@ -2655,14 +2655,27 @@ { struct hd_geometry *loc = (struct hd_geometry *) arg; unsigned short bios_cyl = drive->bios_cyl; /* truncate */ - if (!loc || (drive->media != ide_disk && drive->media != ide_floppy)) - return -EINVAL; - if (put_user(drive->bios_head, &loc->heads) || - put_user(drive->bios_sect, &loc->sectors) || - put_user(bios_cyl, &loc->cylinders) || - put_user(get_start_sect(inode->i_rdev), - &loc->start)) - return -EFAULT; + if (!loc || (drive->media != ide_disk && drive->media != ide_floppy)) return -EINVAL; + printk("ide GEO: h %d, s %d, c %d, start %lu\n", drive->bios_head, drive->bios_sect, drive->bios_cyl, loc->start); + if (put_user(drive->bios_head, (byte *) &loc->heads)) return -EFAULT; + if (put_user(drive->bios_sect, (byte *) &loc->sectors)) return -EFAULT; + if (put_user(bios_cyl, (unsigned short *) &loc->cylinders)) return -EFAULT; + if (put_user((unsigned)drive->part[MINOR(inode->i_rdev)&PARTN_MASK].start_sect, + (unsigned long *) &loc->start)) return -EFAULT; + return 0; + } + + case HDIO_GETGEO_BIG: + { + struct hd_big_geometry *loc = (struct hd_big_geometry *) arg; + if (!loc || (drive->media != ide_disk && drive->media != ide_floppy)) return -EINVAL; + + printk("ide GEO BIG: h %d, s %d, c %d, start %lu\n", drive->bios_head, drive->bios_sect, drive->bios_cyl, loc->start); + if (put_user(drive->bios_head, (byte *) &loc->heads)) return -EFAULT; + if (put_user(drive->bios_sect, (byte *) &loc->sectors)) return -EFAULT; + if (put_user(drive->bios_cyl, (unsigned int *) &loc->cylinders)) return -EFAULT; + if (put_user((unsigned)drive->part[MINOR(inode->i_rdev)&PARTN_MASK].start_sect, + (unsigned long *) &loc->start)) return -EFAULT; return 0; } --- /opt/kernel/linux-2.4.15-pre4-kdb/drivers/scsi/sd.c Thu Nov 15 09:58:37 2001 +++ linux/drivers/scsi/sd.c Thu Nov 15 09:58:18 2001 @@ -173,11 +173,9 @@ diskinfo[0] = 0x40; diskinfo[1] = 0x20; - diskinfo[2] = - rscsi_disks[DEVICE_NR(dev)].capacity >> 11; + diskinfo[2] = rscsi_disks[DEVICE_NR(dev)].capacity >> 11; - /* override with calculated, extended default, - or driver values */ + /* override with calculated, extended default, or driver values */ if(host->hostt->bios_param != NULL) host->hostt->bios_param(&rscsi_disks[DEVICE_NR(dev)], @@ -185,12 +183,43 @@ &diskinfo[0]); else scsicam_bios_param(&rscsi_disks[DEVICE_NR(dev)], dev, &diskinfo[0]); + if (put_user(diskinfo[0], &loc->heads) || + put_user(diskinfo[1], &loc->sectors) || + put_user(diskinfo[2], &loc->cylinders) || + put_user((unsigned) get_start_sect(inode->i_rdev), + (unsigned long *) &loc->start)) + return -EFAULT; + return 0; + } + case HDIO_GETGEO_BIG: + { + struct hd_big_geometry *loc = (struct hd_big_geometry *) arg; + + if(!loc) + return -EINVAL; + + host = rscsi_disks[DEVICE_NR(dev)].device->host; + + /* default to most commonly used values */ + + diskinfo[0] = 0x40; + diskinfo[1] = 0x20; + diskinfo[2] = rscsi_disks[DEVICE_NR(dev)].capacity >> 11; + + /* override with calculated, extended default, or driver values */ + + if(host->hostt->bios_param != NULL) + host->hostt->bios_param(&rscsi_disks[DEVICE_NR(dev)], + dev, + &diskinfo[0]); + else scsicam_bios_param(&rscsi_disks[DEVICE_NR(dev)], + dev, &diskinfo[0]); if (put_user(diskinfo[0], &loc->heads) || - put_user(diskinfo[1], &loc->sectors) || - put_user(diskinfo[2], &loc->cylinders) || - put_user(get_start_sect(inode->i_rdev), - &loc->start)) + put_user(diskinfo[1], &loc->sectors) || + put_user(diskinfo[2], (unsigned int *) &loc->cylinders) || + put_user((unsigned)get_start_sect(inode->i_rdev), + (unsigned long *)&loc->start)) return -EFAULT; return 0; }