diff --git a/include/spdk/scsi.h b/include/spdk/scsi.h index 6fafd5d0f..c6e4d2363 100644 --- a/include/spdk/scsi.h +++ b/include/spdk/scsi.h @@ -540,6 +540,24 @@ bool spdk_scsi_lun_get_dif_ctx(struct spdk_scsi_lun *lun, uint8_t *cdb, uint32_t */ void spdk_scsi_port_set_iscsi_transport_id(struct spdk_scsi_port *port, char *iscsi_name, uint64_t isid); + +/** + * Convert LUN ID from integer to LUN format + * + * \param lun_id Integer LUN ID + * + * \return LUN format of LUN ID + */ +uint64_t spdk_scsi_lun_id_int_to_fmt(int lun_id); + +/** + * Convert LUN ID from LUN format to integer + * + * \param fmt_lun LUN format of LUN ID + * + * \return integer LUN ID + */ +int spdk_scsi_lun_id_fmt_to_int(uint64_t fmt_lun); #ifdef __cplusplus } #endif diff --git a/lib/scsi/scsi.c b/lib/scsi/scsi.c index 5f7b28bd0..28cb18f02 100644 --- a/lib/scsi/scsi.c +++ b/lib/scsi/scsi.c @@ -66,4 +66,45 @@ SPDK_TRACE_REGISTER_FN(scsi_trace, "scsi", TRACE_GROUP_SCSI) OWNER_SCSI_DEV, OBJECT_SCSI_TASK, 0, 0, ""); } +uint64_t +spdk_scsi_lun_id_int_to_fmt(int lun_id) +{ + uint64_t fmt_lun, method; + + if (SPDK_SCSI_DEV_MAX_LUN <= 0x0100) { + /* below 256 */ + method = 0x00U; + fmt_lun = (method & 0x03U) << 62; + fmt_lun |= ((uint64_t)lun_id & 0x00ffU) << 48; + } else if (SPDK_SCSI_DEV_MAX_LUN <= 0x4000) { + /* below 16384 */ + method = 0x01U; + fmt_lun = (method & 0x03U) << 62; + fmt_lun |= ((uint64_t)lun_id & 0x3fffU) << 48; + } else { + /* XXX */ + fmt_lun = 0; + } + + return fmt_lun; +} + +int +spdk_scsi_lun_id_fmt_to_int(uint64_t fmt_lun) +{ + uint64_t method; + int lun_i; + + method = (fmt_lun >> 62) & 0x03U; + fmt_lun = fmt_lun >> 48; + if (method == 0x00U) { + lun_i = (int)(fmt_lun & 0x00ffU); + } else if (method == 0x01U) { + lun_i = (int)(fmt_lun & 0x3fffU); + } else { + lun_i = 0xffffU; + } + return lun_i; +} + SPDK_LOG_REGISTER_COMPONENT("scsi", SPDK_LOG_SCSI) diff --git a/lib/scsi/scsi_bdev.c b/lib/scsi/scsi_bdev.c index 6b5a9648c..2a4487c62 100644 --- a/lib/scsi/scsi_bdev.c +++ b/lib/scsi/scsi_bdev.c @@ -107,7 +107,7 @@ bdev_scsi_report_luns(struct spdk_scsi_lun *lun, int sel, uint8_t *data, int alloc_len) { struct spdk_scsi_dev *dev; - uint64_t fmt_lun, lun_id, method; + uint64_t fmt_lun; int hlen, len = 0; int i; @@ -143,22 +143,7 @@ bdev_scsi_report_luns(struct spdk_scsi_lun *lun, return -1; } - lun_id = (uint64_t)i; - - if (SPDK_SCSI_DEV_MAX_LUN <= 0x0100) { - /* below 256 */ - method = 0x00U; - fmt_lun = (method & 0x03U) << 62; - fmt_lun |= (lun_id & 0x00ffU) << 48; - } else if (SPDK_SCSI_DEV_MAX_LUN <= 0x4000) { - /* below 16384 */ - method = 0x01U; - fmt_lun = (method & 0x03U) << 62; - fmt_lun |= (lun_id & 0x3fffU) << 48; - } else { - /* XXX */ - fmt_lun = 0; - } + fmt_lun = spdk_scsi_lun_id_int_to_fmt(i); /* LUN */ to_be64(&data[hlen + len], fmt_lun); diff --git a/test/unit/lib/scsi/scsi_bdev.c/scsi_bdev_ut.c b/test/unit/lib/scsi/scsi_bdev.c/scsi_bdev_ut.c index 6ce26192f..b43dbd79e 100644 --- a/test/unit/lib/scsi/scsi_bdev.c/scsi_bdev_ut.c +++ b/test/unit/lib/scsi/scsi_bdev.c/scsi_bdev_ut.c @@ -111,6 +111,8 @@ spdk_scsi_lun_complete_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *ta DEFINE_STUB_V(spdk_scsi_lun_complete_reset_task, (struct spdk_scsi_lun *lun, struct spdk_scsi_task *task)); +DEFINE_STUB(spdk_scsi_lun_id_int_to_fmt, uint64_t, (int lun_id), 0); + static void ut_put_task(struct spdk_scsi_task *task) {