diff options
-rw-r--r-- | drivers/ata/libata-core.c | 14 | ||||
-rw-r--r-- | include/linux/libata.h | 3 |
2 files changed, 12 insertions, 5 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index e998028302da..ee72994500a3 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -4763,13 +4763,15 @@ void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg, | |||
4763 | } | 4763 | } |
4764 | 4764 | ||
4765 | static unsigned int ata_sg_setup_extra(struct ata_queued_cmd *qc, | 4765 | static unsigned int ata_sg_setup_extra(struct ata_queued_cmd *qc, |
4766 | unsigned int *n_elem_extra) | 4766 | unsigned int *n_elem_extra, |
4767 | unsigned int *nbytes_extra) | ||
4767 | { | 4768 | { |
4768 | struct ata_port *ap = qc->ap; | 4769 | struct ata_port *ap = qc->ap; |
4769 | unsigned int n_elem = qc->n_elem; | 4770 | unsigned int n_elem = qc->n_elem; |
4770 | struct scatterlist *lsg, *copy_lsg = NULL, *tsg = NULL, *esg = NULL; | 4771 | struct scatterlist *lsg, *copy_lsg = NULL, *tsg = NULL, *esg = NULL; |
4771 | 4772 | ||
4772 | *n_elem_extra = 0; | 4773 | *n_elem_extra = 0; |
4774 | *nbytes_extra = 0; | ||
4773 | 4775 | ||
4774 | /* needs padding? */ | 4776 | /* needs padding? */ |
4775 | qc->pad_len = qc->nbytes & 3; | 4777 | qc->pad_len = qc->nbytes & 3; |
@@ -4833,6 +4835,7 @@ static unsigned int ata_sg_setup_extra(struct ata_queued_cmd *qc, | |||
4833 | esg = &qc->extra_sg[1]; | 4835 | esg = &qc->extra_sg[1]; |
4834 | 4836 | ||
4835 | (*n_elem_extra)++; | 4837 | (*n_elem_extra)++; |
4838 | (*nbytes_extra) += 4 - qc->pad_len; | ||
4836 | } | 4839 | } |
4837 | 4840 | ||
4838 | if (copy_lsg) | 4841 | if (copy_lsg) |
@@ -4866,11 +4869,11 @@ static unsigned int ata_sg_setup_extra(struct ata_queued_cmd *qc, | |||
4866 | static int ata_sg_setup(struct ata_queued_cmd *qc) | 4869 | static int ata_sg_setup(struct ata_queued_cmd *qc) |
4867 | { | 4870 | { |
4868 | struct ata_port *ap = qc->ap; | 4871 | struct ata_port *ap = qc->ap; |
4869 | unsigned int n_elem, n_elem_extra; | 4872 | unsigned int n_elem, n_elem_extra, nbytes_extra; |
4870 | 4873 | ||
4871 | VPRINTK("ENTER, ata%u\n", ap->print_id); | 4874 | VPRINTK("ENTER, ata%u\n", ap->print_id); |
4872 | 4875 | ||
4873 | n_elem = ata_sg_setup_extra(qc, &n_elem_extra); | 4876 | n_elem = ata_sg_setup_extra(qc, &n_elem_extra, &nbytes_extra); |
4874 | 4877 | ||
4875 | if (n_elem) { | 4878 | if (n_elem) { |
4876 | n_elem = dma_map_sg(ap->dev, qc->sg, n_elem, qc->dma_dir); | 4879 | n_elem = dma_map_sg(ap->dev, qc->sg, n_elem, qc->dma_dir); |
@@ -4885,7 +4888,7 @@ static int ata_sg_setup(struct ata_queued_cmd *qc) | |||
4885 | 4888 | ||
4886 | qc->n_elem = qc->mapped_n_elem = n_elem; | 4889 | qc->n_elem = qc->mapped_n_elem = n_elem; |
4887 | qc->n_elem += n_elem_extra; | 4890 | qc->n_elem += n_elem_extra; |
4888 | 4891 | qc->nbytes += nbytes_extra; | |
4889 | qc->flags |= ATA_QCFLAG_DMAMAP; | 4892 | qc->flags |= ATA_QCFLAG_DMAMAP; |
4890 | 4893 | ||
4891 | return 0; | 4894 | return 0; |
@@ -5949,6 +5952,9 @@ void ata_qc_issue(struct ata_queued_cmd *qc) | |||
5949 | */ | 5952 | */ |
5950 | BUG_ON(ata_is_data(prot) && (!qc->sg || !qc->n_elem || !qc->nbytes)); | 5953 | BUG_ON(ata_is_data(prot) && (!qc->sg || !qc->n_elem || !qc->nbytes)); |
5951 | 5954 | ||
5955 | /* ata_sg_setup() may update nbytes */ | ||
5956 | qc->raw_nbytes = qc->nbytes; | ||
5957 | |||
5952 | if (ata_is_dma(prot) || (ata_is_pio(prot) && | 5958 | if (ata_is_dma(prot) || (ata_is_pio(prot) && |
5953 | (ap->flags & ATA_FLAG_PIO_DMA))) | 5959 | (ap->flags & ATA_FLAG_PIO_DMA))) |
5954 | if (ata_sg_setup(qc)) | 5960 | if (ata_sg_setup(qc)) |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 162f8b5509ac..7b7c78e42077 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -466,6 +466,7 @@ struct ata_queued_cmd { | |||
466 | unsigned int sect_size; | 466 | unsigned int sect_size; |
467 | 467 | ||
468 | unsigned int nbytes; | 468 | unsigned int nbytes; |
469 | unsigned int raw_nbytes; | ||
469 | unsigned int curbytes; | 470 | unsigned int curbytes; |
470 | 471 | ||
471 | struct scatterlist *cursg; | 472 | struct scatterlist *cursg; |
@@ -1362,7 +1363,7 @@ static inline void ata_qc_reinit(struct ata_queued_cmd *qc) | |||
1362 | qc->flags = 0; | 1363 | qc->flags = 0; |
1363 | qc->cursg = NULL; | 1364 | qc->cursg = NULL; |
1364 | qc->cursg_ofs = 0; | 1365 | qc->cursg_ofs = 0; |
1365 | qc->nbytes = qc->curbytes = 0; | 1366 | qc->nbytes = qc->raw_nbytes = qc->curbytes = 0; |
1366 | qc->n_elem = 0; | 1367 | qc->n_elem = 0; |
1367 | qc->mapped_n_elem = 0; | 1368 | qc->mapped_n_elem = 0; |
1368 | qc->n_iter = 0; | 1369 | qc->n_iter = 0; |