From 81d60e6f30bef26803a72a16d9ad5a4ceb383d6e Mon Sep 17 00:00:00 2001 From: Tsuyoshi Uchida Date: Tue, 8 Nov 2016 10:12:49 -0800 Subject: [PATCH] scsi: fix panic issue of spdk_scsi_dev_queue_task When task->lun is NULL, spdk_scsi_dev_queue_task panics. This patch fixes it. --- lib/scsi/dev.c | 7 ++++--- lib/scsi/lun.c | 5 +++-- lib/scsi/scsi_internal.h | 2 +- test/lib/scsi/dev/dev_ut.c | 3 ++- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/scsi/dev.c b/lib/scsi/dev.c index 8d76d9cc0..b36f001ca 100644 --- a/lib/scsi/dev.c +++ b/lib/scsi/dev.c @@ -198,9 +198,10 @@ spdk_scsi_dev_queue_task(struct spdk_scsi_dev *dev, { assert(task != NULL); - /* ready to enqueue, disk is valid for LUN access */ - spdk_scsi_lun_append_task(task->lun, task); - spdk_scsi_lun_execute_tasks(task->lun); + if (spdk_scsi_lun_append_task(task->lun, task) == 0) { + /* ready to execute, disk is valid for LUN access */ + spdk_scsi_lun_execute_tasks(task->lun); + } } int diff --git a/lib/scsi/lun.c b/lib/scsi/lun.c index e6e8ab3a1..9d5299705 100644 --- a/lib/scsi/lun.c +++ b/lib/scsi/lun.c @@ -223,15 +223,16 @@ complete_task_with_no_lun(struct spdk_scsi_task *task) spdk_scsi_lun_complete_task(NULL, task); } -void +int spdk_scsi_lun_append_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *task) { if (lun == NULL) { complete_task_with_no_lun(task); - return; + return -1; } TAILQ_INSERT_TAIL(&lun->pending_tasks, task, scsi_link); + return 0; } void diff --git a/lib/scsi/scsi_internal.h b/lib/scsi/scsi_internal.h index 3b7904da9..77c5f50eb 100644 --- a/lib/scsi/scsi_internal.h +++ b/lib/scsi/scsi_internal.h @@ -77,7 +77,7 @@ typedef struct spdk_scsi_lun _spdk_scsi_lun; _spdk_scsi_lun *spdk_scsi_lun_construct(const char *name, struct spdk_bdev *bdev); void spdk_scsi_lun_clear_all(struct spdk_scsi_lun *lun); -void spdk_scsi_lun_append_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *task); +int spdk_scsi_lun_append_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *task); void spdk_scsi_lun_execute_tasks(struct spdk_scsi_lun *lun); int spdk_scsi_lun_task_mgmt_execute(struct spdk_scsi_task *task); void spdk_scsi_lun_complete_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *task); diff --git a/test/lib/scsi/dev/dev_ut.c b/test/lib/scsi/dev/dev_ut.c index 8029d093f..2bfbe6f7a 100644 --- a/test/lib/scsi/dev/dev_ut.c +++ b/test/lib/scsi/dev/dev_ut.c @@ -107,9 +107,10 @@ spdk_scsi_lun_task_mgmt_execute(struct spdk_scsi_task *task) return 0; } -void +int spdk_scsi_lun_append_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *task) { + return 0; } void