Re: [patch libata-dev-2.6 1/5] libata: fix command queue leak when xlat_func fails
applied all five, thanks - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[patch libata-dev-2.6 1/5] libata: fix command queue leak when xlat_func fails
ata_scsi_translate allocates from the libata command queue by calling ata_scsi_qc_new. If xlat_func returns non-zero, control jumps to err_out which fails to free the allocated command. Fix is to add a new API to free unused commands. Signed-off-by: John W. Linville <[EMAIL PROTECTED]> --- drivers/scsi/libata-core.c | 18 ++ drivers/scsi/libata-scsi.c |1 + drivers/scsi/libata.h |1 + 3 files changed, 20 insertions(+) --- sata-smart-2.6/drivers/scsi/libata-scsi.c.bugfix2005-02-17 16:47:04.992924055 -0500 +++ sata-smart-2.6/drivers/scsi/libata-scsi.c 2005-02-17 16:48:48.265138198 -0500 @@ -967,6 +967,7 @@ static void ata_scsi_translate(struct at return; err_out: + ata_qc_free(qc); ata_bad_cdb(cmd, done); DPRINTK("EXIT - badcmd\n"); } --- sata-smart-2.6/drivers/scsi/libata-core.c.bugfix2005-02-17 16:46:44.659638355 -0500 +++ sata-smart-2.6/drivers/scsi/libata-core.c 2005-02-17 16:48:48.269137664 -0500 @@ -2687,6 +2687,24 @@ static void __ata_qc_complete(struct ata } /** + * ata_qc_free - free unused ata_queued_cmd + * @qc: Command to complete + * + * Designed to free unused ata_queued_cmd object + * in case something prevents using it. + * + * LOCKING: + * + */ +void ata_qc_free(struct ata_queued_cmd *qc) +{ + assert(qc != NULL); /* ata_qc_from_tag _might_ return NULL */ + assert(qc->waiting == NULL);/* nothing should be waiting */ + + __ata_qc_complete(qc); +} + +/** * ata_qc_complete - Complete an active ATA command * @qc: Command to complete * @drv_stat: ATA status register contents --- sata-smart-2.6/drivers/scsi/libata.h.bugfix 2005-02-17 16:46:47.630241808 -0500 +++ sata-smart-2.6/drivers/scsi/libata.h2005-02-17 16:48:48.306132726 -0500 @@ -37,6 +37,7 @@ struct ata_scsi_args { /* libata-core.c */ extern struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap, struct ata_device *dev); +extern void ata_qc_free(struct ata_queued_cmd *qc); extern int ata_qc_issue(struct ata_queued_cmd *qc); extern int ata_check_atapi_dma(struct ata_queued_cmd *qc); extern int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg); -- John W. Linville [EMAIL PROTECTED] - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[patch libata-dev-2.6 1/5] libata: fix command queue leak when xlat_func fails
ata_scsi_translate allocates from the libata command queue by calling ata_scsi_qc_new. If xlat_func returns non-zero, control jumps to err_out which fails to free the allocated command. Fix is to add a new API to free unused commands. Signed-off-by: John W. Linville [EMAIL PROTECTED] --- drivers/scsi/libata-core.c | 18 ++ drivers/scsi/libata-scsi.c |1 + drivers/scsi/libata.h |1 + 3 files changed, 20 insertions(+) --- sata-smart-2.6/drivers/scsi/libata-scsi.c.bugfix2005-02-17 16:47:04.992924055 -0500 +++ sata-smart-2.6/drivers/scsi/libata-scsi.c 2005-02-17 16:48:48.265138198 -0500 @@ -967,6 +967,7 @@ static void ata_scsi_translate(struct at return; err_out: + ata_qc_free(qc); ata_bad_cdb(cmd, done); DPRINTK(EXIT - badcmd\n); } --- sata-smart-2.6/drivers/scsi/libata-core.c.bugfix2005-02-17 16:46:44.659638355 -0500 +++ sata-smart-2.6/drivers/scsi/libata-core.c 2005-02-17 16:48:48.269137664 -0500 @@ -2687,6 +2687,24 @@ static void __ata_qc_complete(struct ata } /** + * ata_qc_free - free unused ata_queued_cmd + * @qc: Command to complete + * + * Designed to free unused ata_queued_cmd object + * in case something prevents using it. + * + * LOCKING: + * + */ +void ata_qc_free(struct ata_queued_cmd *qc) +{ + assert(qc != NULL); /* ata_qc_from_tag _might_ return NULL */ + assert(qc-waiting == NULL);/* nothing should be waiting */ + + __ata_qc_complete(qc); +} + +/** * ata_qc_complete - Complete an active ATA command * @qc: Command to complete * @drv_stat: ATA status register contents --- sata-smart-2.6/drivers/scsi/libata.h.bugfix 2005-02-17 16:46:47.630241808 -0500 +++ sata-smart-2.6/drivers/scsi/libata.h2005-02-17 16:48:48.306132726 -0500 @@ -37,6 +37,7 @@ struct ata_scsi_args { /* libata-core.c */ extern struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap, struct ata_device *dev); +extern void ata_qc_free(struct ata_queued_cmd *qc); extern int ata_qc_issue(struct ata_queued_cmd *qc); extern int ata_check_atapi_dma(struct ata_queued_cmd *qc); extern int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg); -- John W. Linville [EMAIL PROTECTED] - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [patch libata-dev-2.6 1/5] libata: fix command queue leak when xlat_func fails
applied all five, thanks - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/