Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b2b465e9 authored by Martin K. Petersen's avatar Martin K. Petersen Committed by James Bottomley
Browse files

[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: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent 88197966
Loading
Loading
Loading
Loading
+11 −18
Original line number Diff line number Diff line
@@ -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;
}