Skip to content

Commit

Permalink
[PATCH] libata: fix qc->n_elem == 0 case handling in ata_qc_next_sg
Browse files Browse the repository at this point in the history
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: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
  • Loading branch information
Tejun Heo authored and Jeff Garzik committed Feb 20, 2006
1 parent 9ae61c6 commit cc1887f
Showing 1 changed file with 14 additions and 2 deletions.
16 changes: 14 additions & 2 deletions include/linux/libata.h
Original file line number Diff line number Diff line change
Expand Up @@ -556,18 +556,30 @@ ata_sg_is_last(struct scatterlist *sg, struct ata_queued_cmd *qc)
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 *
ata_qc_next_sg(struct scatterlist *sg, struct ata_queued_cmd *qc)
{
if (sg == &qc->pad_sgent)
return NULL;
if (++sg - qc->__sg < qc->n_elem)
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) \
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)
{
Expand Down

0 comments on commit cc1887f

Please sign in to comment.