aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/ata/libata-core.c14
-rw-r--r--include/linux/libata.h3
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
4765static unsigned int ata_sg_setup_extra(struct ata_queued_cmd *qc, 4765static 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,
4866static int ata_sg_setup(struct ata_queued_cmd *qc) 4869static 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;