aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/nvme.h
diff options
context:
space:
mode:
authorKeith Busch <keith.busch@intel.com>2014-04-03 18:45:23 -0400
committerMatthew Wilcox <matthew.r.wilcox@intel.com>2014-04-10 17:11:59 -0400
commitedd10d33283899fb15d99a290dcc9ceb3604ca78 (patch)
tree870dc908379694e20ea319ba11c81bec5864cef7 /include/linux/nvme.h
parent4cc09e2dc4cbe6009c935b6f12a8376f09124bc5 (diff)
NVMe: Retry failed commands with non-fatal errors
For commands returned with failed status, queue these for resubmission and continue retrying them until success or for a limited amount of time. The final timeout was arbitrarily chosen so requests can't be retried indefinitely. Since these are requeued on the nvmeq that submitted the command, the callbacks have to take an nvmeq instead of an nvme_dev as a parameter so that we can use the locked queue to append the iod to retry later. The nvme_iod conviently can be used to track how long we've been trying to successfully complete an iod request. The nvme_iod also provides the nvme prp dma mappings, so I had to move a few things around so we can keep those mappings. Signed-off-by: Keith Busch <keith.busch@intel.com> [fixed checkpatch issue with long line] Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
Diffstat (limited to 'include/linux/nvme.h')
-rw-r--r--include/linux/nvme.h4
1 files changed, 2 insertions, 2 deletions
diff --git a/include/linux/nvme.h b/include/linux/nvme.h
index 1da0807c65bc..b95431d0338b 100644
--- a/include/linux/nvme.h
+++ b/include/linux/nvme.h
@@ -136,6 +136,7 @@ struct nvme_iod {
136 int length; /* Of data, in bytes */ 136 int length; /* Of data, in bytes */
137 unsigned long start_time; 137 unsigned long start_time;
138 dma_addr_t first_dma; 138 dma_addr_t first_dma;
139 struct list_head node;
139 struct scatterlist sg[0]; 140 struct scatterlist sg[0];
140}; 141};
141 142
@@ -151,8 +152,7 @@ static inline u64 nvme_block_nr(struct nvme_ns *ns, sector_t sector)
151 */ 152 */
152void nvme_free_iod(struct nvme_dev *dev, struct nvme_iod *iod); 153void nvme_free_iod(struct nvme_dev *dev, struct nvme_iod *iod);
153 154
154int nvme_setup_prps(struct nvme_dev *dev, struct nvme_common_command *cmd, 155int nvme_setup_prps(struct nvme_dev *, struct nvme_iod *, int , gfp_t);
155 struct nvme_iod *iod, int total_len, gfp_t gfp);
156struct nvme_iod *nvme_map_user_pages(struct nvme_dev *dev, int write, 156struct nvme_iod *nvme_map_user_pages(struct nvme_dev *dev, int write,
157 unsigned long addr, unsigned length); 157 unsigned long addr, unsigned length);
158void nvme_unmap_user_pages(struct nvme_dev *dev, int write, 158void nvme_unmap_user_pages(struct nvme_dev *dev, int write,