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

Commit f0ef88ed authored by Mark Lord's avatar Mark Lord Committed by Jeff Garzik
Browse files

RESEND: libata: check cdb len per dev instead of per host



Resending, with s/printk/DPRINTK/ as pointed out by Alan.

Fix libata to perform CDB len validation per device
rather than per host.  This way, validation still works
when we have a mix of 12-byte and 16-byte devices on
a common host interface.

Signed-off-by: default avatarMark Lord <mlord@pobox.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent cd0d3bbc
Loading
Loading
Loading
Loading
+1 −17
Original line number Original line Diff line number Diff line
@@ -1560,20 +1560,6 @@ static void ata_dev_config_ncq(struct ata_device *dev,
		snprintf(desc, desc_sz, "NCQ (depth %d/%d)", hdepth, ddepth);
		snprintf(desc, desc_sz, "NCQ (depth %d/%d)", hdepth, ddepth);
}
}


static void ata_set_port_max_cmd_len(struct ata_port *ap)
{
	int i;

	if (ap->scsi_host) {
		unsigned int len = 0;

		for (i = 0; i < ATA_MAX_DEVICES; i++)
			len = max(len, ap->device[i].cdb_len);

		ap->scsi_host->max_cmd_len = len;
	}
}

/**
/**
 *	ata_dev_configure - Configure the specified ATA/ATAPI device
 *	ata_dev_configure - Configure the specified ATA/ATAPI device
 *	@dev: Target device to configure
 *	@dev: Target device to configure
@@ -1773,8 +1759,6 @@ int ata_dev_configure(struct ata_device *dev)
		}
		}
	}
	}


	ata_set_port_max_cmd_len(ap);

	/* limit bridge transfers to udma5, 200 sectors */
	/* limit bridge transfers to udma5, 200 sectors */
	if (ata_dev_knobble(dev)) {
	if (ata_dev_knobble(dev)) {
		if (ata_msg_drv(ap) && print_info)
		if (ata_msg_drv(ap) && print_info)
@@ -5670,7 +5654,7 @@ static void ata_port_init_shost(struct ata_port *ap, struct Scsi_Host *shost)
	shost->max_id = 16;
	shost->max_id = 16;
	shost->max_lun = 1;
	shost->max_lun = 1;
	shost->max_channel = 1;
	shost->max_channel = 1;
	shost->max_cmd_len = 12;
	shost->max_cmd_len = 16;
}
}


/**
/**
+3 −2
Original line number Original line Diff line number Diff line
@@ -2792,8 +2792,9 @@ static inline int __ata_scsi_queuecmd(struct scsi_cmnd *scmd,
{
{
	int rc = 0;
	int rc = 0;


	if (unlikely(!scmd->cmd_len)) {
	if (unlikely(!scmd->cmd_len || scmd->cmd_len > dev->cdb_len)) {
		ata_dev_printk(dev, KERN_WARNING, "WARNING: zero len CDB\n");
		DPRINTK("bad CDB len=%u, max=%u\n",
			scmd->cmd_len, dev->cdb_len);
		scmd->result = DID_ERROR << 16;
		scmd->result = DID_ERROR << 16;
		done(scmd);
		done(scmd);
		return 0;
		return 0;