[SCSI] fix shared tag map tag allocation
authorMike Christie <michaelc@cs.wisc.edu>
Sat, 12 Jul 2008 00:50:35 +0000 (19:50 -0500)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Sat, 26 Jul 2008 19:14:50 +0000 (15:14 -0400)
commitecefe8a97577d6c1a68d14ab6fb19bce99448af2
tree966860cc4ac9069b98f1b441f3d8b12675b9087a
parent5d90027fb579eee41ec1b61f23195ed2fdd51da2
[SCSI] fix shared tag map tag allocation

When drivers use a shared tag map we can end up with more requests
than tags, because the tag map is shost->can_queue tags and there
can be sdevs * sdev->queue_depth requests. In scsi_request_fn
if tag allocation fails we just drop down to just dequeueing the
tag without a tag. The problem is that drivers using the shared tag
map rely on a valid tag always being set, because it will use the
tag number to lookup commands later.

This patch has us check if we got a valid tag when the host lock
is held right before we check if the host queue is ready. We do the
check here because to allocate the tag we need the q lock, but
if the tag is bad we want to add the device/q onto the starved list
which requires the host lock.

Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
drivers/scsi/scsi_lib.c