Loading include/spdk/scsi.h +11 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ #include <stdbool.h> #include <stdint.h> #include <pthread.h> #include <sys/uio.h> #include "spdk/queue.h" Loading Loading @@ -193,6 +194,14 @@ struct spdk_scsi_lun { /** The blockdev associated with this LUN. */ struct spdk_bdev *bdev; /** I/O channel for the blockdev associated with this LUN. */ struct spdk_io_channel *io_channel; /** Thread ID for the thread that allocated the I/O channel for this * LUN. All I/O to this LUN must be performed from this thread. */ pthread_t thread_id; /** Name for this LUN. */ char name[SPDK_SCSI_LUN_MAX_NAME_LENGTH]; Loading @@ -206,6 +215,8 @@ void spdk_scsi_dev_queue_task(struct spdk_scsi_dev *dev, struct spdk_scsi_task * int spdk_scsi_dev_add_port(struct spdk_scsi_dev *dev, uint64_t id, const char *name); struct spdk_scsi_port *spdk_scsi_dev_find_port_by_id(struct spdk_scsi_dev *dev, uint64_t id); void spdk_scsi_dev_print(struct spdk_scsi_dev *dev); int spdk_scsi_dev_allocate_io_channels(struct spdk_scsi_dev *dev); void spdk_scsi_dev_free_io_channels(struct spdk_scsi_dev *dev); /** Loading lib/scsi/dev.c +31 −0 Original line number Diff line number Diff line Loading @@ -256,3 +256,34 @@ spdk_scsi_dev_print(struct spdk_scsi_dev *dev) } } void spdk_scsi_dev_free_io_channels(struct spdk_scsi_dev *dev) { int i; for (i = 0; i < SPDK_SCSI_DEV_MAX_LUN; i++) { if (dev->lun[i] == NULL) { continue; } spdk_scsi_lun_free_io_channel(dev->lun[i]); } } int spdk_scsi_dev_allocate_io_channels(struct spdk_scsi_dev *dev) { int i, rc; for (i = 0; i < SPDK_SCSI_DEV_MAX_LUN; i++) { if (dev->lun[i] == NULL) { continue; } rc = spdk_scsi_lun_allocate_io_channel(dev->lun[i]); if (rc < 0) { spdk_scsi_dev_free_io_channels(dev); return -1; } } return 0; } lib/scsi/lun.c +27 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ #include "scsi_internal.h" #include "spdk/endian.h" #include "spdk/io_channel.h" void spdk_scsi_lun_complete_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *task) Loading Loading @@ -391,3 +392,29 @@ spdk_scsi_lun_delete(const char *lun_name) spdk_scsi_lun_destruct(lun); pthread_mutex_unlock(&g_spdk_scsi.mutex); } int spdk_scsi_lun_allocate_io_channel(struct spdk_scsi_lun *lun) { if (lun->io_channel != NULL) { if (pthread_self() == lun->thread_id) { return 0; } SPDK_ERRLOG("io_channel already allocated for lun %s\n", lun->name); return -1; } lun->io_channel = spdk_bdev_get_io_channel(lun->bdev, SPDK_IO_PRIORITY_DEFAULT); if (lun->io_channel == NULL) { return -1; } lun->thread_id = pthread_self(); return 0; } void spdk_scsi_lun_free_io_channel(struct spdk_scsi_lun *lun) { if (lun->io_channel != NULL) { spdk_put_io_channel(lun->io_channel); lun->io_channel = NULL; } } lib/scsi/scsi_internal.h +2 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,8 @@ int spdk_scsi_lun_claim(struct spdk_scsi_lun *lun); int spdk_scsi_lun_unclaim(struct spdk_scsi_lun *lun); int spdk_scsi_lun_deletable(const char *name); void 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); int spdk_scsi_lun_db_add(struct spdk_scsi_lun *lun); int spdk_scsi_lun_db_delete(struct spdk_scsi_lun *lun); Loading test/lib/scsi/dev/dev_ut.c +11 −0 Original line number Diff line number Diff line Loading @@ -117,6 +117,17 @@ spdk_scsi_lun_execute_tasks(struct spdk_scsi_lun *lun) { } int spdk_scsi_lun_allocate_io_channel(struct spdk_scsi_lun *lun) { return 0; } void spdk_scsi_lun_free_io_channel(struct spdk_scsi_lun *lun) { } static void dev_destruct_null_dev(void) Loading Loading
include/spdk/scsi.h +11 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ #include <stdbool.h> #include <stdint.h> #include <pthread.h> #include <sys/uio.h> #include "spdk/queue.h" Loading Loading @@ -193,6 +194,14 @@ struct spdk_scsi_lun { /** The blockdev associated with this LUN. */ struct spdk_bdev *bdev; /** I/O channel for the blockdev associated with this LUN. */ struct spdk_io_channel *io_channel; /** Thread ID for the thread that allocated the I/O channel for this * LUN. All I/O to this LUN must be performed from this thread. */ pthread_t thread_id; /** Name for this LUN. */ char name[SPDK_SCSI_LUN_MAX_NAME_LENGTH]; Loading @@ -206,6 +215,8 @@ void spdk_scsi_dev_queue_task(struct spdk_scsi_dev *dev, struct spdk_scsi_task * int spdk_scsi_dev_add_port(struct spdk_scsi_dev *dev, uint64_t id, const char *name); struct spdk_scsi_port *spdk_scsi_dev_find_port_by_id(struct spdk_scsi_dev *dev, uint64_t id); void spdk_scsi_dev_print(struct spdk_scsi_dev *dev); int spdk_scsi_dev_allocate_io_channels(struct spdk_scsi_dev *dev); void spdk_scsi_dev_free_io_channels(struct spdk_scsi_dev *dev); /** Loading
lib/scsi/dev.c +31 −0 Original line number Diff line number Diff line Loading @@ -256,3 +256,34 @@ spdk_scsi_dev_print(struct spdk_scsi_dev *dev) } } void spdk_scsi_dev_free_io_channels(struct spdk_scsi_dev *dev) { int i; for (i = 0; i < SPDK_SCSI_DEV_MAX_LUN; i++) { if (dev->lun[i] == NULL) { continue; } spdk_scsi_lun_free_io_channel(dev->lun[i]); } } int spdk_scsi_dev_allocate_io_channels(struct spdk_scsi_dev *dev) { int i, rc; for (i = 0; i < SPDK_SCSI_DEV_MAX_LUN; i++) { if (dev->lun[i] == NULL) { continue; } rc = spdk_scsi_lun_allocate_io_channel(dev->lun[i]); if (rc < 0) { spdk_scsi_dev_free_io_channels(dev); return -1; } } return 0; }
lib/scsi/lun.c +27 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ #include "scsi_internal.h" #include "spdk/endian.h" #include "spdk/io_channel.h" void spdk_scsi_lun_complete_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *task) Loading Loading @@ -391,3 +392,29 @@ spdk_scsi_lun_delete(const char *lun_name) spdk_scsi_lun_destruct(lun); pthread_mutex_unlock(&g_spdk_scsi.mutex); } int spdk_scsi_lun_allocate_io_channel(struct spdk_scsi_lun *lun) { if (lun->io_channel != NULL) { if (pthread_self() == lun->thread_id) { return 0; } SPDK_ERRLOG("io_channel already allocated for lun %s\n", lun->name); return -1; } lun->io_channel = spdk_bdev_get_io_channel(lun->bdev, SPDK_IO_PRIORITY_DEFAULT); if (lun->io_channel == NULL) { return -1; } lun->thread_id = pthread_self(); return 0; } void spdk_scsi_lun_free_io_channel(struct spdk_scsi_lun *lun) { if (lun->io_channel != NULL) { spdk_put_io_channel(lun->io_channel); lun->io_channel = NULL; } }
lib/scsi/scsi_internal.h +2 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,8 @@ int spdk_scsi_lun_claim(struct spdk_scsi_lun *lun); int spdk_scsi_lun_unclaim(struct spdk_scsi_lun *lun); int spdk_scsi_lun_deletable(const char *name); void 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); int spdk_scsi_lun_db_add(struct spdk_scsi_lun *lun); int spdk_scsi_lun_db_delete(struct spdk_scsi_lun *lun); Loading
test/lib/scsi/dev/dev_ut.c +11 −0 Original line number Diff line number Diff line Loading @@ -117,6 +117,17 @@ spdk_scsi_lun_execute_tasks(struct spdk_scsi_lun *lun) { } int spdk_scsi_lun_allocate_io_channel(struct spdk_scsi_lun *lun) { return 0; } void spdk_scsi_lun_free_io_channel(struct spdk_scsi_lun *lun) { } static void dev_destruct_null_dev(void) Loading