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

Commit d9572b1d authored by Tejun Heo's avatar Tejun Heo Committed by Jeff Garzik
Browse files

[PATCH] libata: convert dev->id to pointer



Convert dev->id from array to pointer.  This is to accomodate
revalidation.  During revalidation, both old and new IDENTIFY pages
should be accessible and single ->id array doesn't cut it.

Signed-off-by: default avatarTejun Heo <htejun@gmail.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent d133ecab
Loading
Loading
Loading
Loading
+17 −3
Original line number Diff line number Diff line
@@ -911,7 +911,7 @@ unsigned int ata_pio_need_iordy(const struct ata_device *adev)
 *	@dev: target device
 *	@p_class: pointer to class of the target device (may be changed)
 *	@post_reset: is this read ID post-reset?
 *	@id: buffer to fill IDENTIFY page into
 *	@p_id: read IDENTIFY page (newly allocated)
 *
 *	Read ID data from the specified device.  ATA_CMD_ID_ATA is
 *	performed on ATA devices and ATA_CMD_ID_ATAPI on ATAPI
@@ -926,12 +926,13 @@ unsigned int ata_pio_need_iordy(const struct ata_device *adev)
 *	0 on success, -errno otherwise.
 */
static int ata_dev_read_id(struct ata_port *ap, struct ata_device *dev,
			   unsigned int *p_class, int post_reset, u16 *id)
			   unsigned int *p_class, int post_reset, u16 **p_id)
{
	unsigned int class = *p_class;
	unsigned int using_edd;
	struct ata_taskfile tf;
	unsigned int err_mask = 0;
	u16 *id;
	const char *reason;
	int rc;

@@ -945,6 +946,13 @@ static int ata_dev_read_id(struct ata_port *ap, struct ata_device *dev,

	ata_dev_select(ap, dev->devno, 1, 1); /* select device 0/1 */

	id = kmalloc(sizeof(id[0]) * ATA_ID_WORDS, GFP_KERNEL);
	if (id == NULL) {
		rc = -ENOMEM;
		reason = "out of memory";
		goto err_out;
	}

 retry:
	ata_tf_init(ap, &tf, dev->devno);

@@ -1035,11 +1043,13 @@ static int ata_dev_read_id(struct ata_port *ap, struct ata_device *dev,
	}

	*p_class = class;
	*p_id = id;
	return 0;

 err_out:
	printk(KERN_WARNING "ata%u: dev %u failed to IDENTIFY (%s)\n",
	       ap->id, dev->devno, reason);
	kfree(id);
	return rc;
}

@@ -1079,7 +1089,8 @@ static void ata_dev_identify(struct ata_port *ap, unsigned int device)

	DPRINTK("ENTER, host %u, dev %u\n", ap->id, device);

	rc = ata_dev_read_id(ap, dev, &dev->class, 1, dev->id);
	WARN_ON(dev->id != NULL);
	rc = ata_dev_read_id(ap, dev, &dev->class, 1, &dev->id);
	if (rc)
		goto err_out;

@@ -4732,11 +4743,14 @@ void ata_host_set_remove(struct ata_host_set *host_set)
int ata_scsi_release(struct Scsi_Host *host)
{
	struct ata_port *ap = (struct ata_port *) &host->hostdata[0];
	int i;

	DPRINTK("ENTER\n");

	ap->ops->port_disable(ap);
	ata_host_remove(ap, 0);
	for (i = 0; i < ATA_MAX_DEVICES; i++)
		kfree(ap->device[i].id);

	DPRINTK("EXIT\n");
	return 1;
+1 −1
Original line number Diff line number Diff line
@@ -339,7 +339,7 @@ struct ata_device {
	unsigned long		flags;		/* ATA_DFLAG_xxx */
	unsigned int		class;		/* ATA_DEV_xxx */
	unsigned int		devno;		/* 0 or 1 */
	u16			id[ATA_ID_WORDS]; /* IDENTIFY xxx DEVICE data */
	u16			*id;		/* IDENTIFY xxx DEVICE data */
	u8			pio_mode;
	u8			dma_mode;
	u8			xfer_mode;