On Sun, 1 May 2005 06:13, Jens Axboe wrote: > On Sun, May 01 2005, Con Kolivas wrote: > > +scsi-dead-device.diff > > A fix for a scsi related hang that seems to hit many -ck users > > This looks strange, like a fix and a half. You should just apply the > patch I sent you originally, weeks ago, changing sdev->sdev_lock to > &q->__queue_lock. rarrgh Thanks for keeping an eye out on for this. Unfortunately you sent more than one patch at different times and it looks like I included the wrong one then? This is the patch I (tried to) include. Con
===== drivers/scsi/scsi_lib.c 1.151 vs edited ===== --- 1.151/drivers/scsi/scsi_lib.c 2005-02-17 20:17:22 +01:00 +++ edited/drivers/scsi/scsi_lib.c 2005-03-18 12:33:09 +01:00 @@ -1233,6 +1233,22 @@ static inline int scsi_host_queue_ready( } /* + * Kill requests for a dead device + */ +static void scsi_kill_requests(request_queue_t *q) +{ + struct request *req; + + while ((req = elv_next_request(q)) != NULL) { + blkdev_dequeue_request(req); + req->flags |= REQ_QUIET; + while (end_that_request_first(req, 0, req->nr_sectors)) + ; + end_that_request_last(req); + } +} + +/* * Function: scsi_request_fn() * * Purpose: Main strategy routine for SCSI. @@ -1246,10 +1262,16 @@ static inline int scsi_host_queue_ready( static void scsi_request_fn(struct request_queue *q) { struct scsi_device *sdev = q->queuedata; - struct Scsi_Host *shost = sdev->host; + struct Scsi_Host *shost; struct scsi_cmnd *cmd; struct request *req; + if (!sdev) { + printk("scsi: killing requests for dead queue\n"); + scsi_kill_requests(q); + return; + } + if(!get_device(&sdev->sdev_gendev)) /* We must be tearing the block queue down already */ return; @@ -1258,6 +1280,7 @@ static void scsi_request_fn(struct reque * To start with, we keep looping until the queue is empty, or until * the host is no longer able to accept any more requests. */ + shost = sdev->host; while (!blk_queue_plugged(q)) { int rtn; /* ===== drivers/scsi/scsi_sysfs.c 1.69 vs edited ===== --- 1.69/drivers/scsi/scsi_sysfs.c 2005-02-17 02:05:37 +01:00 +++ edited/drivers/scsi/scsi_sysfs.c 2005-03-18 12:32:57 +01:00 @@ -168,8 +168,10 @@ void scsi_device_dev_release(struct devi list_del(&sdev->starved_entry); spin_unlock_irqrestore(sdev->host->host_lock, flags); - if (sdev->request_queue) + if (sdev->request_queue) { + sdev->request_queue->queuedata = NULL; scsi_free_queue(sdev->request_queue); + } scsi_target_reap(scsi_target(sdev));
Attachment:
pgp8Vld02E5OY.pgp
Description: PGP signature
- Follow-Ups:
- Re: [ck] 2.6.11-ck6
- From: Con Kolivas <[email protected]>
- Re: [ck] 2.6.11-ck6
- References:
- 2.6.11-ck6
- From: Con Kolivas <[email protected]>
- Re: [ck] 2.6.11-ck6
- From: Jens Axboe <[email protected]>
- 2.6.11-ck6
- Prev by Date: Re: [PATCH] private mounts
- Next by Date: Re: 2.6.12-rc3-mm2
- Previous by thread: Re: [ck] 2.6.11-ck6
- Next by thread: Re: [ck] 2.6.11-ck6
- Index(es):