diff --git a/src/bio/bio_device.c b/src/bio/bio_device.c index 196c7b30f11..07deb6c7b10 100644 --- a/src/bio/bio_device.c +++ b/src/bio/bio_device.c @@ -65,6 +65,7 @@ replace_dev(struct bio_xs_context *xs_ctxt, struct smd_dev_info *old_info, struct bio_bdev *old_dev, struct bio_bdev *new_dev) { struct bio_blobstore *bbs = old_dev->bb_blobstore; + struct bio_dev_info *b_info; unsigned int old_roles; int rc; @@ -86,14 +87,23 @@ replace_dev(struct bio_xs_context *xs_ctxt, struct smd_dev_info *old_info, /* Avoid re-enter or being destroyed by hot remove callback */ new_dev->bb_replacing = 1; + b_info = alloc_dev_info(new_dev->bb_uuid, new_dev, NULL); + if (b_info == NULL) { + D_ERROR("Failed to alloc bio_dev_info."); + rc = -DER_NOMEM; + goto out; + } + old_roles = bio_nvme_configured(SMD_DEV_TYPE_META) ? old_dev->bb_roles : NVME_ROLE_DATA; /* Replace old device with new device in SMD */ - rc = smd_dev_replace(old_dev->bb_uuid, new_dev->bb_uuid, old_roles); + rc = smd_dev_replace(old_dev->bb_uuid, new_dev->bb_uuid, old_roles, b_info->bdi_ctrlr); if (rc) { DL_ERROR(rc, "Failed to replace dev: "DF_UUID" -> "DF_UUID". roles(%u)", DP_UUID(old_dev->bb_uuid), DP_UUID(new_dev->bb_uuid), old_roles); + bio_free_dev_info(b_info); goto out; } + bio_free_dev_info(b_info); /* Replace in-memory bio_bdev */ replace_bio_bdev(old_dev, new_dev); @@ -331,40 +341,6 @@ fill_in_traddr(struct bio_dev_info *b_info, char *dev_name) return rc; } -static struct bio_dev_info * -alloc_dev_info(uuid_t dev_id, char *dev_name, struct smd_dev_info *s_info) -{ - struct bio_dev_info *info; - int tgt_cnt = 0, i; - - D_ALLOC_PTR(info); - if (info == NULL) - return NULL; - - if (s_info != NULL) { - tgt_cnt = s_info->sdi_tgt_cnt; - info->bdi_flags |= NVME_DEV_FL_INUSE; - if (s_info->sdi_state == SMD_DEV_FAULTY) - info->bdi_flags |= NVME_DEV_FL_FAULTY; - } - - if (tgt_cnt != 0) { - D_ALLOC_ARRAY(info->bdi_tgts, tgt_cnt); - if (info->bdi_tgts == NULL) { - bio_free_dev_info(info); - return NULL; - } - } - - D_INIT_LIST_HEAD(&info->bdi_link); - uuid_copy(info->bdi_dev_id, dev_id); - info->bdi_tgt_cnt = tgt_cnt; - for (i = 0; i < info->bdi_tgt_cnt; i++) - info->bdi_tgts[i] = s_info->sdi_tgts[i]; - - return info; -} - static struct smd_dev_info * find_smd_dev(uuid_t dev_id, d_list_t *s_dev_list) { @@ -461,7 +437,7 @@ fetch_pci_dev_info(struct nvme_ctrlr_t *w_ctrlr, const char *tr_addr) } static int -alloc_ctrlr_info(uuid_t dev_id, char *dev_name, struct bio_dev_info *b_info) +alloc_ctrlr_info(char *dev_name, struct bio_dev_info *b_info) { struct spdk_bdev *bdev; uint32_t blk_sz; @@ -470,14 +446,7 @@ alloc_ctrlr_info(uuid_t dev_id, char *dev_name, struct bio_dev_info *b_info) D_ASSERT(b_info != NULL); D_ASSERT(b_info->bdi_ctrlr == NULL); - - if (dev_name == NULL) { - D_DEBUG(DB_MGMT, - "missing bdev device name for device " DF_UUID ", skipping ctrlr " - "info fetch\n", - DP_UUID(dev_id)); - return 0; - } + D_ASSERT(dev_name != NULL); bdev = spdk_bdev_get_by_name(dev_name); if (bdev == NULL) { @@ -516,6 +485,95 @@ alloc_ctrlr_info(uuid_t dev_id, char *dev_name, struct bio_dev_info *b_info) return fetch_pci_dev_info(b_info->bdi_ctrlr, b_info->bdi_traddr); } +static int +alloc_ctrlr_from_smd(struct bio_dev_info *b_info, struct smd_dev_info *s_info) +{ + D_ASSERT(b_info != NULL); + D_ASSERT(b_info->bdi_ctrlr == NULL); + + if (s_info->sdi_model == NULL && s_info->sdi_serial == NULL) + return 0; + + D_ALLOC_PTR(b_info->bdi_ctrlr); + if (b_info->bdi_ctrlr == NULL) + return -DER_NOMEM; + + if (s_info->sdi_model) { + D_STRNDUP(b_info->bdi_ctrlr->model, s_info->sdi_model, strlen(s_info->sdi_model)); + if (b_info->bdi_ctrlr->model == NULL) + return -DER_NOMEM; + } + + if (s_info->sdi_serial) { + D_STRNDUP(b_info->bdi_ctrlr->serial, s_info->sdi_serial, + strlen(s_info->sdi_serial)); + if (b_info->bdi_ctrlr->serial == NULL) + return -DER_NOMEM; + } + + return 0; +} + +struct bio_dev_info * +alloc_dev_info(uuid_t dev_id, struct bio_bdev *d_bdev, struct smd_dev_info *s_info) +{ + struct bio_dev_info *info; + int tgt_cnt = 0, i, rc; + + D_ALLOC_PTR(info); + if (info == NULL) + return NULL; + + if (s_info != NULL) { + tgt_cnt = s_info->sdi_tgt_cnt; + info->bdi_flags |= NVME_DEV_FL_INUSE; + if (s_info->sdi_state == SMD_DEV_FAULTY) + info->bdi_flags |= NVME_DEV_FL_FAULTY; + + /* When the device isn't plugged, get ctrlr data from SMD */ + if (d_bdev == NULL || d_bdev->bb_removed) { + rc = alloc_ctrlr_from_smd(info, s_info); + if (rc) { + DL_ERROR(rc, "Failed to get ctrlr data from SMD."); + bio_free_dev_info(info); + return NULL; + } + } + } + + if (tgt_cnt != 0) { + D_ALLOC_ARRAY(info->bdi_tgts, tgt_cnt); + if (info->bdi_tgts == NULL) { + bio_free_dev_info(info); + return NULL; + } + } + + if (d_bdev != NULL) { + info->bdi_dev_roles = d_bdev->bb_roles; + if (!d_bdev->bb_removed) { + info->bdi_flags |= NVME_DEV_FL_PLUGGED; + /* Get ctrlr data when the SSD is plugged */ + rc = alloc_ctrlr_info(d_bdev->bb_name, info); + if (rc) { + DL_ERROR(rc, "Failed to get ctrlr details"); + bio_free_dev_info(info); + return NULL; + } + } + if (d_bdev->bb_faulty) + info->bdi_flags |= NVME_DEV_FL_FAULTY; + } + + D_INIT_LIST_HEAD(&info->bdi_link); + uuid_copy(info->bdi_dev_id, dev_id); + info->bdi_tgt_cnt = tgt_cnt; + for (i = 0; i < info->bdi_tgt_cnt; i++) + info->bdi_tgts[i] = s_info->sdi_tgts[i]; + + return info; +} + int bio_dev_list(struct bio_xs_context *xs_ctxt, d_list_t *dev_list, int *dev_cnt) { @@ -541,28 +599,14 @@ bio_dev_list(struct bio_xs_context *xs_ctxt, d_list_t *dev_list, int *dev_cnt) /* Scan all devices present in bio_bdev list */ d_list_for_each_entry(d_bdev, bio_bdev_list(), bb_link) { - char *dev_name = d_bdev->bb_removed ? NULL : d_bdev->bb_name; - s_info = find_smd_dev(d_bdev->bb_uuid, &s_dev_list); - b_info = alloc_dev_info(d_bdev->bb_uuid, dev_name, s_info); + b_info = alloc_dev_info(d_bdev->bb_uuid, d_bdev, s_info); if (b_info == NULL) { D_ERROR("Failed to allocate device info\n"); rc = -DER_NOMEM; goto out; } - b_info->bdi_dev_roles = d_bdev->bb_roles; - if (!d_bdev->bb_removed) - b_info->bdi_flags |= NVME_DEV_FL_PLUGGED; - if (d_bdev->bb_faulty) - b_info->bdi_flags |= NVME_DEV_FL_FAULTY; - - rc = alloc_ctrlr_info(d_bdev->bb_uuid, dev_name, b_info); - if (rc) { - DL_ERROR(rc, "Failed to get ctrlr details"); - bio_free_dev_info(b_info); - goto out; - } d_list_add_tail(&b_info->bdi_link, dev_list); (*dev_cnt)++; diff --git a/src/bio/bio_internal.h b/src/bio/bio_internal.h index 04cb6f73613..408c02fa297 100644 --- a/src/bio/bio_internal.h +++ b/src/bio/bio_internal.h @@ -656,6 +656,8 @@ void trigger_faulty_reaction(struct bio_blobstore *bbs); /* bio_device.c */ int fill_in_traddr(struct bio_dev_info *b_info, char *dev_name); +struct bio_dev_info * +alloc_dev_info(uuid_t dev_id, struct bio_bdev *d_bdev, struct smd_dev_info *s_info); /* bio_config.c */ int diff --git a/src/bio/bio_xstream.c b/src/bio/bio_xstream.c index 82f8d1335fe..9785e038d31 100644 --- a/src/bio/bio_xstream.c +++ b/src/bio/bio_xstream.c @@ -1250,14 +1250,21 @@ static int assign_roles(struct bio_bdev *d_bdev, unsigned int tgt_id) { enum smd_dev_type st, failed_st; + struct bio_dev_info *b_info; bool assigned = false; int rc; + b_info = alloc_dev_info(d_bdev->bb_uuid, d_bdev, NULL); + if (b_info == NULL) { + D_ERROR("Failed to alloc bio_dev_info."); + return -DER_NOMEM; + } + for (st = SMD_DEV_TYPE_DATA; st < SMD_DEV_TYPE_MAX; st++) { if (!is_role_match(d_bdev->bb_roles, smd_dev_type2role(st))) continue; - rc = smd_dev_add_tgt(d_bdev->bb_uuid, tgt_id, st); + rc = smd_dev_add_tgt(d_bdev->bb_uuid, tgt_id, st, b_info->bdi_ctrlr); if (rc) { D_ERROR("Failed to map dev "DF_UUID" type:%u to tgt %d. "DF_RC"\n", DP_UUID(d_bdev->bb_uuid), st, tgt_id, DP_RC(rc)); @@ -1292,8 +1299,11 @@ assign_roles(struct bio_bdev *d_bdev, unsigned int tgt_id) break; } + bio_free_dev_info(b_info); + return assigned ? 0 : -DER_INVAL; error: + bio_free_dev_info(b_info); for (st = SMD_DEV_TYPE_DATA; st < failed_st; st++) { if (!is_role_match(d_bdev->bb_roles, smd_dev_type2role(st))) continue; @@ -1346,9 +1356,12 @@ assign_xs_bdev(struct bio_xs_context *ctxt, int tgt_id, enum smd_dev_type st, */ d_bdev = lookup_dev_by_id(dev_info->sdi_id); if (d_bdev == NULL) - D_ERROR("Device "DF_UUID" for target %d type %d isn't plugged or the " - "SMD table is stale/corrupted.\n", - DP_UUID(dev_info->sdi_id), tgt_id, st); + ras_notify_eventf(RAS_DEVICE_UNPLUGGED, RAS_TYPE_INFO, RAS_SEV_ERROR, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, + "Device: " DF_UUID " " + "[model:%s, serial:%s] for target:%d type:%d is unplugged\n", + DP_UUID(dev_info->sdi_id), dev_info->sdi_model, + dev_info->sdi_serial, tgt_id, st); smd_dev_free_info(dev_info); return d_bdev; diff --git a/src/bio/smd/smd_device.c b/src/bio/smd/smd_device.c index 7993d538b4c..299b23ab3ea 100644 --- a/src/bio/smd/smd_device.c +++ b/src/bio/smd/smd_device.c @@ -16,10 +16,44 @@ struct smd_device { uint32_t sd_tgts[SMD_MAX_TGT_CNT]; }; +#define SMD_MODEL_MAX_LEN 41 +#define SMD_SERIAL_MAX_LEN 21 + +/* 128 bytes data */ +struct smd_ctrlr_data { + char scd_model[SMD_MODEL_MAX_LEN]; + char scd_serial[SMD_SERIAL_MAX_LEN]; + char scd_reserve[66]; +}; + +static int +set_ctrlr_data(struct d_uuid *id, struct smd_ctrlr_data *ctrlr_data, struct nvme_ctrlr_t *ctrlr) +{ + bool need_update = false; + + if (ctrlr == NULL) + return 0; + + if (!strlen(ctrlr_data->scd_model) && ctrlr->model != NULL) { + strncpy(ctrlr_data->scd_model, ctrlr->model, sizeof(ctrlr_data->scd_model) - 1); + need_update = true; + } + if (!strlen(ctrlr_data->scd_serial) && ctrlr->serial != NULL) { + strncpy(ctrlr_data->scd_serial, ctrlr->serial, sizeof(ctrlr_data->scd_serial) - 1); + need_update = true; + } + + if (!need_update) + return 0; + + return smd_db_upsert(TABLE_CTRLR_DATA, id, sizeof(*id), ctrlr_data, sizeof(*ctrlr_data)); +} + int -smd_dev_add_tgt(uuid_t dev_id, uint32_t tgt_id, enum smd_dev_type st) +smd_dev_add_tgt(uuid_t dev_id, uint32_t tgt_id, enum smd_dev_type st, struct nvme_ctrlr_t *ctrlr) { struct smd_device dev; + struct smd_ctrlr_data ctrlr_data = {0}; struct d_uuid id_org; struct d_uuid id; int rc; @@ -62,6 +96,16 @@ smd_dev_add_tgt(uuid_t dev_id, uint32_t tgt_id, enum smd_dev_type st) goto out; } + if (ctrlr != NULL) { + rc = smd_db_fetch(TABLE_CTRLR_DATA, &id, sizeof(id), &ctrlr_data, + sizeof(ctrlr_data)); + if (rc && rc != -DER_NONEXIST) { + DL_ERROR(rc, "Fetch ctrlr data for dev " DF_UUID " failed.", + DP_UUID(&id.uuid)); + goto out; + } + } + /* Update device and target tables in same transaction */ rc = smd_db_tx_begin(); if (rc) @@ -69,8 +113,7 @@ smd_dev_add_tgt(uuid_t dev_id, uint32_t tgt_id, enum smd_dev_type st) rc = smd_db_upsert(TABLE_DEV, &id, sizeof(id), &dev, sizeof(dev)); if (rc) { - D_ERROR("Fetch dev "DF_UUID" failed. "DF_RC"\n", - DP_UUID(&id.uuid), DP_RC(rc)); + DL_ERROR(rc, "Update dev " DF_UUID " failed.", DP_UUID(&id.uuid)); goto out_tx; } @@ -80,6 +123,13 @@ smd_dev_add_tgt(uuid_t dev_id, uint32_t tgt_id, enum smd_dev_type st) tgt_id, DP_RC(rc)); goto out_tx; } + + rc = set_ctrlr_data(&id, &ctrlr_data, ctrlr); + if (rc) { + DL_ERROR(rc, "Update ctrlr data for dev " DF_UUID " failed.", DP_UUID(&id.uuid)); + goto out_tx; + } + out_tx: rc = smd_db_tx_end(rc); out: @@ -139,7 +189,7 @@ smd_dev_set_state(uuid_t dev_id, enum smd_dev_state state) } static struct smd_dev_info * -smd_dev_alloc_info(struct d_uuid *id, struct smd_device *dev) +smd_dev_alloc_info(struct d_uuid *id, struct smd_device *dev, struct smd_ctrlr_data *ctrlr_data) { struct smd_dev_info *info; int i; @@ -161,6 +211,21 @@ smd_dev_alloc_info(struct d_uuid *id, struct smd_device *dev) for (i = 0; i < info->sdi_tgt_cnt; i++) info->sdi_tgts[i] = dev->sd_tgts[i]; + if (strlen(ctrlr_data->scd_model) != 0) { + D_STRNDUP(info->sdi_model, ctrlr_data->scd_model, strlen(ctrlr_data->scd_model)); + if (info->sdi_model == NULL) { + smd_dev_free_info(info); + return NULL; + } + } + if (strlen(ctrlr_data->scd_serial) != 0) { + D_STRNDUP(info->sdi_serial, ctrlr_data->scd_serial, strlen(ctrlr_data->scd_serial)); + if (info->sdi_serial == NULL) { + smd_dev_free_info(info); + return NULL; + } + } + return info; } @@ -169,6 +234,7 @@ smd_dev_get_info(struct d_uuid *id, struct smd_dev_info **dev_info) { struct smd_dev_info *info; struct smd_device dev; + struct smd_ctrlr_data ctrlr_data = {0}; int rc; rc = smd_db_fetch(TABLE_DEV, id, sizeof(*id), &dev, sizeof(dev)); @@ -178,7 +244,15 @@ smd_dev_get_info(struct d_uuid *id, struct smd_dev_info **dev_info) return rc; } - info = smd_dev_alloc_info(id, &dev); + rc = smd_db_fetch(TABLE_CTRLR_DATA, id, sizeof(*id), &ctrlr_data, sizeof(ctrlr_data)); + if (rc) { + DL_CDEBUG(rc != -DER_NONEXIST, DLOG_ERR, DB_MGMT, rc, + "Fetch ctrlr data for dev " DF_UUID " failed.", DP_UUID(&id->uuid)); + if (rc != -DER_NONEXIST) + return rc; + } + + info = smd_dev_alloc_info(id, &dev, &ctrlr_data); if (info == NULL) return -DER_NOMEM; @@ -224,6 +298,7 @@ smd_dev_list_cb(struct sys_db *db, char *table, d_iov_t *key, void *args) struct smd_trav_data *td = args; struct smd_dev_info *info; struct smd_device dev; + struct smd_ctrlr_data ctrlr_data = {0}; struct d_uuid id; int rc; @@ -233,7 +308,15 @@ smd_dev_list_cb(struct sys_db *db, char *table, d_iov_t *key, void *args) if (rc) return rc; - info = smd_dev_alloc_info(&id, &dev); + rc = smd_db_fetch(TABLE_CTRLR_DATA, &id, sizeof(id), &ctrlr_data, sizeof(ctrlr_data)); + if (rc) { + DL_CDEBUG(rc != -DER_NONEXIST, DLOG_ERR, DB_MGMT, rc, + "Fetch ctrlr data for dev " DF_UUID " failed.", DP_UUID(id.uuid)); + if (rc != -DER_NONEXIST) + return rc; + } + + info = smd_dev_alloc_info(&id, &dev, &ctrlr_data); if (!info) return -DER_NOMEM; @@ -304,12 +387,13 @@ tgt_need_replace(uuid_t old_id, uint32_t tgt_id, unsigned int old_roles, enum sm * 'dmg storage replace' command with same old and new device ID to revive the device. */ int -smd_dev_replace(uuid_t old_id, uuid_t new_id, unsigned int old_roles) +smd_dev_replace(uuid_t old_id, uuid_t new_id, unsigned int old_roles, struct nvme_ctrlr_t *ctrlr) { - struct smd_device dev; - struct d_uuid id; - enum smd_dev_type st; - int i, rc; + struct smd_device dev; + struct smd_ctrlr_data ctrlr_data = {0}; + struct d_uuid id; + enum smd_dev_type st; + int i, rc; D_ASSERT(uuid_compare(old_id, new_id) != 0); @@ -366,6 +450,13 @@ smd_dev_replace(uuid_t old_id, uuid_t new_id, unsigned int old_roles) goto tx_end; } + /* Delete old ctrlr data */ + rc = smd_db_delete(TABLE_CTRLR_DATA, &id, sizeof(id)); + if (rc && rc != -DER_NONEXIST) { + DL_ERROR(rc, "Failed to delete ctrlr data for dev " DF_UUID ".", DP_UUID(&id.uuid)); + goto tx_end; + } + /* Insert new device in device table */ uuid_copy(id.uuid, new_id); /* The replaced device from 'ddb dev_replace' should start with FAULTY state */ @@ -377,6 +468,12 @@ smd_dev_replace(uuid_t old_id, uuid_t new_id, unsigned int old_roles) goto tx_end; } + rc = set_ctrlr_data(&id, &ctrlr_data, ctrlr); + if (rc) { + DL_ERROR(rc, "Update ctrlr data for dev " DF_UUID " failed.", DP_UUID(&id.uuid)); + goto tx_end; + } + /* Replace old device ID with new device ID in target table */ for (i = 0; i < dev.sd_tgt_cnt; i++) { uint32_t tgt_id = dev.sd_tgts[i]; diff --git a/src/bio/smd/smd_internal.h b/src/bio/smd/smd_internal.h index 4195581e40a..a3050ad04a4 100644 --- a/src/bio/smd/smd_internal.h +++ b/src/bio/smd/smd_internal.h @@ -1,5 +1,6 @@ /** * (C) Copyright 2018-2023 Intel Corporation. + * (C) Copyright 2025 Hewlett Packard Enterprise Development LP * * SPDX-License-Identifier: BSD-2-Clause-Patent */ @@ -22,6 +23,7 @@ #define TABLE_DEV "device" #define SMD_DEV_NAME_MAX 16 +#define TABLE_CTRLR_DATA "ctrlr_data" extern char TABLE_TGTS[SMD_DEV_TYPE_MAX][SMD_DEV_NAME_MAX]; diff --git a/src/bio/smd/tests/smd_ut.c b/src/bio/smd/tests/smd_ut.c index b7f264035d8..b66513c4393 100644 --- a/src/bio/smd/tests/smd_ut.c +++ b/src/bio/smd/tests/smd_ut.c @@ -1,5 +1,6 @@ /** * (C) Copyright 2018-2025 Intel Corporation. + * (C) Copyright 2025 Hewlett Packard Enterprise Development LP * * SPDX-License-Identifier: BSD-2-Clause-Patent */ @@ -21,7 +22,8 @@ #include #define SMD_STORAGE_PATH "/mnt/daos" -#define DB_LIST_NR (SMD_DEV_TYPE_MAX * 2 + 2) +/* See db_name2list() */ +#define DB_LIST_NR (SMD_DEV_TYPE_MAX * 2 + 3) struct ut_db { struct sys_db ud_db; @@ -48,12 +50,14 @@ db_name2list(struct sys_db *db, char *name) return &ud->ud_lists[0]; if (!strcmp(name, TABLE_POOLS_EX[SMD_DEV_TYPE_META])) return &ud->ud_lists[1]; + if (!strcmp(name, TABLE_CTRLR_DATA)) + return &ud->ud_lists[2]; for (st = SMD_DEV_TYPE_DATA; st < SMD_DEV_TYPE_MAX; st++) { if (!strcmp(name, TABLE_TGTS[st])) - return &ud->ud_lists[st + 2]; + return &ud->ud_lists[st + 3]; if (!strcmp(name, TABLE_POOLS[st])) - return &ud->ud_lists[st + SMD_DEV_TYPE_MAX + 2]; + return &ud->ud_lists[st + SMD_DEV_TYPE_MAX + 3]; } D_ASSERT(0); return NULL; @@ -266,23 +270,23 @@ ut_device(void **state) uuid_generate(id3); /* Assigned dev1 to target 0, 1, 2, dev2 to target 3. 4. 5 */ - rc = smd_dev_add_tgt(dev_id1, 0, SMD_DEV_TYPE_DATA); + rc = smd_dev_add_tgt(dev_id1, 0, SMD_DEV_TYPE_DATA, NULL); assert_rc_equal(rc, 0); - rc = smd_dev_add_tgt(dev_id1, 0, SMD_DEV_TYPE_DATA); + rc = smd_dev_add_tgt(dev_id1, 0, SMD_DEV_TYPE_DATA, NULL); assert_rc_equal(rc, -DER_EXIST); for (i = 1; i < 3; i++) { - rc = smd_dev_add_tgt(dev_id1, i, SMD_DEV_TYPE_DATA); + rc = smd_dev_add_tgt(dev_id1, i, SMD_DEV_TYPE_DATA, NULL); assert_rc_equal(rc, 0); } - rc = smd_dev_add_tgt(dev_id2, 1, SMD_DEV_TYPE_DATA); + rc = smd_dev_add_tgt(dev_id2, 1, SMD_DEV_TYPE_DATA, NULL); assert_rc_equal(rc, -DER_EXIST); for (i = 3; i < 6; i++) { st = (i < 4) ? SMD_DEV_TYPE_DATA : SMD_DEV_TYPE_DATA + i - 3; - rc = smd_dev_add_tgt(dev_id2, i, st); + rc = smd_dev_add_tgt(dev_id2, i, st, NULL); assert_rc_equal(rc, 0); } @@ -466,18 +470,18 @@ ut_dev_replace(void **state) uuid_generate(dev_id3); /* Replace dev1 with dev3 without marking dev1 as faulty */ - rc = smd_dev_replace(dev_id1, dev_id3, smd_dev_type2role(SMD_DEV_TYPE_DATA)); + rc = smd_dev_replace(dev_id1, dev_id3, smd_dev_type2role(SMD_DEV_TYPE_DATA), NULL); assert_rc_equal(rc, -DER_INVAL); rc = smd_dev_set_state(dev_id1, SMD_DEV_FAULTY); assert_rc_equal(rc, 0); /* Replace dev1 with dev2 */ - rc = smd_dev_replace(dev_id1, dev_id2, smd_dev_type2role(SMD_DEV_TYPE_DATA)); + rc = smd_dev_replace(dev_id1, dev_id2, smd_dev_type2role(SMD_DEV_TYPE_DATA), NULL); assert_rc_equal(rc, -DER_INVAL); /* Replace dev1 with dev3 */ - rc = smd_dev_replace(dev_id1, dev_id3, smd_dev_type2role(SMD_DEV_TYPE_DATA)); + rc = smd_dev_replace(dev_id1, dev_id3, smd_dev_type2role(SMD_DEV_TYPE_DATA), NULL); assert_rc_equal(rc, 0); /* Verify device after replace */ diff --git a/src/include/daos_srv/smd.h b/src/include/daos_srv/smd.h index f6dd8f2499c..dbeea83ecfa 100644 --- a/src/include/daos_srv/smd.h +++ b/src/include/daos_srv/smd.h @@ -1,5 +1,6 @@ /** * (C) Copyright 2016-2025 Intel Corporation. + * (C) Copyright 2025 Hewlett Packard Enterprise Development LP * * SPDX-License-Identifier: BSD-2-Clause-Patent */ @@ -50,6 +51,8 @@ struct smd_dev_info { uuid_t sdi_id; enum smd_dev_state sdi_state; uint32_t sdi_tgt_cnt; + char *sdi_model; + char *sdi_serial; int *sdi_tgts; }; @@ -87,10 +90,13 @@ void smd_fini(void); * \param [IN] dev_id NVMe device ID * \param [IN] tgt_id Target ID * \param [IN] smd_type SMD type + * \param [IN] ctrlr Ctrlr data (optional) * * \return Zero on success, negative value on error */ -int smd_dev_add_tgt(uuid_t dev_id, uint32_t tgt_id, enum smd_dev_type smd_type); +int + smd_dev_add_tgt(uuid_t dev_id, uint32_t tgt_id, enum smd_dev_type smd_type, + struct nvme_ctrlr_t *ctrlr); /** * Unassign a NVMe device from a target (VOS xstream) @@ -148,6 +154,10 @@ static inline void smd_dev_free_info(struct smd_dev_info *dev_info) { if (dev_info->sdi_tgts != NULL) D_FREE(dev_info->sdi_tgts); + if (dev_info->sdi_model != NULL) + D_FREE(dev_info->sdi_model); + if (dev_info->sdi_serial != NULL) + D_FREE(dev_info->sdi_serial); D_FREE(dev_info); } @@ -158,10 +168,12 @@ static inline void smd_dev_free_info(struct smd_dev_info *dev_info) * \param [IN] old_id Old device ID * \param [IN] new_id New device ID * \param [IN] dev_roles Old device roles + * \param [IN] ctrlr Ctrlr data (optional) * * \return Zero on success, negative value on error */ -int smd_dev_replace(uuid_t old_id, uuid_t new_id, unsigned int old_roles); +int +smd_dev_replace(uuid_t old_id, uuid_t new_id, unsigned int old_roles, struct nvme_ctrlr_t *ctrlr); /** * Assign a blob to a VOS pool target diff --git a/src/utils/ddb/ddb_vos.c b/src/utils/ddb/ddb_vos.c index 8e77fc89ddb..5d53e8b3609 100644 --- a/src/utils/ddb/ddb_vos.c +++ b/src/utils/ddb/ddb_vos.c @@ -1759,7 +1759,7 @@ do_sync_cb(uuid_t pool_id, int tgt_id, uint64_t blob_id, enum smd_dev_type st, D_ASSERT(args != NULL); - rc = smd_dev_add_tgt(info->dsi_dev_id, tgt_id, st); + rc = smd_dev_add_tgt(info->dsi_dev_id, tgt_id, st, NULL); smd_dev_set_state(info->dsi_dev_id, SMD_DEV_NORMAL); if (rc == -DER_EXIST) D_INFO("tgt_id(%d) already mapped to dev_id(" DF_UUID ")", tgt_id, @@ -2106,7 +2106,7 @@ dv_dev_replace(const char *db_path, uuid_t old_devid, uuid_t new_devid) } /* Specify 'roles' as 0 */ - rc = smd_dev_replace(old_devid, new_devid, 0); + rc = smd_dev_replace(old_devid, new_devid, 0, new_dev_info->bdi_ctrlr); if (rc) DL_ERROR(rc, "Failed to replace device in SMD"); out: