-struct sync_cmd_info {
- struct task_struct *task;
- u32 result;
- int status;
-};
-
-static void sync_completion(struct nvme_queue *nvmeq, void *ctx,
- struct nvme_completion *cqe)
-{
- struct sync_cmd_info *cmdinfo = ctx;
- if (unlikely((unsigned long)cmdinfo == CMD_CTX_CANCELLED))
- return;
- if ((unsigned long)cmdinfo == CMD_CTX_FLUSH)
- return;
- if (unlikely((unsigned long)cmdinfo == CMD_CTX_COMPLETED)) {
- dev_warn(nvmeq->q_dmadev,
- "completed id %d twice on queue %d\n",
- cqe->command_id, le16_to_cpup(&cqe->sq_id));
- return;
- }
- if (unlikely((unsigned long)cmdinfo == CMD_CTX_INVALID)) {
- dev_warn(nvmeq->q_dmadev,
- "invalid id %d completed on queue %d\n",
- cqe->command_id, le16_to_cpup(&cqe->sq_id));
- return;
- }
- cmdinfo->result = le32_to_cpup(&cqe->result);
- cmdinfo->status = le16_to_cpup(&cqe->status) >> 1;
- wake_up_process(cmdinfo->task);
-}
-
-typedef void (*completion_fn)(struct nvme_queue *, void *,
- struct nvme_completion *);
-
-static const completion_fn nvme_completions[4] = {
- [sync_completion_id] = sync_completion,
- [bio_completion_id] = bio_completion,
-};
-