diff options
author | Martin K. Petersen <martin.petersen@oracle.com> | 2009-10-29 22:32:26 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2009-11-06 11:50:52 -0600 |
commit | b2b465e9280b739a528435d2916c0a5c1b4eb100 (patch) | |
tree | 003751e8ad8f85a7a68e317aa8820de91ee5429a | |
parent | 88197966e1eeee6547764fa49bfce7e57549acd2 (diff) | |
download | op-kernel-dev-b2b465e9280b739a528435d2916c0a5c1b4eb100.zip op-kernel-dev-b2b465e9280b739a528435d2916c0a5c1b4eb100.tar.gz |
[SCSI] Fix incorrect reporting of host protection capabilities
The advent of DIF Type 2 devices exposed some missing break statements
in the protection mask switch constructs. However, rewriting the code
to use an index into a small static array seemed like a more elegant
solution.
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
-rw-r--r-- | include/scsi/scsi_host.h | 29 |
1 files changed, 11 insertions, 18 deletions
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index 6e728b1..47941fc 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h @@ -797,30 +797,23 @@ static inline unsigned int scsi_host_get_prot(struct Scsi_Host *shost) static inline unsigned int scsi_host_dif_capable(struct Scsi_Host *shost, unsigned int target_type) { - switch (target_type) { - case 1: - if (shost->prot_capabilities & SHOST_DIF_TYPE1_PROTECTION) - return target_type; - case 2: - if (shost->prot_capabilities & SHOST_DIF_TYPE2_PROTECTION) - return target_type; - case 3: - if (shost->prot_capabilities & SHOST_DIF_TYPE3_PROTECTION) - return target_type; - } + static unsigned char cap[] = { 0, + SHOST_DIF_TYPE1_PROTECTION, + SHOST_DIF_TYPE2_PROTECTION, + SHOST_DIF_TYPE3_PROTECTION }; - return 0; + return shost->prot_capabilities & cap[target_type] ? target_type : 0; } static inline unsigned int scsi_host_dix_capable(struct Scsi_Host *shost, unsigned int target_type) { #if defined(CONFIG_BLK_DEV_INTEGRITY) - switch (target_type) { - case 0: return shost->prot_capabilities & SHOST_DIX_TYPE0_PROTECTION; - case 1: return shost->prot_capabilities & SHOST_DIX_TYPE1_PROTECTION; - case 2: return shost->prot_capabilities & SHOST_DIX_TYPE2_PROTECTION; - case 3: return shost->prot_capabilities & SHOST_DIX_TYPE3_PROTECTION; - } + static unsigned char cap[] = { SHOST_DIX_TYPE0_PROTECTION, + SHOST_DIX_TYPE1_PROTECTION, + SHOST_DIX_TYPE2_PROTECTION, + SHOST_DIX_TYPE3_PROTECTION }; + + return shost->prot_capabilities & cap[target_type]; #endif return 0; } |