diff options
| author | Alexander Viro <viro@math.psu.edu> | 2002-10-17 19:36:06 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2002-10-17 19:36:06 -0700 |
| commit | 53780b94cf7eeddf50d2de3ead2114145bbd014a (patch) | |
| tree | 8544e8910d15690d6ebca319c86842b217ccca1b /drivers | |
| parent | c40bcba285b1310294be9a5f2e27d1f28ae3f6e9 (diff) | |
[PATCH] sd.c
* set ->queue and ->private_data
* removed DEVICE_NR and SD_PARTITION
* switched to new methods
* switched ->open() and friends to use of ->bd_disk
* switched request handling to use of ->rq_disk
* slightly cleaned up
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/scsi/sd.c | 183 | ||||
| -rw-r--r-- | drivers/scsi/sd.h | 1 |
2 files changed, 64 insertions, 120 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 6828aa59503b..32300bedc779 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -51,7 +51,6 @@ #define MAJOR_NR SCSI_DISK0_MAJOR #define LOCAL_END_REQUEST -#define DEVICE_NR(device) (((major(device) & SD_MAJOR_MASK) << (8 - 4)) + (minor(device) >> 4)) #include <linux/blk.h> #include <linux/blkpg.h> #include "scsi.h" @@ -87,10 +86,10 @@ static Scsi_Disk ** sd_dsk_arr; static rwlock_t sd_dsk_arr_lock = RW_LOCK_UNLOCKED; -static int check_scsidisk_media_change(kdev_t); -static int sd_revalidate(kdev_t); +static int check_scsidisk_media_change(struct gendisk *); +static int sd_revalidate(struct gendisk *); -static void sd_init_onedisk(Scsi_Disk * sdkp, int dsk_nr); +static void sd_init_onedisk(Scsi_Disk * sdkp, struct gendisk *disk); static int sd_init(void); static void sd_finish(void); @@ -187,17 +186,15 @@ sd_find_target(void *hp, int scsi_id) static int sd_ioctl(struct inode * inode, struct file * filp, unsigned int cmd, unsigned long arg) { - kdev_t dev = inode->i_rdev; - Scsi_Disk * sdkp; - struct Scsi_Host * host; - Scsi_Device * sdp; + struct gendisk *disk = inode->i_bdev->bd_disk; + Scsi_Disk *sdkp = disk->private_data; + Scsi_Device *sdp = sdkp->device; + struct Scsi_Host *host; int diskinfo[4]; - int dsk_nr = DEVICE_NR(dev); - SCSI_LOG_IOCTL(1, printk("sd_ioctl: dsk_nr=%d, cmd=0x%x\n", - dsk_nr, cmd)); - sdkp = sd_get_sdisk(dsk_nr); - if ((NULL == sdkp) || (NULL == (sdp = sdkp->device))) + SCSI_LOG_IOCTL(1, printk("sd_ioctl: disk=%s, cmd=0x%x\n", + disk->disk_name, cmd)); + if (!sdp) return -ENODEV; /* * If we are in the middle of error recovery, don't let anyone @@ -264,29 +261,6 @@ static void sd_dskname(unsigned int dsk_nr, char *buffer) } } -/** - * sd_find_queue - yields queue associated with device - * @dev: kernel device descriptor (kdev_t) - * - * Returns NULL if no match, otherwise returns pointer to associated - * request queue. - * - * Note: this function is invoked (often) from the block subsystem - * and should not wait on anything (sd_get_sdisk() does have a read - * spinlock). - **/ -static request_queue_t *sd_find_queue(kdev_t dev) -{ - Scsi_Disk *sdkp; - int dsk_nr = DEVICE_NR(dev); - - sdkp = sd_get_sdisk(dsk_nr); - if (sdkp && sdkp->device) - return &sdkp->device->request_queue; - else - return NULL; /* No such device */ -} - static struct gendisk **sd_disks; /** @@ -299,33 +273,26 @@ static struct gendisk **sd_disks; **/ static int sd_init_command(Scsi_Cmnd * SCpnt) { - int dsk_nr, part_nr, this_count; + int this_count; + struct gendisk *disk; sector_t block; Scsi_Device *sdp; -#if CONFIG_SCSI_LOGGING - char nbuff[6]; -#endif /* * don't support specials for nwo */ if (!(SCpnt->request->flags & REQ_CMD)) return 0; - part_nr = SD_PARTITION(SCpnt->request->rq_dev); - dsk_nr = DEVICE_NR(SCpnt->request->rq_dev); - + disk = SCpnt->request->rq_disk; block = SCpnt->request->sector; this_count = SCpnt->request_bufflen >> 9; - SCSI_LOG_HLQUEUE(1, printk("sd_command_init: dsk_nr=%d, block=%llu, " - "count=%d\n", dsk_nr, (unsigned long long)block, this_count)); + SCSI_LOG_HLQUEUE(1, printk("sd_command_init: disk=%s, block=%llu, " + "count=%d\n", disk->disk_name, (unsigned long long)block, this_count)); sdp = SCpnt->device; - /* >>>>> the "(part_nr & 0xf)" excludes 15th partition, why?? */ - /* >>>>> this change is not in the lk 2.5 series */ - if (part_nr >= (sd_template.dev_max << 4) || (part_nr & 0xf) || - !sdp || !sdp->online || - block + SCpnt->request->nr_sectors > get_capacity(sd_disks[dsk_nr])) { + if (!sdp || !sdp->online || + block + SCpnt->request->nr_sectors > get_capacity(disk)) { SCSI_LOG_HLQUEUE(2, printk("Finishing %ld sectors\n", SCpnt->request->nr_sectors)); SCSI_LOG_HLQUEUE(2, printk("Retry with 0x%p\n", SCpnt)); @@ -340,9 +307,8 @@ static int sd_init_command(Scsi_Cmnd * SCpnt) /* printk("SCSI disk has been changed. Prohibiting further I/O.\n"); */ return 0; } - SCSI_LOG_HLQUEUE(2, sd_dskname(dsk_nr, nbuff)); - SCSI_LOG_HLQUEUE(2, printk("%s : [part_nr=%d], block=%llu\n", - nbuff, part_nr, (unsigned long long)block)); + SCSI_LOG_HLQUEUE(2, printk("%s : block=%llu\n", + disk->disk_name, (unsigned long long)block)); /* * If we have a 1K hardware sectorsize, prevent access to single @@ -399,7 +365,7 @@ static int sd_init_command(Scsi_Cmnd * SCpnt) } SCSI_LOG_HLQUEUE(2, printk("%s : %s %d/%ld 512 byte blocks.\n", - nbuff, (rq_data_dir(SCpnt->request) == WRITE) ? + disk->disk_name, (rq_data_dir(SCpnt->request) == WRITE) ? "writing" : "reading", this_count, SCpnt->request->nr_sectors)); SCpnt->cmnd[1] = 0; @@ -467,16 +433,14 @@ static int sd_init_command(Scsi_Cmnd * SCpnt) **/ static int sd_open(struct inode *inode, struct file *filp) { + struct gendisk *disk = inode->i_bdev->bd_disk; + Scsi_Disk *sdkp = disk->private_data; + Scsi_Device * sdp = sdkp->device; int retval = -ENXIO; - Scsi_Device * sdp; - Scsi_Disk * sdkp; - int dsk_nr = DEVICE_NR(inode->i_rdev); - SCSI_LOG_HLQUEUE(3, printk("sd_open: dsk_nr=%d, part_nr=%d\n", - dsk_nr, SD_PARTITION(inode->i_rdev))); + SCSI_LOG_HLQUEUE(3, printk("sd_open: disk=%s\n", disk->disk_name)); - sdkp = sd_get_sdisk(dsk_nr); - if ((NULL == sdkp) || (NULL == (sdp = sdkp->device))) + if (!sdkp) return -ENXIO; /* No such device */ /* @@ -554,14 +518,12 @@ error_out: **/ static int sd_release(struct inode *inode, struct file *filp) { - Scsi_Disk * sdkp; - int dsk_nr = DEVICE_NR(inode->i_rdev); - Scsi_Device * sdp; + struct gendisk *disk = inode->i_bdev->bd_disk; + Scsi_Disk *sdkp = disk->private_data; + Scsi_Device *sdp = sdkp->device; - SCSI_LOG_HLQUEUE(3, printk("sd_release: dsk_nr=%d, part_nr=%d\n", - dsk_nr, SD_PARTITION(inode->i_rdev))); - sdkp = sd_get_sdisk(dsk_nr); - if ((NULL == sdkp) || (NULL == (sdp = sdkp->device))) + SCSI_LOG_HLQUEUE(3, printk("sd_release: disk=%s\n", disk->disk_name)); + if (!sdp) return -ENODEV; /* open uses ENXIO ?? */ /* ... and what if there are packets in flight and this close() @@ -584,12 +546,12 @@ static int sd_release(struct inode *inode, struct file *filp) static struct block_device_operations sd_fops = { - owner: THIS_MODULE, - open: sd_open, - release: sd_release, - ioctl: sd_ioctl, - check_media_change: check_scsidisk_media_change, - revalidate: sd_revalidate + .owner = THIS_MODULE, + .open = sd_open, + .release = sd_release, + .ioctl = sd_ioctl, + .media_changed = check_scsidisk_media_change, + .revalidate_disk= sd_revalidate }; /** @@ -607,12 +569,8 @@ static void sd_rw_intr(Scsi_Cmnd * SCpnt) sector_t block_sectors = 1; sector_t error_sector; #if CONFIG_SCSI_LOGGING - char nbuff[6]; - - SCSI_LOG_HLCOMPLETE(1, sd_dskname(DEVICE_NR(SCpnt->request->rq_dev), - nbuff)); SCSI_LOG_HLCOMPLETE(1, printk("sd_rw_intr: %s: res=0x%x\n", - nbuff, result)); + SCpnt->request->rq_disk->disk_name, result)); if (0 != result) { SCSI_LOG_HLCOMPLETE(1, printk("sd_rw_intr: sb[0,2,asc,ascq]" "=%x,%x,%x,%x\n", SCpnt->sense_buffer[0], @@ -713,21 +671,18 @@ sd_set_media_not_present(Scsi_Disk *sdkp) { * * Note: this function is invoked from the block subsystem. **/ -static int check_scsidisk_media_change(kdev_t full_dev) +static int check_scsidisk_media_change(struct gendisk *disk) { + Scsi_Disk *sdkp = disk->private_data; + Scsi_Device *sdp = sdkp->device; int retval; int flag = 0; /* <<<< what is this for?? */ - Scsi_Disk * sdkp; - Scsi_Device * sdp; - int dsk_nr = DEVICE_NR(full_dev); - - sdkp = sd_get_sdisk(dsk_nr); SCSI_LOG_HLQUEUE(3, printk("check_scsidisk_media_change: " - "dsk_nr=%d\n", dsk_nr)); - if ((NULL == sdkp) || (NULL == (sdp = sdkp->device))) { - printk(KERN_ERR "check_scsidisk_media_change: dsk_nr=%d, " - "invalid device\n", dsk_nr); + "disk=%s\n", disk->disk_name)); + if (!sdp) { + printk(KERN_ERR "check_scsidisk_media_change: disk=%s, " + "invalid device\n", disk->disk_name); return 0; } if (!sdp->removable) @@ -1155,18 +1110,13 @@ sd_read_write_protect_flag(Scsi_Disk *sdkp, char *diskname, * Note: this function is local to this driver. **/ static void -sd_init_onedisk(Scsi_Disk * sdkp, int dsk_nr) { - char diskname[40]; +sd_init_onedisk(Scsi_Disk * sdkp, struct gendisk *disk) +{ unsigned char *buffer; Scsi_Device *sdp; Scsi_Request *SRpnt; - SCSI_LOG_HLQUEUE(3, printk("sd_init_onedisk: dsk_nr=%d\n", dsk_nr)); - - /* - * Get the name of the disk, in case we need to log it somewhere. - */ - sd_dskname(dsk_nr, diskname); + SCSI_LOG_HLQUEUE(3, printk("sd_init_onedisk: disk=%s\n", disk->disk_name)); /* * If the device is offline, don't try and read capacity or any @@ -1196,14 +1146,14 @@ sd_init_onedisk(Scsi_Disk * sdkp, int dsk_nr) { sdkp->media_present = 1; sdkp->write_prot = 0; - sd_spinup_disk(sdkp, diskname, SRpnt, buffer); - sd_read_cache_type(sdkp, diskname, SRpnt, buffer); + sd_spinup_disk(sdkp, disk->disk_name, SRpnt, buffer); + sd_read_cache_type(sdkp, disk->disk_name, SRpnt, buffer); if (sdkp->media_present) - sd_read_capacity(sdkp, diskname, SRpnt, buffer); + sd_read_capacity(sdkp, disk->disk_name, SRpnt, buffer); if (sdp->removable && sdkp->media_present) - sd_read_write_protect_flag(sdkp, diskname, SRpnt, buffer); + sd_read_write_protect_flag(sdkp, disk->disk_name, SRpnt, buffer); SRpnt->sr_device->ten = 1; SRpnt->sr_device->remap = 1; @@ -1322,18 +1272,18 @@ static void sd_finish() Scsi_Disk * sdkp; SCSI_LOG_HLQUEUE(3, printk("sd_finish: \n")); - for (k = 0; k < N_USED_SD_MAJORS; k++) - blk_dev[SD_MAJOR(k)].queue = sd_find_queue; for (k = 0; k < sd_template.dev_max; ++k) { sdkp = sd_get_sdisk(k); if (sdkp && (0 == sdkp->capacity) && sdkp->device) { - sd_init_onedisk(sdkp, k); - if (!sdkp->has_been_registered) { - set_capacity(sd_disks[k], sdkp->capacity); - add_disk(sd_disks[k]); - sdkp->has_been_registered = 1; - } + sd_init_onedisk(sdkp, sd_disks[k]); + if (sdkp->has_been_registered) + continue; + set_capacity(sd_disks[k], sdkp->capacity); + sd_disks[k]->private_data = sdkp; + sd_disks[k]->queue = &sdkp->device->request_queue; + add_disk(sd_disks[k]); + sdkp->has_been_registered = 1; } } return; @@ -1436,16 +1386,15 @@ static int sd_attach(Scsi_Device * sdp) return 0; } -static int sd_revalidate(kdev_t dev) +static int sd_revalidate(struct gendisk *disk) { - int dsk_nr = DEVICE_NR(dev); - Scsi_Disk * sdkp = sd_get_sdisk(dsk_nr); + Scsi_Disk *sdkp = disk->private_data; - if (!sdkp || !sdkp->device) + if (!sdkp->device) return -ENODEV; - sd_init_onedisk(sdkp, dsk_nr); - set_capacity(sd_disks[dsk_nr], sdkp->capacity); + sd_init_onedisk(sdkp, disk); + set_capacity(disk, sdkp->capacity); return 0; } @@ -1463,7 +1412,6 @@ static int sd_revalidate(kdev_t dev) static void sd_detach(Scsi_Device * sdp) { Scsi_Disk *sdkp = NULL; - kdev_t dev; int dsk_nr; unsigned long iflags; @@ -1493,7 +1441,6 @@ static void sd_detach(Scsi_Device * sdp) if (sdkp->has_been_registered) { sdkp->has_been_registered = 0; - dev = MKDEV_SD(dsk_nr); del_gendisk(sd_disks[dsk_nr]); } sdp->attached--; @@ -1544,8 +1491,6 @@ static void __exit exit_sd(void) vfree(sd_dsk_arr[k]); vfree(sd_dsk_arr); } - for (k = 0; k < N_USED_SD_MAJORS; k++) - blk_dev[SD_MAJOR(k)].queue = NULL; sd_template.dev_max = 0; remove_driver(&sd_template.scsi_driverfs_driver); diff --git a/drivers/scsi/sd.h b/drivers/scsi/sd.h index ad75b842e13d..847e7c403e6c 100644 --- a/drivers/scsi/sd.h +++ b/drivers/scsi/sd.h @@ -40,6 +40,5 @@ extern kdev_t sd_find_target(void *host, int tgt); #define N_SD_MAJORS 8 #define SD_MAJOR_MASK (N_SD_MAJORS - 1) -#define SD_PARTITION(i) (((major(i) & SD_MAJOR_MASK) << 8) | (minor(i) & 255)) #endif |
