Commit cc1887f3 authored by Tejun Heo's avatar Tejun Heo Committed by Jeff Garzik

[PATCH] libata: fix qc->n_elem == 0 case handling in ata_qc_next_sg

This patch makes ata_for_each_sg() start with pad_sgent when
qc->n_elem is zero.  Previously, ata_for_each_sg() unconditionally
started with qc->__sg, handling the first sg to fill_sg() routines
even when the entry was invalid.  And while at it, unwind ?: in
ata_qc_next_sg() into if statement.
Signed-off-by: default avatarTejun Heo <htejun@gmail.com>
Signed-off-by: default avatarJeff Garzik <jgarzik@pobox.com>
parent 9ae61c6c
...@@ -556,6 +556,16 @@ ata_sg_is_last(struct scatterlist *sg, struct ata_queued_cmd *qc) ...@@ -556,6 +556,16 @@ ata_sg_is_last(struct scatterlist *sg, struct ata_queued_cmd *qc)
return 0; return 0;
} }
static inline struct scatterlist *
ata_qc_first_sg(struct ata_queued_cmd *qc)
{
if (qc->n_elem)
return qc->__sg;
if (qc->pad_len)
return &qc->pad_sgent;
return NULL;
}
static inline struct scatterlist * static inline struct scatterlist *
ata_qc_next_sg(struct scatterlist *sg, struct ata_queued_cmd *qc) ata_qc_next_sg(struct scatterlist *sg, struct ata_queued_cmd *qc)
{ {
...@@ -563,11 +573,13 @@ ata_qc_next_sg(struct scatterlist *sg, struct ata_queued_cmd *qc) ...@@ -563,11 +573,13 @@ ata_qc_next_sg(struct scatterlist *sg, struct ata_queued_cmd *qc)
return NULL; return NULL;
if (++sg - qc->__sg < qc->n_elem) if (++sg - qc->__sg < qc->n_elem)
return sg; return sg;
return qc->pad_len ? &qc->pad_sgent : NULL; if (qc->pad_len)
return &qc->pad_sgent;
return NULL;
} }
#define ata_for_each_sg(sg, qc) \ #define ata_for_each_sg(sg, qc) \
for (sg = qc->__sg; sg; sg = ata_qc_next_sg(sg, qc)) for (sg = ata_qc_first_sg(qc); sg; sg = ata_qc_next_sg(sg, qc))
static inline unsigned int ata_tag_valid(unsigned int tag) static inline unsigned int ata_tag_valid(unsigned int tag)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment