blobstore,ut: explicitly allocate spdk_bs_dev

Explicitly allocating spdk_bs_dev on init_dev() allows to check if dev_destroy for it was called.
If it was not, then ASAN will provide information on that.

Signed-off-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Change-Id: I333185958dd8c29180954077a6c326b82e5949ae
Reviewed-on: https://review.gerrithub.io/374766
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Tomasz Zawadzki 2017-08-02 15:30:22 +02:00 committed by Jim Harris
parent 3d8e67d71f
commit 70eff4fbb0
4 changed files with 107 additions and 89 deletions

View File

@ -70,12 +70,12 @@ static void
fs_init(void)
{
struct spdk_filesystem *fs;
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
init_dev(&dev);
dev = init_dev();
spdk_allocate_thread(_fs_send_msg, NULL);
spdk_fs_init(&dev, NULL, fs_op_with_handle_complete, NULL);
spdk_fs_init(dev, NULL, fs_op_with_handle_complete, NULL);
CU_ASSERT(g_fs != NULL);
CU_ASSERT(g_fserrno == 0);
fs = g_fs;
@ -111,15 +111,15 @@ fs_open(void)
{
struct spdk_filesystem *fs;
spdk_fs_iter iter;
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
struct spdk_file *file;
char name[257] = {'\0'};
init_dev(&dev);
dev = init_dev();
memset(name, 'a', sizeof(name) - 1);
spdk_allocate_thread(_fs_send_msg, NULL);
spdk_fs_init(&dev, NULL, fs_op_with_handle_complete, NULL);
spdk_fs_init(dev, NULL, fs_op_with_handle_complete, NULL);
CU_ASSERT(g_fs != NULL);
CU_ASSERT(g_fserrno == 0);
fs = g_fs;
@ -181,14 +181,14 @@ static void
fs_create(void)
{
struct spdk_filesystem *fs;
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
char name[257] = {'\0'};
init_dev(&dev);
dev = init_dev();
memset(name, 'a', sizeof(name) - 1);
spdk_allocate_thread(_fs_send_msg, NULL);
spdk_fs_init(&dev, NULL, fs_op_with_handle_complete, NULL);
spdk_fs_init(dev, NULL, fs_op_with_handle_complete, NULL);
SPDK_CU_ASSERT_FATAL(g_fs != NULL);
CU_ASSERT(g_fserrno == 0);
fs = g_fs;
@ -222,12 +222,12 @@ static void
fs_truncate(void)
{
struct spdk_filesystem *fs;
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
init_dev(&dev);
dev = init_dev();
spdk_allocate_thread(_fs_send_msg, NULL);
spdk_fs_init(&dev, NULL, fs_op_with_handle_complete, NULL);
spdk_fs_init(dev, NULL, fs_op_with_handle_complete, NULL);
SPDK_CU_ASSERT_FATAL(g_fs != NULL);
CU_ASSERT(g_fserrno == 0);
fs = g_fs;
@ -275,12 +275,12 @@ fs_rename(void)
{
struct spdk_filesystem *fs;
struct spdk_file *file, *file2;
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
init_dev(&dev);
dev = init_dev();
spdk_allocate_thread(_fs_send_msg, NULL);
spdk_fs_init(&dev, NULL, fs_op_with_handle_complete, NULL);
spdk_fs_init(dev, NULL, fs_op_with_handle_complete, NULL);
SPDK_CU_ASSERT_FATAL(g_fs != NULL);
CU_ASSERT(g_fserrno == 0);
fs = g_fs;
@ -427,13 +427,13 @@ static void
channel_ops(void)
{
struct spdk_filesystem *fs;
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
struct spdk_io_channel *channel;
init_dev(&dev);
dev = init_dev();
spdk_allocate_thread(_fs_send_msg, NULL);
spdk_fs_init(&dev, NULL, fs_op_with_handle_complete, NULL);
spdk_fs_init(dev, NULL, fs_op_with_handle_complete, NULL);
SPDK_CU_ASSERT_FATAL(g_fs != NULL);
CU_ASSERT(g_fserrno == 0);
fs = g_fs;
@ -455,13 +455,13 @@ static void
channel_ops_sync(void)
{
struct spdk_filesystem *fs;
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
struct spdk_io_channel *channel;
init_dev(&dev);
dev = init_dev();
spdk_allocate_thread(_fs_send_msg, NULL);
spdk_fs_init(&dev, NULL, fs_op_with_handle_complete, NULL);
spdk_fs_init(dev, NULL, fs_op_with_handle_complete, NULL);
SPDK_CU_ASSERT_FATAL(g_fs != NULL);
CU_ASSERT(g_fserrno == 0);
fs = g_fs;

View File

@ -49,8 +49,6 @@ struct spdk_filesystem *g_fs;
struct spdk_file *g_file;
int g_fserrno;
struct spdk_bs_dev g_dev;
static void
_fs_send_msg(spdk_thread_fn fn, void *ctx, void *thread_ctx)
{
@ -131,9 +129,12 @@ fs_op_with_handle_complete(void *ctx, struct spdk_filesystem *fs, int fserrno)
static void
_fs_init(void *arg)
{
struct spdk_bs_dev *dev;
g_fs = NULL;
g_fserrno = -1;
spdk_fs_init(&g_dev, send_request, fs_op_with_handle_complete, NULL);
dev = init_dev();
spdk_fs_init(dev, send_request, fs_op_with_handle_complete, NULL);
SPDK_CU_ASSERT_FATAL(g_fs != NULL);
CU_ASSERT(g_fserrno == 0);
}
@ -342,7 +343,6 @@ int main(int argc, char **argv)
return CU_get_error();
}
init_dev(&g_dev);
pthread_create(&spdk_tid, NULL, spdk_thread, NULL);
g_dev_buffer = calloc(1, DEV_BUFFER_SIZE);
CU_basic_set_mode(CU_BRM_VERBOSE);

View File

@ -91,17 +91,24 @@ blob_op_with_handle_complete(void *cb_arg, struct spdk_blob *blb, int bserrno)
static void
blob_init(void)
{
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
init_dev(&dev);
dev = init_dev();
/* should fail for an unsupported blocklen */
dev.blocklen = 500;
spdk_bs_init(&dev, NULL, bs_op_with_handle_complete, NULL);
dev->blocklen = 500;
spdk_bs_init(dev, NULL, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno == -EINVAL);
/*
* Normally dev gets deleted as part of the dev->destroy callback. But
* that doesn't get invoked when init() fails. So manually free it here
* instead. Probably blobstore should still destroy the dev when init
* fails, but we'll do that in a separate patch.
*/
free(dev);
init_dev(&dev);
spdk_bs_init(&dev, NULL, bs_op_with_handle_complete, NULL);
dev = init_dev();
spdk_bs_init(dev, NULL, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno == 0);
SPDK_CU_ASSERT_FATAL(g_bs != NULL);
@ -114,12 +121,12 @@ static void
blob_super(void)
{
struct spdk_blob_store *bs;
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
spdk_blob_id blobid;
init_dev(&dev);
dev = init_dev();
spdk_bs_init(&dev, NULL, bs_op_with_handle_complete, NULL);
spdk_bs_init(dev, NULL, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno == 0);
SPDK_CU_ASSERT_FATAL(g_bs != NULL);
bs = g_bs;
@ -154,13 +161,13 @@ static void
blob_open(void)
{
struct spdk_blob_store *bs;
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
struct spdk_blob *blob;
spdk_blob_id blobid, blobid2;
init_dev(&dev);
dev = init_dev();
spdk_bs_init(&dev, NULL, bs_op_with_handle_complete, NULL);
spdk_bs_init(dev, NULL, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno == 0);
SPDK_CU_ASSERT_FATAL(g_bs != NULL);
bs = g_bs;
@ -216,12 +223,12 @@ static void
blob_delete(void)
{
struct spdk_blob_store *bs;
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
spdk_blob_id blobid;
init_dev(&dev);
dev = init_dev();
spdk_bs_init(&dev, NULL, bs_op_with_handle_complete, NULL);
spdk_bs_init(dev, NULL, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno == 0);
SPDK_CU_ASSERT_FATAL(g_bs != NULL);
bs = g_bs;
@ -248,15 +255,15 @@ static void
blob_resize(void)
{
struct spdk_blob_store *bs;
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
struct spdk_blob *blob;
spdk_blob_id blobid;
uint64_t free_clusters;
int rc;
init_dev(&dev);
dev = init_dev();
spdk_bs_init(&dev, NULL, bs_op_with_handle_complete, NULL);
spdk_bs_init(dev, NULL, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno == 0);
SPDK_CU_ASSERT_FATAL(g_bs != NULL);
bs = g_bs;
@ -311,12 +318,12 @@ static void
channel_ops(void)
{
struct spdk_blob_store *bs;
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
struct spdk_io_channel *channel;
init_dev(&dev);
dev = init_dev();
spdk_bs_init(&dev, NULL, bs_op_with_handle_complete, NULL);
spdk_bs_init(dev, NULL, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno == 0);
SPDK_CU_ASSERT_FATAL(g_bs != NULL);
bs = g_bs;
@ -335,7 +342,7 @@ static void
blob_write(void)
{
struct spdk_blob_store *bs;
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
struct spdk_blob *blob;
struct spdk_io_channel *channel;
spdk_blob_id blobid;
@ -343,9 +350,9 @@ blob_write(void)
uint8_t payload[10 * 4096];
int rc;
init_dev(&dev);
dev = init_dev();
spdk_bs_init(&dev, NULL, bs_op_with_handle_complete, NULL);
spdk_bs_init(dev, NULL, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno == 0);
SPDK_CU_ASSERT_FATAL(g_bs != NULL);
bs = g_bs;
@ -401,7 +408,7 @@ static void
blob_read(void)
{
struct spdk_blob_store *bs;
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
struct spdk_blob *blob;
struct spdk_io_channel *channel;
spdk_blob_id blobid;
@ -409,9 +416,9 @@ blob_read(void)
uint8_t payload[10 * 4096];
int rc;
init_dev(&dev);
dev = init_dev();
spdk_bs_init(&dev, NULL, bs_op_with_handle_complete, NULL);
spdk_bs_init(dev, NULL, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno == 0);
SPDK_CU_ASSERT_FATAL(g_bs != NULL);
bs = g_bs;
@ -467,7 +474,7 @@ static void
blob_rw_verify(void)
{
struct spdk_blob_store *bs;
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
struct spdk_blob *blob;
struct spdk_io_channel *channel;
spdk_blob_id blobid;
@ -475,9 +482,9 @@ blob_rw_verify(void)
uint8_t payload_write[10 * 4096];
int rc;
init_dev(&dev);
dev = init_dev();
spdk_bs_init(&dev, NULL, bs_op_with_handle_complete, NULL);
spdk_bs_init(dev, NULL, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno == 0);
SPDK_CU_ASSERT_FATAL(g_bs != NULL);
bs = g_bs;
@ -521,7 +528,7 @@ static void
blob_rw_verify_iov(void)
{
struct spdk_blob_store *bs;
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
struct spdk_blob *blob;
struct spdk_io_channel *channel;
spdk_blob_id blobid;
@ -532,10 +539,10 @@ blob_rw_verify_iov(void)
void *buf;
int rc;
init_dev(&dev);
dev = init_dev();
memset(g_dev_buffer, 0, DEV_BUFFER_SIZE);
spdk_bs_init(&dev, NULL, bs_op_with_handle_complete, NULL);
spdk_bs_init(dev, NULL, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno == 0);
SPDK_CU_ASSERT_FATAL(g_bs != NULL);
bs = g_bs;
@ -624,7 +631,7 @@ static void
blob_rw_verify_iov_nomem(void)
{
struct spdk_blob_store *bs;
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
struct spdk_blob *blob;
struct spdk_io_channel *channel;
spdk_blob_id blobid;
@ -633,10 +640,10 @@ blob_rw_verify_iov_nomem(void)
uint32_t req_count;
int rc;
init_dev(&dev);
dev = init_dev();
memset(g_dev_buffer, 0, DEV_BUFFER_SIZE);
spdk_bs_init(&dev, NULL, bs_op_with_handle_complete, NULL);
spdk_bs_init(dev, NULL, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno == 0);
SPDK_CU_ASSERT_FATAL(g_bs != NULL);
bs = g_bs;
@ -688,13 +695,13 @@ static void
blob_iter(void)
{
struct spdk_blob_store *bs;
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
struct spdk_blob *blob;
spdk_blob_id blobid;
init_dev(&dev);
dev = init_dev();
spdk_bs_init(&dev, NULL, bs_op_with_handle_complete, NULL);
spdk_bs_init(dev, NULL, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno == 0);
SPDK_CU_ASSERT_FATAL(g_bs != NULL);
bs = g_bs;
@ -727,7 +734,7 @@ static void
blob_xattr(void)
{
struct spdk_blob_store *bs;
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
struct spdk_blob *blob;
spdk_blob_id blobid;
uint64_t length;
@ -737,9 +744,9 @@ blob_xattr(void)
size_t value_len;
struct spdk_xattr_names *names;
init_dev(&dev);
dev = init_dev();
spdk_bs_init(&dev, NULL, bs_op_with_handle_complete, NULL);
spdk_bs_init(dev, NULL, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno == 0);
SPDK_CU_ASSERT_FATAL(g_bs != NULL);
bs = g_bs;
@ -806,7 +813,7 @@ blob_xattr(void)
static void
bs_load(void)
{
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
spdk_blob_id blobid;
struct spdk_blob *blob;
uint64_t length;
@ -814,10 +821,10 @@ bs_load(void)
const void *value;
size_t value_len;
init_dev(&dev);
dev = init_dev();
/* Initialize a new blob store */
spdk_bs_init(&dev, NULL, bs_op_with_handle_complete, NULL);
spdk_bs_init(dev, NULL, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno == 0);
SPDK_CU_ASSERT_FATAL(g_bs != NULL);
@ -857,8 +864,9 @@ bs_load(void)
g_blob = NULL;
g_blobid = 0;
dev = init_dev();
/* Load an existing blob store */
spdk_bs_load(&dev, bs_op_with_handle_complete, NULL);
spdk_bs_load(dev, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno == 0);
SPDK_CU_ASSERT_FATAL(g_bs != NULL);
@ -898,17 +906,17 @@ bs_load(void)
static void
bs_cluster_sz(void)
{
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
struct spdk_bs_opts opts;
uint32_t cluster_sz;
init_dev(&dev);
dev = init_dev();
spdk_bs_opts_init(&opts);
opts.cluster_sz *= 2;
cluster_sz = opts.cluster_sz;
/* Initialize a new blob store */
spdk_bs_init(&dev, &opts, bs_op_with_handle_complete, NULL);
spdk_bs_init(dev, &opts, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno == 0);
SPDK_CU_ASSERT_FATAL(g_bs != NULL);
@ -921,8 +929,9 @@ bs_cluster_sz(void)
g_blob = NULL;
g_blobid = 0;
dev = init_dev();
/* Load an existing blob store */
spdk_bs_load(&dev, bs_op_with_handle_complete, NULL);
spdk_bs_load(dev, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno == 0);
SPDK_CU_ASSERT_FATAL(g_bs != NULL);
@ -944,20 +953,20 @@ bs_resize_md(void)
{
const int CLUSTER_PAGE_COUNT = 4;
const int NUM_BLOBS = CLUSTER_PAGE_COUNT * 4;
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
struct spdk_bs_opts opts;
uint32_t cluster_sz;
spdk_blob_id blobids[NUM_BLOBS];
int i;
init_dev(&dev);
dev = init_dev();
spdk_bs_opts_init(&opts);
opts.cluster_sz = CLUSTER_PAGE_COUNT * 4096;
cluster_sz = opts.cluster_sz;
/* Initialize a new blob store */
spdk_bs_init(&dev, &opts, bs_op_with_handle_complete, NULL);
spdk_bs_init(dev, &opts, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno == 0);
SPDK_CU_ASSERT_FATAL(g_bs != NULL);
@ -981,7 +990,8 @@ bs_resize_md(void)
/* Load an existing blob store */
g_bserrno = -1;
g_bs = NULL;
spdk_bs_load(&dev, bs_op_with_handle_complete, NULL);
dev = init_dev();
spdk_bs_load(dev, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno == 0);
SPDK_CU_ASSERT_FATAL(g_bs != NULL);
@ -1009,7 +1019,7 @@ bs_resize_md(void)
static void
blob_serialize(void)
{
struct spdk_bs_dev dev;
struct spdk_bs_dev *dev;
struct spdk_bs_opts opts;
struct spdk_blob_store *bs;
spdk_blob_id blobid[2];
@ -1018,12 +1028,12 @@ blob_serialize(void)
char *value;
int rc;
init_dev(&dev);
dev = init_dev();
/* Initialize a new blobstore with very small clusters */
spdk_bs_opts_init(&opts);
opts.cluster_sz = dev.blocklen * 8;
spdk_bs_init(&dev, &opts, bs_op_with_handle_complete, NULL);
opts.cluster_sz = dev->blocklen * 8;
spdk_bs_init(dev, &opts, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno == 0);
SPDK_CU_ASSERT_FATAL(g_bs != NULL);
bs = g_bs;
@ -1044,10 +1054,10 @@ blob_serialize(void)
/* Set a fairly large xattr on both blobs to eat up
* metadata space
*/
value = calloc(dev.blocklen - 64, sizeof(char));
value = calloc(dev->blocklen - 64, sizeof(char));
SPDK_CU_ASSERT_FATAL(value != NULL);
memset(value, i, dev.blocklen / 2);
rc = spdk_blob_md_set_xattr(blob[i], "name", value, dev.blocklen - 64);
memset(value, i, dev->blocklen / 2);
rc = spdk_blob_md_set_xattr(blob[i], "name", value, dev->blocklen - 64);
CU_ASSERT(rc == 0);
free(value);
}
@ -1080,8 +1090,9 @@ blob_serialize(void)
g_blobid = 0;
bs = NULL;
dev = init_dev();
/* Load an existing blob store */
spdk_bs_load(&dev, bs_op_with_handle_complete, NULL);
spdk_bs_load(dev, bs_op_with_handle_complete, NULL);
CU_ASSERT(g_bserrno == 0);
SPDK_CU_ASSERT_FATAL(g_bs != NULL);
bs = g_bs;

View File

@ -50,6 +50,7 @@ dev_destroy_channel(struct spdk_bs_dev *dev, struct spdk_io_channel *channel)
static void
dev_destroy(struct spdk_bs_dev *dev)
{
free(dev);
}
static void
@ -157,9 +158,13 @@ dev_unmap(struct spdk_bs_dev *dev, struct spdk_io_channel *channel,
cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, 0);
}
static void
init_dev(struct spdk_bs_dev *dev)
static struct spdk_bs_dev *
init_dev(void)
{
struct spdk_bs_dev *dev = calloc(1, sizeof(*dev));
SPDK_CU_ASSERT_FATAL(dev != NULL);
dev->create_channel = dev_create_channel;
dev->destroy_channel = dev_destroy_channel;
dev->destroy = dev_destroy;
@ -171,4 +176,6 @@ init_dev(struct spdk_bs_dev *dev)
dev->unmap = dev_unmap;
dev->blockcnt = DEV_BUFFER_BLOCKCNT;
dev->blocklen = DEV_BUFFER_BLOCKLEN;
return dev;
}