diff --git a/doc/bdev.md b/doc/bdev.md index 41e0141ac..87af91d00 100644 --- a/doc/bdev.md +++ b/doc/bdev.md @@ -84,7 +84,7 @@ Example: ~~~ It is possible to create pmem bdev using SPDK RPC: ~~~ -./scripts/rpc.py construct_pmem_bdev /path/to/pmem_pool +./scripts/rpc.py construct_pmem_bdev -n bdev_name /path/to/pmem_pool ~~~ ## Null {#bdev_config_null} diff --git a/lib/bdev/pmem/bdev_pmem.c b/lib/bdev/pmem/bdev_pmem.c index 3aa334268..862343608 100644 --- a/lib/bdev/pmem/bdev_pmem.c +++ b/lib/bdev/pmem/bdev_pmem.c @@ -51,8 +51,6 @@ struct pmem_disk { static TAILQ_HEAD(, pmem_disk) g_pmem_disks = TAILQ_HEAD_INITIALIZER(g_pmem_disks); -static int pmem_disk_count = 0; - static int bdev_pmem_initialize(void); static void bdev_pmem_finish(void); @@ -284,13 +282,20 @@ static const struct spdk_bdev_fn_table pmem_fn_table = { }; int -spdk_create_pmem_disk(const char *pmem_file, char *name, struct spdk_bdev **bdev) +spdk_create_pmem_disk(const char *pmem_file, const char *name, struct spdk_bdev **bdev) { uint64_t num_blocks; uint32_t block_size; struct pmem_disk *pdisk; int rc; + *bdev = NULL; + + if (name == NULL) { + SPDK_ERRLOG("Missing name parameter for spdk_create_pmem_disk()\n"); + return EINVAL; + } + if (pmemblk_check(pmem_file, 0) != 1) { SPDK_ERRLOG("Pool '%s' check failed: %s\n", pmem_file, pmemblk_errormsg()); return EIO; @@ -325,12 +330,8 @@ spdk_create_pmem_disk(const char *pmem_file, char *name, struct spdk_bdev **bdev free(pdisk); return EINVAL; } - if (name) { - pdisk->disk.name = spdk_sprintf_alloc("%s", name); - } else { - pdisk->disk.name = spdk_sprintf_alloc("pmem%d", pmem_disk_count); - } + pdisk->disk.name = strdup(name); if (!pdisk->disk.name) { pmemblk_close(pdisk->pool); free(pdisk); @@ -338,8 +339,6 @@ spdk_create_pmem_disk(const char *pmem_file, char *name, struct spdk_bdev **bdev } pdisk->disk.product_name = "pmemblk disk"; - pmem_disk_count++; - pdisk->disk.write_cache = 0; pdisk->disk.blocklen = block_size; pdisk->disk.blockcnt = num_blocks; diff --git a/lib/bdev/pmem/bdev_pmem.h b/lib/bdev/pmem/bdev_pmem.h index 9ce602143..9011dacaf 100644 --- a/lib/bdev/pmem/bdev_pmem.h +++ b/lib/bdev/pmem/bdev_pmem.h @@ -36,6 +36,6 @@ #include "spdk/bdev.h" -int spdk_create_pmem_disk(const char *pmem_file, char *name, struct spdk_bdev **bdev); +int spdk_create_pmem_disk(const char *pmem_file, const char *name, struct spdk_bdev **bdev); #endif /* SPDK_BDEV_PMEM_H */ diff --git a/lib/bdev/pmem/bdev_pmem_rpc.c b/lib/bdev/pmem/bdev_pmem_rpc.c index f2f040245..ad3acf8e6 100644 --- a/lib/bdev/pmem/bdev_pmem_rpc.c +++ b/lib/bdev/pmem/bdev_pmem_rpc.c @@ -48,11 +48,12 @@ static void free_rpc_construct_pmem_bdev(struct rpc_construct_pmem *req) { free(req->pmem_file); + free(req->name); } static const struct spdk_json_object_decoder rpc_construct_pmem_decoders[] = { {"pmem_file", offsetof(struct rpc_construct_pmem, pmem_file), spdk_json_decode_string}, - {"name", offsetof(struct rpc_construct_pmem, name), spdk_json_decode_string, true}, + {"name", offsetof(struct rpc_construct_pmem, name), spdk_json_decode_string}, }; static void diff --git a/scripts/rpc.py b/scripts/rpc.py index 18e7e2a99..d6bc832f0 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -210,14 +210,15 @@ p.set_defaults(func=delete_pmem_pool) def construct_pmem_bdev(args): - params = {'pmem_file': args.pmem_file} - if args.name: - params['name'] = args.name + params = { + 'pmem_file': args.pmem_file, + 'name': args.name + } print_array(jsonrpc_call('construct_pmem_bdev', params)) p = subparsers.add_parser('construct_pmem_bdev', help='Add a bdev with pmem backend') p.add_argument('pmem_file', help='Path to pmemblk pool file') -p.add_argument('-n', '--name', help='Block device name', required=False) +p.add_argument('-n', '--name', help='Block device name', required=True) p.set_defaults(func=construct_pmem_bdev) def construct_null_bdev(args): diff --git a/test/iscsi_tgt/pmem/iscsi_pmem.sh b/test/iscsi_tgt/pmem/iscsi_pmem.sh index 7a910f13b..0261e47b1 100755 --- a/test/iscsi_tgt/pmem/iscsi_pmem.sh +++ b/test/iscsi_tgt/pmem/iscsi_pmem.sh @@ -45,7 +45,7 @@ for i in `seq 1 $TGT_NR`; do luns="" for j in `seq 1 $PMEM_PER_TGT`; do $rpc_py create_pmem_pool /tmp/pool_file${i}_${j} $PMEM_SIZE $PMEM_BLOCK_SIZE - bdevs_name="$($rpc_py construct_pmem_bdev /tmp/pool_file${i}_${j})" + bdevs_name="$($rpc_py construct_pmem_bdev -n pmem${i}_${j} /tmp/pool_file${i}_${j})" PMEM_BDEVS+="$bdevs_name " luns+="$bdevs_name:$((j-1)) " done diff --git a/test/nvmf/pmem/nvmf_pmem.sh b/test/nvmf/pmem/nvmf_pmem.sh index 160510d29..a460f2b54 100755 --- a/test/nvmf/pmem/nvmf_pmem.sh +++ b/test/nvmf/pmem/nvmf_pmem.sh @@ -60,7 +60,7 @@ for i in `seq 1 $SUBSYS_NR`; do bdevs="" for c in `seq 1 $PMEM_PER_SUBSYS`; do $rpc_py create_pmem_pool /tmp/pool_file${i}_${c} 32 512 - bdevs+="$($rpc_py construct_pmem_bdev /tmp/pool_file${i}_${c}) " + bdevs+="$($rpc_py construct_pmem_bdev -n pmem${i}_${c} /tmp/pool_file${i}_${c}) " done $rpc_py construct_nvmf_subsystem nqn.2016-06.io.spdk:cnode$i "trtype:RDMA traddr:$NVMF_FIRST_TARGET_IP trsvcid:$NVMF_PORT" '' -a -s SPDK$i -n "$bdevs" PMEM_BDEVS+=$bdevs diff --git a/test/pmem/pmem.sh b/test/pmem/pmem.sh index 7c73997bd..2768cfe12 100755 --- a/test/pmem/pmem.sh +++ b/test/pmem/pmem.sh @@ -13,6 +13,7 @@ test_all=true test_all_get=false default_pool_file=$TEST_DIR/test/pmem/pool_file obj_pool_file=$TEST_DIR/test/pmem/obj_pool_file +bdev_name=pmem0 function usage() { @@ -459,7 +460,7 @@ function construct_pmem_bdev_tc2() pmem_clean_pool_file pmem_create_pool_file - if $rpc_py construct_pmem_bdev $TEST_DIR/non/existing/path/non_existent_file; then + if $rpc_py construct_pmem_bdev -n $bdev_name $TEST_DIR/non/existing/path/non_existent_file; then error "Created pmem bdev w/out valid pool file!" fi @@ -476,7 +477,7 @@ function construct_pmem_bdev_tc3() pmem_print_tc_name ${FUNCNAME[0]} truncate -s 32M $TEST_DIR/test/pmem/random_file - if $rpc_py construct_pmem_bdev $TEST_DIR/test/pmem/random_file; then + if $rpc_py construct_pmem_bdev -n $bdev_name $TEST_DIR/test/pmem/random_file; then error "Created pmem bdev from random file!" fi @@ -501,7 +502,7 @@ function construct_pmem_bdev_tc4() truncate -s "32M" $obj_pool_file fi - if $rpc_py construct_pmem_bdev $TEST_DIR/test/pmem/obj_pool_file; then + if $rpc_py construct_pmem_bdev -n $bdev_name $TEST_DIR/test/pmem/obj_pool_file; then pmem_clean_pool_file $TEST_DIR/test/pmem/obj_pool_file error "Created pmem bdev from obj type pmem file!" fi @@ -521,7 +522,7 @@ function construct_pmem_bdev_tc5() error "Failed to get pmem info!" fi - pmem_bdev_name=$($rpc_py construct_pmem_bdev $default_pool_file) + pmem_bdev_name=$($rpc_py construct_pmem_bdev -n $bdev_name $default_pool_file) if [ $? != 0 ]; then error "Failed to create pmem bdev" fi @@ -553,7 +554,7 @@ function construct_pmem_bdev_tc6() error "Failed to get info on pmem pool file!" fi - pmem_bdev_name=$($rpc_py construct_pmem_bdev $default_pool_file) + pmem_bdev_name=$($rpc_py construct_pmem_bdev -n $bdev_name $default_pool_file) if [ $? != 0 ]; then error "Failed to create pmem bdev!" fi @@ -562,7 +563,7 @@ function construct_pmem_bdev_tc6() error "Pmem bdev not found!" fi - if $rpc_py construct_pmem_bdev $default_pool_file; then + if $rpc_py construct_pmem_bdev -n $bdev_name $default_pool_file; then error "Constructed pmem bdev with occupied path!" fi @@ -593,7 +594,7 @@ function delete_bdev_tc1() error "Failed to get pmem info!" fi - pmem_bdev_name=$($rpc_py construct_pmem_bdev $default_pool_file) + pmem_bdev_name=$($rpc_py construct_pmem_bdev -n $bdev_name $default_pool_file) if [ $? != 0 ]; then error "Failed to create pmem bdev!" fi @@ -626,7 +627,7 @@ function delete_bdev_tc2() error "Failed to get pmem info!" fi - pmem_bdev_name=$($rpc_py construct_pmem_bdev $default_pool_file) + pmem_bdev_name=$($rpc_py construct_pmem_bdev -n $bdev_name $default_pool_file) if [ $? != 0 ]; then error "Failed to create pmem bdev" fi diff --git a/test/unit/lib/bdev/pmem/bdev_pmem_ut.c b/test/unit/lib/bdev/pmem/bdev_pmem_ut.c index a5d706f94..c8d0986df 100644 --- a/test/unit/lib/bdev/pmem/bdev_pmem_ut.c +++ b/test/unit/lib/bdev/pmem/bdev_pmem_ut.c @@ -50,6 +50,8 @@ struct pmemblk { uint8_t *buffer; }; +static const char *g_bdev_name = "pmem0"; + /* PMEMblkpool is a typedef of struct pmemblk */ static PMEMblkpool g_pool_ok = { .name = "/pools/ok_pool", @@ -429,8 +431,14 @@ ut_pmem_open_close(void) CU_ASSERT_EQUAL(pools_cnt, g_opened_pools); CU_ASSERT_NOT_EQUAL(rc, 0); - /* Open good pool */ + /* Open pool with NULL name */ rc = spdk_create_pmem_disk(g_pool_ok.name, NULL, &bdev); + CU_ASSERT_PTR_NULL(bdev); + CU_ASSERT_EQUAL(pools_cnt, g_opened_pools); + CU_ASSERT_NOT_EQUAL(rc, 0); + + /* Open good pool */ + rc = spdk_create_pmem_disk(g_pool_ok.name, g_bdev_name, &bdev); SPDK_CU_ASSERT_FATAL(bdev != NULL); CU_ASSERT_TRUE(g_pool_ok.is_open); CU_ASSERT_EQUAL(pools_cnt + 1, g_opened_pools); @@ -461,7 +469,7 @@ ut_pmem_write_read(void) { 0, 4 * g_pool_ok.bsize }, }; - rc = spdk_create_pmem_disk(g_pool_ok.name, NULL, &bdev); + rc = spdk_create_pmem_disk(g_pool_ok.name, g_bdev_name, &bdev); CU_ASSERT_EQUAL(rc, 0); SPDK_CU_ASSERT_FATAL(g_pool_ok.nblock > 40); @@ -635,7 +643,7 @@ ut_pmem_reset(void) struct spdk_bdev *bdev; int rc; - rc = spdk_create_pmem_disk(g_pool_ok.name, NULL, &bdev); + rc = spdk_create_pmem_disk(g_pool_ok.name, g_bdev_name, &bdev); CU_ASSERT_EQUAL(rc, 0); SPDK_CU_ASSERT_FATAL(bdev != NULL); @@ -655,7 +663,7 @@ ut_pmem_unmap_write_zero(int16_t io_type) int rc; CU_ASSERT(io_type == SPDK_BDEV_IO_TYPE_UNMAP || io_type == SPDK_BDEV_IO_TYPE_WRITE_ZEROES); - rc = spdk_create_pmem_disk(g_pool_ok.name, NULL, &bdev); + rc = spdk_create_pmem_disk(g_pool_ok.name, g_bdev_name, &bdev); CU_ASSERT_EQUAL(rc, 0); SPDK_CU_ASSERT_FATAL(bdev != NULL); SPDK_CU_ASSERT_FATAL(g_pool_ok.nblock > 40);