From 57f9221fab42b6488ca01352607f39534f504632 Mon Sep 17 00:00:00 2001 From: Dariusz Stojaczyk Date: Thu, 22 Jun 2017 16:44:49 +0200 Subject: [PATCH] scsi: added spdk_scsi_dev_has_pending_tasks() Added new function in preparation to implementing device hotremove. Change-Id: I5b85f76f543b882acf3b0fe40c9e92125594b257 Signed-off-by: Dariusz Stojaczyk Reviewed-on: https://review.gerrithub.io/366725 Tested-by: SPDK Automated Test System Reviewed-by: Daniel Verkamp Reviewed-by: Jim Harris --- include/spdk/scsi.h | 1 + lib/scsi/dev.c | 14 ++++++++++++++ lib/scsi/lun.c | 8 +++++++- lib/scsi/scsi_internal.h | 1 + test/unit/lib/scsi/dev.c/dev_ut.c | 5 +++++ 5 files changed, 28 insertions(+), 1 deletion(-) diff --git a/include/spdk/scsi.h b/include/spdk/scsi.h index f93e99a11..791eb51cc 100644 --- a/include/spdk/scsi.h +++ b/include/spdk/scsi.h @@ -168,6 +168,7 @@ const char *spdk_scsi_dev_get_name(const struct spdk_scsi_dev *dev); int spdk_scsi_dev_get_id(const struct spdk_scsi_dev *dev); int spdk_scsi_dev_get_max_lun(const struct spdk_scsi_dev *dev); struct spdk_scsi_lun *spdk_scsi_dev_get_lun(struct spdk_scsi_dev *dev, int lun_id); +bool spdk_scsi_dev_has_pending_tasks(const struct spdk_scsi_dev *dev); void spdk_scsi_dev_destruct(struct spdk_scsi_dev *dev); void spdk_scsi_dev_queue_mgmt_task(struct spdk_scsi_dev *dev, struct spdk_scsi_task *task, enum spdk_scsi_task_func func); diff --git a/lib/scsi/dev.c b/lib/scsi/dev.c index 16b8b94b4..9f19f4fbd 100644 --- a/lib/scsi/dev.c +++ b/lib/scsi/dev.c @@ -337,3 +337,17 @@ spdk_scsi_dev_get_lun(struct spdk_scsi_dev *dev, int lun_id) return dev->lun[lun_id]; } + +bool +spdk_scsi_dev_has_pending_tasks(const struct spdk_scsi_dev *dev) +{ + int i; + + for (i = 0; i < dev->maxlun; ++i) { + if (dev->lun[i] && spdk_scsi_lun_has_pending_tasks(dev->lun[i])) { + return true; + } + } + + return false; +} diff --git a/lib/scsi/lun.c b/lib/scsi/lun.c index 7562c9a5d..2ec4ad3ba 100644 --- a/lib/scsi/lun.c +++ b/lib/scsi/lun.c @@ -226,7 +226,7 @@ spdk_scsi_lun_hotplug(void *arg) { struct spdk_scsi_lun *lun = (struct spdk_scsi_lun *)arg; - if (TAILQ_EMPTY(&lun->pending_tasks) && TAILQ_EMPTY(&lun->tasks)) { + if (!spdk_scsi_lun_has_pending_tasks(lun)) { spdk_scsi_lun_free_io_channel(lun); spdk_scsi_lun_delete(lun->name); } @@ -416,3 +416,9 @@ spdk_scsi_lun_get_dev(const struct spdk_scsi_lun *lun) { return lun->dev; } + +bool +spdk_scsi_lun_has_pending_tasks(const struct spdk_scsi_lun *lun) +{ + return !TAILQ_EMPTY(&lun->pending_tasks) || !TAILQ_EMPTY(&lun->tasks); +} diff --git a/lib/scsi/scsi_internal.h b/lib/scsi/scsi_internal.h index 9d483935e..e4a7167ca 100644 --- a/lib/scsi/scsi_internal.h +++ b/lib/scsi/scsi_internal.h @@ -146,6 +146,7 @@ int spdk_scsi_lun_unclaim(struct spdk_scsi_lun *lun); int spdk_scsi_lun_delete(const char *lun_name); int spdk_scsi_lun_allocate_io_channel(struct spdk_scsi_lun *lun); void spdk_scsi_lun_free_io_channel(struct spdk_scsi_lun *lun); +bool spdk_scsi_lun_has_pending_tasks(const struct spdk_scsi_lun *lun); int spdk_scsi_lun_db_add(struct spdk_scsi_lun *lun); int spdk_scsi_lun_db_delete(struct spdk_scsi_lun *lun); diff --git a/test/unit/lib/scsi/dev.c/dev_ut.c b/test/unit/lib/scsi/dev.c/dev_ut.c index d87d5e426..69a1bcb7a 100644 --- a/test/unit/lib/scsi/dev.c/dev_ut.c +++ b/test/unit/lib/scsi/dev.c/dev_ut.c @@ -177,6 +177,11 @@ spdk_scsi_lun_free_io_channel(struct spdk_scsi_lun *lun) { } +bool +spdk_scsi_lun_has_pending_tasks(const struct spdk_scsi_lun *lun) +{ + return false; +} static void dev_destruct_null_dev(void)