2 * drivers/scsi/sd_ioctl.c 4 * ioctl handling for SCSI disks 7 #include <linux/kernel.h> 8 #include <linux/sched.h> 11 #include <linux/hdreg.h> 12 #include <linux/errno.h> 14 #include <asm/uaccess.h> 16 #define MAJOR_NR SCSI_DISK0_MAJOR 17 #include <linux/blk.h> 18 #include <linux/blkpg.h> 20 #include <scsi/scsi_ioctl.h> 23 #include <scsi/scsicam.h>/* must follow "hosts.h" */ 25 intsd_ioctl(struct inode
* inode
,struct file
* file
,unsigned int cmd
,unsigned long arg
) 27 kdev_t dev
= inode
->i_rdev
; 29 struct Scsi_Host
* host
; 32 struct hd_geometry
*loc
= (struct hd_geometry
*) arg
; 34 SDev
= rscsi_disks
[DEVICE_NR(dev
)].device
; 36 * If we are in the middle of error recovery, don't let anyone 37 * else try and use this device. Also, if error recovery fails, it 38 * may try and take the device offline, in which case all further 39 * access to the device is prohibited. 41 if( !scsi_block_when_processing_errors(SDev
) ) 47 case HDIO_GETGEO
:/* Return BIOS disk parameters */ 48 if(!loc
)return-EINVAL
; 49 error
=verify_area(VERIFY_WRITE
, loc
,sizeof(*loc
)); 52 host
= rscsi_disks
[DEVICE_NR(dev
)].device
->host
; 54 /* default to most commonly used values */ 58 diskinfo
[2] = rscsi_disks
[DEVICE_NR(dev
)].capacity
>>11; 60 /* override with calculated, extended default, or driver values */ 62 if(host
->hostt
->bios_param
!= NULL
) 63 host
->hostt
->bios_param(&rscsi_disks
[DEVICE_NR(dev
)], 66 elsescsicam_bios_param(&rscsi_disks
[DEVICE_NR(dev
)], 69 put_user(diskinfo
[0], &loc
->heads
); 70 put_user(diskinfo
[1], &loc
->sectors
); 71 put_user(diskinfo
[2], &loc
->cylinders
); 72 put_user(sd
[SD_PARTITION(inode
->i_rdev
)].start_sect
, &loc
->start
); 74 case BLKGETSIZE
:/* Return device size */ 75 if(!arg
)return-EINVAL
; 76 error
=verify_area(VERIFY_WRITE
, (long*) arg
,sizeof(long)); 79 put_user(sd
[SD_PARTITION(inode
->i_rdev
)].nr_sects
, 90 returnblk_ioctl(inode
->i_rdev
, cmd
, arg
); 92 case BLKRRPART
:/* Re-read partition tables */ 93 if(!capable(CAP_SYS_ADMIN
)) 95 returnrevalidate_scsidisk(dev
,1); 98 returnscsi_ioctl(rscsi_disks
[DEVICE_NR(dev
)].device
, cmd
, (void*) arg
); 103 * Overrides for Emacs so that we follow Linus's tabbing style. 104 * Emacs will notice this stuff at the end of the file and automatically 105 * adjust the settings for this buffer only. This must remain at the end 107 * --------------------------------------------------------------------------- 110 * c-brace-imaginary-offset: 0 112 * c-argdecl-indent: 4 114 * c-continued-statement-offset: 4 115 * c-continued-brace-offset: 0 116 * indent-tabs-mode: nil