bdev/pmem: require name in construct_pmem_bdev RPC
Change-Id: I3cbb52cd9a4201704423b49eae74935b8a33b0fd Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com> Reviewed-on: https://review.gerrithub.io/389903 Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
This commit is contained in:
parent
deb694403f
commit
56f61c8feb
@ -84,7 +84,7 @@ Example:
|
|||||||
~~~
|
~~~
|
||||||
It is possible to create pmem bdev using SPDK RPC:
|
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}
|
## Null {#bdev_config_null}
|
||||||
|
@ -51,8 +51,6 @@ struct pmem_disk {
|
|||||||
|
|
||||||
static TAILQ_HEAD(, pmem_disk) g_pmem_disks = TAILQ_HEAD_INITIALIZER(g_pmem_disks);
|
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 int bdev_pmem_initialize(void);
|
||||||
static void bdev_pmem_finish(void);
|
static void bdev_pmem_finish(void);
|
||||||
|
|
||||||
@ -284,13 +282,20 @@ static const struct spdk_bdev_fn_table pmem_fn_table = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
int
|
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;
|
uint64_t num_blocks;
|
||||||
uint32_t block_size;
|
uint32_t block_size;
|
||||||
struct pmem_disk *pdisk;
|
struct pmem_disk *pdisk;
|
||||||
int rc;
|
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) {
|
if (pmemblk_check(pmem_file, 0) != 1) {
|
||||||
SPDK_ERRLOG("Pool '%s' check failed: %s\n", pmem_file, pmemblk_errormsg());
|
SPDK_ERRLOG("Pool '%s' check failed: %s\n", pmem_file, pmemblk_errormsg());
|
||||||
return EIO;
|
return EIO;
|
||||||
@ -325,12 +330,8 @@ spdk_create_pmem_disk(const char *pmem_file, char *name, struct spdk_bdev **bdev
|
|||||||
free(pdisk);
|
free(pdisk);
|
||||||
return EINVAL;
|
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) {
|
if (!pdisk->disk.name) {
|
||||||
pmemblk_close(pdisk->pool);
|
pmemblk_close(pdisk->pool);
|
||||||
free(pdisk);
|
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";
|
pdisk->disk.product_name = "pmemblk disk";
|
||||||
pmem_disk_count++;
|
|
||||||
|
|
||||||
pdisk->disk.write_cache = 0;
|
pdisk->disk.write_cache = 0;
|
||||||
pdisk->disk.blocklen = block_size;
|
pdisk->disk.blocklen = block_size;
|
||||||
pdisk->disk.blockcnt = num_blocks;
|
pdisk->disk.blockcnt = num_blocks;
|
||||||
|
@ -36,6 +36,6 @@
|
|||||||
|
|
||||||
#include "spdk/bdev.h"
|
#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 */
|
#endif /* SPDK_BDEV_PMEM_H */
|
||||||
|
@ -48,11 +48,12 @@ static void
|
|||||||
free_rpc_construct_pmem_bdev(struct rpc_construct_pmem *req)
|
free_rpc_construct_pmem_bdev(struct rpc_construct_pmem *req)
|
||||||
{
|
{
|
||||||
free(req->pmem_file);
|
free(req->pmem_file);
|
||||||
|
free(req->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct spdk_json_object_decoder rpc_construct_pmem_decoders[] = {
|
static const struct spdk_json_object_decoder rpc_construct_pmem_decoders[] = {
|
||||||
{"pmem_file", offsetof(struct rpc_construct_pmem, pmem_file), spdk_json_decode_string},
|
{"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
|
static void
|
||||||
|
@ -210,14 +210,15 @@ p.set_defaults(func=delete_pmem_pool)
|
|||||||
|
|
||||||
|
|
||||||
def construct_pmem_bdev(args):
|
def construct_pmem_bdev(args):
|
||||||
params = {'pmem_file': args.pmem_file}
|
params = {
|
||||||
if args.name:
|
'pmem_file': args.pmem_file,
|
||||||
params['name'] = args.name
|
'name': args.name
|
||||||
|
}
|
||||||
print_array(jsonrpc_call('construct_pmem_bdev', params))
|
print_array(jsonrpc_call('construct_pmem_bdev', params))
|
||||||
|
|
||||||
p = subparsers.add_parser('construct_pmem_bdev', help='Add a bdev with pmem backend')
|
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('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)
|
p.set_defaults(func=construct_pmem_bdev)
|
||||||
|
|
||||||
def construct_null_bdev(args):
|
def construct_null_bdev(args):
|
||||||
|
@ -45,7 +45,7 @@ for i in `seq 1 $TGT_NR`; do
|
|||||||
luns=""
|
luns=""
|
||||||
for j in `seq 1 $PMEM_PER_TGT`; do
|
for j in `seq 1 $PMEM_PER_TGT`; do
|
||||||
$rpc_py create_pmem_pool /tmp/pool_file${i}_${j} $PMEM_SIZE $PMEM_BLOCK_SIZE
|
$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 "
|
PMEM_BDEVS+="$bdevs_name "
|
||||||
luns+="$bdevs_name:$((j-1)) "
|
luns+="$bdevs_name:$((j-1)) "
|
||||||
done
|
done
|
||||||
|
@ -60,7 +60,7 @@ for i in `seq 1 $SUBSYS_NR`; do
|
|||||||
bdevs=""
|
bdevs=""
|
||||||
for c in `seq 1 $PMEM_PER_SUBSYS`; do
|
for c in `seq 1 $PMEM_PER_SUBSYS`; do
|
||||||
$rpc_py create_pmem_pool /tmp/pool_file${i}_${c} 32 512
|
$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
|
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"
|
$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
|
PMEM_BDEVS+=$bdevs
|
||||||
|
@ -13,6 +13,7 @@ test_all=true
|
|||||||
test_all_get=false
|
test_all_get=false
|
||||||
default_pool_file=$TEST_DIR/test/pmem/pool_file
|
default_pool_file=$TEST_DIR/test/pmem/pool_file
|
||||||
obj_pool_file=$TEST_DIR/test/pmem/obj_pool_file
|
obj_pool_file=$TEST_DIR/test/pmem/obj_pool_file
|
||||||
|
bdev_name=pmem0
|
||||||
|
|
||||||
function usage()
|
function usage()
|
||||||
{
|
{
|
||||||
@ -459,7 +460,7 @@ function construct_pmem_bdev_tc2()
|
|||||||
pmem_clean_pool_file
|
pmem_clean_pool_file
|
||||||
|
|
||||||
pmem_create_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!"
|
error "Created pmem bdev w/out valid pool file!"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -476,7 +477,7 @@ function construct_pmem_bdev_tc3()
|
|||||||
pmem_print_tc_name ${FUNCNAME[0]}
|
pmem_print_tc_name ${FUNCNAME[0]}
|
||||||
|
|
||||||
truncate -s 32M $TEST_DIR/test/pmem/random_file
|
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!"
|
error "Created pmem bdev from random file!"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -501,7 +502,7 @@ function construct_pmem_bdev_tc4()
|
|||||||
truncate -s "32M" $obj_pool_file
|
truncate -s "32M" $obj_pool_file
|
||||||
fi
|
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
|
pmem_clean_pool_file $TEST_DIR/test/pmem/obj_pool_file
|
||||||
error "Created pmem bdev from obj type pmem file!"
|
error "Created pmem bdev from obj type pmem file!"
|
||||||
fi
|
fi
|
||||||
@ -521,7 +522,7 @@ function construct_pmem_bdev_tc5()
|
|||||||
error "Failed to get pmem info!"
|
error "Failed to get pmem info!"
|
||||||
fi
|
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
|
if [ $? != 0 ]; then
|
||||||
error "Failed to create pmem bdev"
|
error "Failed to create pmem bdev"
|
||||||
fi
|
fi
|
||||||
@ -553,7 +554,7 @@ function construct_pmem_bdev_tc6()
|
|||||||
error "Failed to get info on pmem pool file!"
|
error "Failed to get info on pmem pool file!"
|
||||||
fi
|
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
|
if [ $? != 0 ]; then
|
||||||
error "Failed to create pmem bdev!"
|
error "Failed to create pmem bdev!"
|
||||||
fi
|
fi
|
||||||
@ -562,7 +563,7 @@ function construct_pmem_bdev_tc6()
|
|||||||
error "Pmem bdev not found!"
|
error "Pmem bdev not found!"
|
||||||
fi
|
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!"
|
error "Constructed pmem bdev with occupied path!"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -593,7 +594,7 @@ function delete_bdev_tc1()
|
|||||||
error "Failed to get pmem info!"
|
error "Failed to get pmem info!"
|
||||||
fi
|
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
|
if [ $? != 0 ]; then
|
||||||
error "Failed to create pmem bdev!"
|
error "Failed to create pmem bdev!"
|
||||||
fi
|
fi
|
||||||
@ -626,7 +627,7 @@ function delete_bdev_tc2()
|
|||||||
error "Failed to get pmem info!"
|
error "Failed to get pmem info!"
|
||||||
fi
|
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
|
if [ $? != 0 ]; then
|
||||||
error "Failed to create pmem bdev"
|
error "Failed to create pmem bdev"
|
||||||
fi
|
fi
|
||||||
|
@ -50,6 +50,8 @@ struct pmemblk {
|
|||||||
uint8_t *buffer;
|
uint8_t *buffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const char *g_bdev_name = "pmem0";
|
||||||
|
|
||||||
/* PMEMblkpool is a typedef of struct pmemblk */
|
/* PMEMblkpool is a typedef of struct pmemblk */
|
||||||
static PMEMblkpool g_pool_ok = {
|
static PMEMblkpool g_pool_ok = {
|
||||||
.name = "/pools/ok_pool",
|
.name = "/pools/ok_pool",
|
||||||
@ -429,8 +431,14 @@ ut_pmem_open_close(void)
|
|||||||
CU_ASSERT_EQUAL(pools_cnt, g_opened_pools);
|
CU_ASSERT_EQUAL(pools_cnt, g_opened_pools);
|
||||||
CU_ASSERT_NOT_EQUAL(rc, 0);
|
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);
|
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);
|
SPDK_CU_ASSERT_FATAL(bdev != NULL);
|
||||||
CU_ASSERT_TRUE(g_pool_ok.is_open);
|
CU_ASSERT_TRUE(g_pool_ok.is_open);
|
||||||
CU_ASSERT_EQUAL(pools_cnt + 1, g_opened_pools);
|
CU_ASSERT_EQUAL(pools_cnt + 1, g_opened_pools);
|
||||||
@ -461,7 +469,7 @@ ut_pmem_write_read(void)
|
|||||||
{ 0, 4 * g_pool_ok.bsize },
|
{ 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);
|
CU_ASSERT_EQUAL(rc, 0);
|
||||||
|
|
||||||
SPDK_CU_ASSERT_FATAL(g_pool_ok.nblock > 40);
|
SPDK_CU_ASSERT_FATAL(g_pool_ok.nblock > 40);
|
||||||
@ -635,7 +643,7 @@ ut_pmem_reset(void)
|
|||||||
struct spdk_bdev *bdev;
|
struct spdk_bdev *bdev;
|
||||||
int rc;
|
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);
|
CU_ASSERT_EQUAL(rc, 0);
|
||||||
SPDK_CU_ASSERT_FATAL(bdev != NULL);
|
SPDK_CU_ASSERT_FATAL(bdev != NULL);
|
||||||
|
|
||||||
@ -655,7 +663,7 @@ ut_pmem_unmap_write_zero(int16_t io_type)
|
|||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
CU_ASSERT(io_type == SPDK_BDEV_IO_TYPE_UNMAP || io_type == SPDK_BDEV_IO_TYPE_WRITE_ZEROES);
|
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);
|
CU_ASSERT_EQUAL(rc, 0);
|
||||||
SPDK_CU_ASSERT_FATAL(bdev != NULL);
|
SPDK_CU_ASSERT_FATAL(bdev != NULL);
|
||||||
SPDK_CU_ASSERT_FATAL(g_pool_ok.nblock > 40);
|
SPDK_CU_ASSERT_FATAL(g_pool_ok.nblock > 40);
|
||||||
|
Loading…
Reference in New Issue
Block a user