Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

cciss: decode unit attention in SCSI error handling code

Make SCSI reset error handler decode unit attention ASC
and after a target reset wait for a unit attention that indicates
a reset occurred rather than just for any old unit attention.

Signed-off-by: Stephen M. Cameron <scameron@beardog.cca.cpqcorp.net>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>

authored by

scameron@beardog.cca.cpqcorp.net and committed by
Jens Axboe
3969251b 72f9f132

+17 -8
+17 -8
drivers/block/cciss_scsi.c
··· 1604 1604 1605 1605 (void) process_sendcmd_error(h, c); 1606 1606 1607 - if (rc == 0 && c->err_info->CommandStatus == CMD_SUCCESS) 1607 + if (rc != 0) 1608 + goto retry_tur; 1609 + 1610 + if (c->err_info->CommandStatus == CMD_SUCCESS) 1608 1611 break; 1609 1612 1610 - if (rc == 0 && 1611 - c->err_info->CommandStatus == CMD_TARGET_STATUS && 1612 - c->err_info->ScsiStatus == SAM_STAT_CHECK_CONDITION && 1613 - (c->err_info->SenseInfo[2] == NO_SENSE || 1614 - c->err_info->SenseInfo[2] == UNIT_ATTENTION)) 1615 - break; 1616 - 1613 + if (c->err_info->CommandStatus == CMD_TARGET_STATUS && 1614 + c->err_info->ScsiStatus == SAM_STAT_CHECK_CONDITION) { 1615 + if (c->err_info->SenseInfo[2] == NO_SENSE) 1616 + break; 1617 + if (c->err_info->SenseInfo[2] == UNIT_ATTENTION) { 1618 + unsigned char asc; 1619 + asc = c->err_info->SenseInfo[12]; 1620 + check_for_unit_attention(h, c); 1621 + if (asc == POWER_OR_RESET) 1622 + break; 1623 + } 1624 + } 1625 + retry_tur: 1617 1626 printk(KERN_WARNING "cciss%d: Waiting %d secs " 1618 1627 "for device to become ready.\n", 1619 1628 h->ctlr, waittime / HZ);