diff options
author | Tejun Heo <htejun@gmail.com> | 2007-01-16 21:34:02 -0500 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-01-19 19:18:49 -0500 |
commit | 501e0c500217e38276d61445ee0839b3f2c66d05 (patch) | |
tree | b84db101bc9c68dd37aae7eba062abde5001ad80 | |
parent | 96bc103f4c4e470d82ba5e372191d02ad715da45 (diff) |
libata: initialize qc->dma_dir to DMA_NONE
libata didn't used to init qc->dma_dir to any specific value on qc
initialization and command translation path didn't set qc->dma_dir if
the command doesn't need data transfer. This made non-data commands
to have random qc->dma_dir.
This usually doesn't cause problem because LLDs usually check
qc->protocol first and look at qc->dma_dir iff the command needs data
transfer but this doesn't hold for all LLDs.
It might be worthwhile to rename qc->dma_dir to qc->data_dir as we use
the field to tag data direction for both PIO and DMA protocols.
This problem has been spotted by James Bottomley.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Cc: James Bottomley <James.Bottomley@SteelEye.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
-rw-r--r-- | include/linux/libata.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/include/linux/libata.h b/include/linux/libata.h index ab2754830322..e53a13ba7f78 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -1143,6 +1143,7 @@ static inline void ata_tf_init(struct ata_device *dev, struct ata_taskfile *tf) | |||
1143 | 1143 | ||
1144 | static inline void ata_qc_reinit(struct ata_queued_cmd *qc) | 1144 | static inline void ata_qc_reinit(struct ata_queued_cmd *qc) |
1145 | { | 1145 | { |
1146 | qc->dma_dir = DMA_NONE; | ||
1146 | qc->__sg = NULL; | 1147 | qc->__sg = NULL; |
1147 | qc->flags = 0; | 1148 | qc->flags = 0; |
1148 | qc->cursect = qc->cursg = qc->cursg_ofs = 0; | 1149 | qc->cursect = qc->cursg = qc->cursg_ofs = 0; |