--- linux/drivers/scsi/sd.c 2002-12-24 18:12:54.000000000 +1100 +++ linux/drivers/scsi/sd.c2553ioctl 2002-12-28 09:25:13.000000000 +1100 @@ -537,9 +537,20 @@ return sd_hdio_getgeo(bdev, (struct hd_geometry *)arg); } - error = scsi_cmd_ioctl(bdev, cmd, arg); - if (error != -ENOTTY) - return error; + /* + * Send SCSI addressing ioctls directly to mid level, send other + * ioctls to block level and then onto mid level if they can't be + * resolved. + */ + switch (cmd) { + case SCSI_IOCTL_GET_IDLUN: + case SCSI_IOCTL_GET_BUS_NUMBER: + return scsi_ioctl(sdp, cmd, (void *)arg); + default: + error = scsi_cmd_ioctl(bdev, cmd, arg); + if (error != -ENOTTY) + return error; + } return scsi_ioctl(sdp, cmd, (void *)arg); } --- linux/drivers/scsi/sr.c 2002-12-24 18:12:54.000000000 +1100 +++ linux/drivers/scsi/sr.c2553ioctl 2002-12-28 09:36:19.000000000 +1100 @@ -434,6 +434,17 @@ unsigned long arg) { struct scsi_cd *cd = scsi_cd(inode->i_bdev->bd_disk); + struct scsi_device *sdev = cd->device; + + /* + * Send SCSI addressing ioctls directly to mid level, send other + * ioctls to cdrom/block level. + */ + switch (cmd) { + case SCSI_IOCTL_GET_IDLUN: + case SCSI_IOCTL_GET_BUS_NUMBER: + return scsi_ioctl(sdev, cmd, (void *)arg); + } return cdrom_ioctl(&cd->cdi, inode, cmd, arg); }