Commit 9b300b14 authored by Patrick Mansfield's avatar Patrick Mansfield Committed by Christoph Hellwig

[PATCH] add back single_lun support

On Wed, Feb 05, 2003 at 05:14:00PM -0600, James Bottomley wrote:

> I don't see device_active getting set anywhere.
>
> shouldn't we just dump device_active in favour of a non-zero check of
> device_busy (it's all done under the queue lock, anyway).
>
> James

OK - once more.

This patch against the current scsi-misc-2.5 adds back the check for the
single_lun case and removes the unused device_active field.

I compiled and booted with this applied but don't have any devices (i.e.
CD ROM changer) for testing.
parent 267033f6
...@@ -570,7 +570,6 @@ struct scsi_device { ...@@ -570,7 +570,6 @@ struct scsi_device {
device is busy */ device is busy */
struct Scsi_Host *host; struct Scsi_Host *host;
request_queue_t *request_queue; request_queue_t *request_queue;
atomic_t device_active; /* commands checked out for device */
volatile unsigned short device_busy; /* commands actually active on low-level */ volatile unsigned short device_busy; /* commands actually active on low-level */
struct list_head free_cmnds; /* list of available Scsi_Cmnd structs */ struct list_head free_cmnds; /* list of available Scsi_Cmnd structs */
struct list_head busy_cmnds; /* list of Scsi_Cmnd structs in use */ struct list_head busy_cmnds; /* list of Scsi_Cmnd structs in use */
......
...@@ -787,6 +787,22 @@ static int scsi_init_io(Scsi_Cmnd *SCpnt) ...@@ -787,6 +787,22 @@ static int scsi_init_io(Scsi_Cmnd *SCpnt)
return ret; return ret;
} }
/*
* The target associated with myself can only handle one active command at
* a time. Scan through all of the luns on the same target as myself,
* return 1 if any are active.
*/
static int check_all_luns(struct scsi_device *myself)
{
struct scsi_device *sdev;
list_for_each_entry(sdev, &myself->same_target_siblings,
same_target_siblings)
if (sdev->device_busy)
return 1;
return 0;
}
int scsi_prep_fn(struct request_queue *q, struct request *req) int scsi_prep_fn(struct request_queue *q, struct request *req)
{ {
struct Scsi_Device_Template *STpnt; struct Scsi_Device_Template *STpnt;
...@@ -950,6 +966,9 @@ void scsi_request_fn(request_queue_t * q) ...@@ -950,6 +966,9 @@ void scsi_request_fn(request_queue_t * q)
if (SDpnt->device_busy >= SDpnt->queue_depth) if (SDpnt->device_busy >= SDpnt->queue_depth)
break; break;
if (SDpnt->single_lun && check_all_luns(SDpnt))
break;
if(SHpnt->host_busy == 0 && SHpnt->host_blocked) { if(SHpnt->host_busy == 0 && SHpnt->host_blocked) {
/* unblock after host_blocked iterates to zero */ /* unblock after host_blocked iterates to zero */
if(--SHpnt->host_blocked == 0) { if(--SHpnt->host_blocked == 0) {
......
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