diff --git a/examples/nvme/nvme_manage/nvme_manage.c b/examples/nvme/nvme_manage/nvme_manage.c index ead1b3635..982ca575f 100644 --- a/examples/nvme/nvme_manage/nvme_manage.c +++ b/examples/nvme/nvme_manage/nvme_manage.c @@ -1026,6 +1026,7 @@ opal_init(struct dev *iter) ret = spdk_opal_cmd_activate_locking_sp(iter->opal_dev, passwd_p); if (ret) { printf("Locking SP activate failure: %d\n", ret); + spdk_opal_close(iter->opal_dev); return; } printf("...\nOpal Init Success\n"); @@ -1076,16 +1077,22 @@ opal_setup_lockingrange(struct dev *iter) printf("Specify locking range id:\n"); if (!scanf("%d", &locking_range_id)) { printf("Invalid locking range id\n"); + spdk_opal_close(iter->opal_dev); + return; } printf("range length:\n"); if (!scanf("%" SCNu64, &range_length)) { printf("Invalid range length\n"); + spdk_opal_close(iter->opal_dev); + return; } printf("range start:\n"); if (!scanf("%" SCNu64, &range_start)) { printf("Invalid range start address\n"); + spdk_opal_close(iter->opal_dev); + return; } while (getchar() != '\n'); @@ -1093,6 +1100,7 @@ opal_setup_lockingrange(struct dev *iter) OPAL_ADMIN1, locking_range_id, range_start, range_length, passwd_p); if (ret) { printf("Setup locking range failure: %d\n", ret); + spdk_opal_close(iter->opal_dev); return; } @@ -1100,6 +1108,7 @@ opal_setup_lockingrange(struct dev *iter) passwd_p, OPAL_ADMIN1, locking_range_id); if (ret) { printf("Get locking range info failure: %d\n", ret); + spdk_opal_close(iter->opal_dev); return; } info = spdk_opal_get_locking_range_info(iter->opal_dev, locking_range_id); @@ -1149,6 +1158,7 @@ opal_list_locking_ranges(struct dev *iter) ret = spdk_opal_cmd_get_max_ranges(iter->opal_dev, passwd_p); if (ret) { printf("get max ranges failure: %d\n", ret); + spdk_opal_close(iter->opal_dev); return; } @@ -1158,6 +1168,7 @@ opal_list_locking_ranges(struct dev *iter) passwd_p, OPAL_ADMIN1, i); if (ret) { printf("Get locking range info failure: %d\n", ret); + spdk_opal_close(iter->opal_dev); return; } info = spdk_opal_get_locking_range_info(iter->opal_dev, i); @@ -1350,6 +1361,7 @@ opal_add_user_to_locking_range(struct dev *iter) passwd_p); if (ret) { printf("Add user to locking range error: %d\n", ret); + spdk_opal_close(iter->opal_dev); return; } @@ -1418,6 +1430,7 @@ opal_user_lock_unlock_range(struct dev *iter) break; default: printf("Invalid options\n"); + spdk_opal_close(iter->opal_dev); return; } while (getchar() != '\n'); @@ -1426,6 +1439,7 @@ opal_user_lock_unlock_range(struct dev *iter) locking_range_id, passwd_p); if (ret) { printf("lock/unlock range failure: %d\n", ret); + spdk_opal_close(iter->opal_dev); return; } printf("...\n...\nLock/unlock range Success\n"); diff --git a/lib/nvme/nvme_opal.c b/lib/nvme/nvme_opal.c index 98477a8c9..6f31fd3b6 100644 --- a/lib/nvme/nvme_opal.c +++ b/lib/nvme/nvme_opal.c @@ -952,6 +952,11 @@ void spdk_opal_close(struct spdk_opal_dev *dev) { pthread_mutex_destroy(&dev->mutex_lock); + if (dev->max_ranges > 0) { + for (int i = 0; i < dev->max_ranges; i++) { + free(dev->locking_range_info[i]); + } + } free(dev->opal_info); free(dev); }