Commit 53780b94 authored by Alexander Viro's avatar Alexander Viro Committed by Linus Torvalds

[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
parent c40bcba2
...@@ -51,7 +51,6 @@ ...@@ -51,7 +51,6 @@
#define MAJOR_NR SCSI_DISK0_MAJOR #define MAJOR_NR SCSI_DISK0_MAJOR
#define LOCAL_END_REQUEST #define LOCAL_END_REQUEST
#define DEVICE_NR(device) (((major(device) & SD_MAJOR_MASK) << (8 - 4)) + (minor(device) >> 4))
#include <linux/blk.h> #include <linux/blk.h>
#include <linux/blkpg.h> #include <linux/blkpg.h>
#include "scsi.h" #include "scsi.h"
...@@ -87,10 +86,10 @@ ...@@ -87,10 +86,10 @@
static Scsi_Disk ** sd_dsk_arr; static Scsi_Disk ** sd_dsk_arr;
static rwlock_t sd_dsk_arr_lock = RW_LOCK_UNLOCKED; static rwlock_t sd_dsk_arr_lock = RW_LOCK_UNLOCKED;
static int check_scsidisk_media_change(kdev_t); static int check_scsidisk_media_change(struct gendisk *);
static int sd_revalidate(kdev_t); 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 int sd_init(void);
static void sd_finish(void); static void sd_finish(void);
...@@ -187,17 +186,15 @@ sd_find_target(void *hp, int scsi_id) ...@@ -187,17 +186,15 @@ sd_find_target(void *hp, int scsi_id)
static int sd_ioctl(struct inode * inode, struct file * filp, static int sd_ioctl(struct inode * inode, struct file * filp,
unsigned int cmd, unsigned long arg) unsigned int cmd, unsigned long arg)
{ {
kdev_t dev = inode->i_rdev; struct gendisk *disk = inode->i_bdev->bd_disk;
Scsi_Disk * sdkp; Scsi_Disk *sdkp = disk->private_data;
struct Scsi_Host * host; Scsi_Device *sdp = sdkp->device;
Scsi_Device * sdp; struct Scsi_Host *host;
int diskinfo[4]; int diskinfo[4];
int dsk_nr = DEVICE_NR(dev);
SCSI_LOG_IOCTL(1, printk("sd_ioctl: dsk_nr=%d, cmd=0x%x\n", SCSI_LOG_IOCTL(1, printk("sd_ioctl: disk=%s, cmd=0x%x\n",
dsk_nr, cmd)); disk->disk_name, cmd));
sdkp = sd_get_sdisk(dsk_nr); if (!sdp)
if ((NULL == sdkp) || (NULL == (sdp = sdkp->device)))
return -ENODEV; return -ENODEV;
/* /*
* If we are in the middle of error recovery, don't let anyone * 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) ...@@ -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; static struct gendisk **sd_disks;
/** /**
...@@ -299,33 +273,26 @@ static struct gendisk **sd_disks; ...@@ -299,33 +273,26 @@ static struct gendisk **sd_disks;
**/ **/
static int sd_init_command(Scsi_Cmnd * SCpnt) static int sd_init_command(Scsi_Cmnd * SCpnt)
{ {
int dsk_nr, part_nr, this_count; int this_count;
struct gendisk *disk;
sector_t block; sector_t block;
Scsi_Device *sdp; Scsi_Device *sdp;
#if CONFIG_SCSI_LOGGING
char nbuff[6];
#endif
/* /*
* don't support specials for nwo * don't support specials for nwo
*/ */
if (!(SCpnt->request->flags & REQ_CMD)) if (!(SCpnt->request->flags & REQ_CMD))
return 0; return 0;
part_nr = SD_PARTITION(SCpnt->request->rq_dev); disk = SCpnt->request->rq_disk;
dsk_nr = DEVICE_NR(SCpnt->request->rq_dev);
block = SCpnt->request->sector; block = SCpnt->request->sector;
this_count = SCpnt->request_bufflen >> 9; this_count = SCpnt->request_bufflen >> 9;
SCSI_LOG_HLQUEUE(1, printk("sd_command_init: dsk_nr=%d, block=%llu, " SCSI_LOG_HLQUEUE(1, printk("sd_command_init: disk=%s, block=%llu, "
"count=%d\n", dsk_nr, (unsigned long long)block, this_count)); "count=%d\n", disk->disk_name, (unsigned long long)block, this_count));
sdp = SCpnt->device; sdp = SCpnt->device;
/* >>>>> the "(part_nr & 0xf)" excludes 15th partition, why?? */ if (!sdp || !sdp->online ||
/* >>>>> this change is not in the lk 2.5 series */ block + SCpnt->request->nr_sectors > get_capacity(disk)) {
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])) {
SCSI_LOG_HLQUEUE(2, printk("Finishing %ld sectors\n", SCSI_LOG_HLQUEUE(2, printk("Finishing %ld sectors\n",
SCpnt->request->nr_sectors)); SCpnt->request->nr_sectors));
SCSI_LOG_HLQUEUE(2, printk("Retry with 0x%p\n", SCpnt)); SCSI_LOG_HLQUEUE(2, printk("Retry with 0x%p\n", SCpnt));
...@@ -340,9 +307,8 @@ static int sd_init_command(Scsi_Cmnd * SCpnt) ...@@ -340,9 +307,8 @@ static int sd_init_command(Scsi_Cmnd * SCpnt)
/* printk("SCSI disk has been changed. Prohibiting further I/O.\n"); */ /* printk("SCSI disk has been changed. Prohibiting further I/O.\n"); */
return 0; return 0;
} }
SCSI_LOG_HLQUEUE(2, sd_dskname(dsk_nr, nbuff)); SCSI_LOG_HLQUEUE(2, printk("%s : block=%llu\n",
SCSI_LOG_HLQUEUE(2, printk("%s : [part_nr=%d], block=%llu\n", disk->disk_name, (unsigned long long)block));
nbuff, part_nr, (unsigned long long)block));
/* /*
* If we have a 1K hardware sectorsize, prevent access to single * If we have a 1K hardware sectorsize, prevent access to single
...@@ -399,7 +365,7 @@ static int sd_init_command(Scsi_Cmnd * SCpnt) ...@@ -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", 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)); "writing" : "reading", this_count, SCpnt->request->nr_sectors));
SCpnt->cmnd[1] = 0; SCpnt->cmnd[1] = 0;
...@@ -467,16 +433,14 @@ static int sd_init_command(Scsi_Cmnd * SCpnt) ...@@ -467,16 +433,14 @@ static int sd_init_command(Scsi_Cmnd * SCpnt)
**/ **/
static int sd_open(struct inode *inode, struct file *filp) 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; 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", SCSI_LOG_HLQUEUE(3, printk("sd_open: disk=%s\n", disk->disk_name));
dsk_nr, SD_PARTITION(inode->i_rdev)));
sdkp = sd_get_sdisk(dsk_nr); if (!sdkp)
if ((NULL == sdkp) || (NULL == (sdp = sdkp->device)))
return -ENXIO; /* No such device */ return -ENXIO; /* No such device */
/* /*
...@@ -554,14 +518,12 @@ static int sd_open(struct inode *inode, struct file *filp) ...@@ -554,14 +518,12 @@ static int sd_open(struct inode *inode, struct file *filp)
**/ **/
static int sd_release(struct inode *inode, struct file *filp) static int sd_release(struct inode *inode, struct file *filp)
{ {
Scsi_Disk * sdkp; struct gendisk *disk = inode->i_bdev->bd_disk;
int dsk_nr = DEVICE_NR(inode->i_rdev); Scsi_Disk *sdkp = disk->private_data;
Scsi_Device * sdp; Scsi_Device *sdp = sdkp->device;
SCSI_LOG_HLQUEUE(3, printk("sd_release: dsk_nr=%d, part_nr=%d\n", SCSI_LOG_HLQUEUE(3, printk("sd_release: disk=%s\n", disk->disk_name));
dsk_nr, SD_PARTITION(inode->i_rdev))); if (!sdp)
sdkp = sd_get_sdisk(dsk_nr);
if ((NULL == sdkp) || (NULL == (sdp = sdkp->device)))
return -ENODEV; /* open uses ENXIO ?? */ return -ENODEV; /* open uses ENXIO ?? */
/* ... and what if there are packets in flight and this close() /* ... 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) ...@@ -584,12 +546,12 @@ static int sd_release(struct inode *inode, struct file *filp)
static struct block_device_operations sd_fops = static struct block_device_operations sd_fops =
{ {
owner: THIS_MODULE, .owner = THIS_MODULE,
open: sd_open, .open = sd_open,
release: sd_release, .release = sd_release,
ioctl: sd_ioctl, .ioctl = sd_ioctl,
check_media_change: check_scsidisk_media_change, .media_changed = check_scsidisk_media_change,
revalidate: sd_revalidate .revalidate_disk= sd_revalidate
}; };
/** /**
...@@ -607,12 +569,8 @@ static void sd_rw_intr(Scsi_Cmnd * SCpnt) ...@@ -607,12 +569,8 @@ static void sd_rw_intr(Scsi_Cmnd * SCpnt)
sector_t block_sectors = 1; sector_t block_sectors = 1;
sector_t error_sector; sector_t error_sector;
#if CONFIG_SCSI_LOGGING #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", 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) { if (0 != result) {
SCSI_LOG_HLCOMPLETE(1, printk("sd_rw_intr: sb[0,2,asc,ascq]" SCSI_LOG_HLCOMPLETE(1, printk("sd_rw_intr: sb[0,2,asc,ascq]"
"=%x,%x,%x,%x\n", SCpnt->sense_buffer[0], "=%x,%x,%x,%x\n", SCpnt->sense_buffer[0],
...@@ -713,21 +671,18 @@ sd_set_media_not_present(Scsi_Disk *sdkp) { ...@@ -713,21 +671,18 @@ sd_set_media_not_present(Scsi_Disk *sdkp) {
* *
* Note: this function is invoked from the block subsystem. * 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 retval;
int flag = 0; /* <<<< what is this for?? */ 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: " SCSI_LOG_HLQUEUE(3, printk("check_scsidisk_media_change: "
"dsk_nr=%d\n", dsk_nr)); "disk=%s\n", disk->disk_name));
if ((NULL == sdkp) || (NULL == (sdp = sdkp->device))) { if (!sdp) {
printk(KERN_ERR "check_scsidisk_media_change: dsk_nr=%d, " printk(KERN_ERR "check_scsidisk_media_change: disk=%s, "
"invalid device\n", dsk_nr); "invalid device\n", disk->disk_name);
return 0; return 0;
} }
if (!sdp->removable) if (!sdp->removable)
...@@ -1155,18 +1110,13 @@ sd_read_write_protect_flag(Scsi_Disk *sdkp, char *diskname, ...@@ -1155,18 +1110,13 @@ sd_read_write_protect_flag(Scsi_Disk *sdkp, char *diskname,
* Note: this function is local to this driver. * Note: this function is local to this driver.
**/ **/
static void static void
sd_init_onedisk(Scsi_Disk * sdkp, int dsk_nr) { sd_init_onedisk(Scsi_Disk * sdkp, struct gendisk *disk)
char diskname[40]; {
unsigned char *buffer; unsigned char *buffer;
Scsi_Device *sdp; Scsi_Device *sdp;
Scsi_Request *SRpnt; Scsi_Request *SRpnt;
SCSI_LOG_HLQUEUE(3, printk("sd_init_onedisk: dsk_nr=%d\n", dsk_nr)); SCSI_LOG_HLQUEUE(3, printk("sd_init_onedisk: disk=%s\n", disk->disk_name));
/*
* Get the name of the disk, in case we need to log it somewhere.
*/
sd_dskname(dsk_nr, diskname);
/* /*
* If the device is offline, don't try and read capacity or any * 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) { ...@@ -1196,14 +1146,14 @@ sd_init_onedisk(Scsi_Disk * sdkp, int dsk_nr) {
sdkp->media_present = 1; sdkp->media_present = 1;
sdkp->write_prot = 0; sdkp->write_prot = 0;
sd_spinup_disk(sdkp, diskname, SRpnt, buffer); sd_spinup_disk(sdkp, disk->disk_name, SRpnt, buffer);
sd_read_cache_type(sdkp, diskname, SRpnt, buffer); sd_read_cache_type(sdkp, disk->disk_name, SRpnt, buffer);
if (sdkp->media_present) 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) 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->ten = 1;
SRpnt->sr_device->remap = 1; SRpnt->sr_device->remap = 1;
...@@ -1322,18 +1272,18 @@ static void sd_finish() ...@@ -1322,18 +1272,18 @@ static void sd_finish()
Scsi_Disk * sdkp; Scsi_Disk * sdkp;
SCSI_LOG_HLQUEUE(3, printk("sd_finish: \n")); 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) { for (k = 0; k < sd_template.dev_max; ++k) {
sdkp = sd_get_sdisk(k); sdkp = sd_get_sdisk(k);
if (sdkp && (0 == sdkp->capacity) && sdkp->device) { if (sdkp && (0 == sdkp->capacity) && sdkp->device) {
sd_init_onedisk(sdkp, k); sd_init_onedisk(sdkp, sd_disks[k]);
if (!sdkp->has_been_registered) { if (sdkp->has_been_registered)
set_capacity(sd_disks[k], sdkp->capacity); continue;
add_disk(sd_disks[k]); set_capacity(sd_disks[k], sdkp->capacity);
sdkp->has_been_registered = 1; 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; return;
...@@ -1436,16 +1386,15 @@ static int sd_attach(Scsi_Device * sdp) ...@@ -1436,16 +1386,15 @@ static int sd_attach(Scsi_Device * sdp)
return 0; 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 = disk->private_data;
Scsi_Disk * sdkp = sd_get_sdisk(dsk_nr);
if (!sdkp || !sdkp->device) if (!sdkp->device)
return -ENODEV; return -ENODEV;
sd_init_onedisk(sdkp, dsk_nr); sd_init_onedisk(sdkp, disk);
set_capacity(sd_disks[dsk_nr], sdkp->capacity); set_capacity(disk, sdkp->capacity);
return 0; return 0;
} }
...@@ -1463,7 +1412,6 @@ static int sd_revalidate(kdev_t dev) ...@@ -1463,7 +1412,6 @@ static int sd_revalidate(kdev_t dev)
static void sd_detach(Scsi_Device * sdp) static void sd_detach(Scsi_Device * sdp)
{ {
Scsi_Disk *sdkp = NULL; Scsi_Disk *sdkp = NULL;
kdev_t dev;
int dsk_nr; int dsk_nr;
unsigned long iflags; unsigned long iflags;
...@@ -1493,7 +1441,6 @@ static void sd_detach(Scsi_Device * sdp) ...@@ -1493,7 +1441,6 @@ static void sd_detach(Scsi_Device * sdp)
if (sdkp->has_been_registered) { if (sdkp->has_been_registered) {
sdkp->has_been_registered = 0; sdkp->has_been_registered = 0;
dev = MKDEV_SD(dsk_nr);
del_gendisk(sd_disks[dsk_nr]); del_gendisk(sd_disks[dsk_nr]);
} }
sdp->attached--; sdp->attached--;
...@@ -1544,8 +1491,6 @@ static void __exit exit_sd(void) ...@@ -1544,8 +1491,6 @@ static void __exit exit_sd(void)
vfree(sd_dsk_arr[k]); vfree(sd_dsk_arr[k]);
vfree(sd_dsk_arr); 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; sd_template.dev_max = 0;
remove_driver(&sd_template.scsi_driverfs_driver); remove_driver(&sd_template.scsi_driverfs_driver);
......
...@@ -40,6 +40,5 @@ extern kdev_t sd_find_target(void *host, int tgt); ...@@ -40,6 +40,5 @@ extern kdev_t sd_find_target(void *host, int tgt);
#define N_SD_MAJORS 8 #define N_SD_MAJORS 8
#define SD_MAJOR_MASK (N_SD_MAJORS - 1) #define SD_MAJOR_MASK (N_SD_MAJORS - 1)
#define SD_PARTITION(i) (((major(i) & SD_MAJOR_MASK) << 8) | (minor(i) & 255))
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment