@@ -1709,6 +1709,36 @@ static char sd_pr_type(enum pr_type type)
1709
1709
}
1710
1710
};
1711
1711
1712
+ static int sd_scsi_to_pr_err (struct scsi_sense_hdr * sshdr , int result )
1713
+ {
1714
+ switch (host_byte (result )) {
1715
+ case DID_TRANSPORT_MARGINAL :
1716
+ case DID_TRANSPORT_DISRUPTED :
1717
+ case DID_BUS_BUSY :
1718
+ return PR_STS_RETRY_PATH_FAILURE ;
1719
+ case DID_NO_CONNECT :
1720
+ return PR_STS_PATH_FAILED ;
1721
+ case DID_TRANSPORT_FAILFAST :
1722
+ return PR_STS_PATH_FAST_FAILED ;
1723
+ }
1724
+
1725
+ switch (status_byte (result )) {
1726
+ case SAM_STAT_RESERVATION_CONFLICT :
1727
+ return PR_STS_RESERVATION_CONFLICT ;
1728
+ case SAM_STAT_CHECK_CONDITION :
1729
+ if (!scsi_sense_valid (sshdr ))
1730
+ return PR_STS_IOERR ;
1731
+
1732
+ if (sshdr -> sense_key == ILLEGAL_REQUEST &&
1733
+ (sshdr -> asc == 0x26 || sshdr -> asc == 0x24 ))
1734
+ return - EINVAL ;
1735
+
1736
+ fallthrough ;
1737
+ default :
1738
+ return PR_STS_IOERR ;
1739
+ }
1740
+ }
1741
+
1712
1742
static int sd_pr_command (struct block_device * bdev , u8 sa ,
1713
1743
u64 key , u64 sa_key , u8 type , u8 flags )
1714
1744
{
@@ -1737,7 +1767,10 @@ static int sd_pr_command(struct block_device *bdev, u8 sa,
1737
1767
scsi_print_sense_hdr (sdev , NULL , & sshdr );
1738
1768
}
1739
1769
1740
- return result ;
1770
+ if (result <= 0 )
1771
+ return result ;
1772
+
1773
+ return sd_scsi_to_pr_err (& sshdr , result );
1741
1774
}
1742
1775
1743
1776
static int sd_pr_register (struct block_device * bdev , u64 old_key , u64 new_key ,
0 commit comments