null/rpc: Add more descriptive error messages for null bdevs

Improve error messages where possible.

Change-Id: I9d1e4dee106712ecd7a40cfd1eeaf74ccf6d0d1d
Signed-off-by: Karol Latecki <karol.latecki@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/460121
Reviewed-by: Vitaliy Mysak <vitaliy.mysak@intel.com>
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: Paul Luse <paul.e.luse@intel.com>
Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Karol Latecki 2019-07-02 10:47:37 +02:00 committed by Changpeng Liu
parent 5e28673bc5
commit f155fedcdb
3 changed files with 63 additions and 46 deletions

View File

@ -171,59 +171,61 @@ static const struct spdk_bdev_fn_table null_fn_table = {
.write_config_json = bdev_null_write_config_json,
};
struct spdk_bdev *
create_null_bdev(const char *name, const struct spdk_uuid *uuid,
int
create_null_bdev(struct spdk_bdev **bdev, const char *name, const struct spdk_uuid *uuid,
uint64_t num_blocks, uint32_t block_size)
{
struct null_bdev *bdev;
struct null_bdev *null_disk;
int rc;
if (block_size % 512 != 0) {
SPDK_ERRLOG("Block size %u is not a multiple of 512.\n", block_size);
return NULL;
return -EINVAL;
}
if (num_blocks == 0) {
SPDK_ERRLOG("Disk must be more than 0 blocks\n");
return NULL;
return -EINVAL;
}
bdev = calloc(1, sizeof(*bdev));
if (!bdev) {
null_disk = calloc(1, sizeof(*null_disk));
if (!null_disk) {
SPDK_ERRLOG("could not allocate null_bdev\n");
return NULL;
return -ENOMEM;
}
bdev->bdev.name = strdup(name);
if (!bdev->bdev.name) {
free(bdev);
return NULL;
null_disk->bdev.name = strdup(name);
if (!null_disk->bdev.name) {
free(null_disk);
return -ENOMEM;
}
bdev->bdev.product_name = "Null disk";
null_disk->bdev.product_name = "Null disk";
bdev->bdev.write_cache = 0;
bdev->bdev.blocklen = block_size;
bdev->bdev.blockcnt = num_blocks;
null_disk->bdev.write_cache = 0;
null_disk->bdev.blocklen = block_size;
null_disk->bdev.blockcnt = num_blocks;
if (uuid) {
bdev->bdev.uuid = *uuid;
null_disk->bdev.uuid = *uuid;
} else {
spdk_uuid_generate(&bdev->bdev.uuid);
spdk_uuid_generate(&null_disk->bdev.uuid);
}
bdev->bdev.ctxt = bdev;
bdev->bdev.fn_table = &null_fn_table;
bdev->bdev.module = &null_if;
null_disk->bdev.ctxt = null_disk;
null_disk->bdev.fn_table = &null_fn_table;
null_disk->bdev.module = &null_if;
rc = spdk_bdev_register(&bdev->bdev);
rc = spdk_bdev_register(&null_disk->bdev);
if (rc) {
free(bdev->bdev.name);
free(bdev);
return NULL;
free(null_disk->bdev.name);
free(null_disk);
return rc;
}
TAILQ_INSERT_TAIL(&g_null_bdev_head, bdev, tailq);
*bdev = &(null_disk->bdev);
return &bdev->bdev;
TAILQ_INSERT_TAIL(&g_null_bdev_head, null_disk, tailq);
return rc;
}
void
@ -355,10 +357,9 @@ bdev_null_initialize(void)
num_blocks = size_in_mb * (1024 * 1024) / block_size;
bdev = create_null_bdev(name, NULL, num_blocks, block_size);
if (bdev == NULL) {
rc = create_null_bdev(&bdev, name, NULL, num_blocks, block_size);
if (rc) {
SPDK_ERRLOG("Could not create null bdev\n");
rc = EINVAL;
goto end;
}

View File

@ -41,8 +41,8 @@ typedef void (*spdk_delete_null_complete)(void *cb_arg, int bdeverrno);
struct spdk_bdev;
struct spdk_uuid;
struct spdk_bdev *create_null_bdev(const char *name, const struct spdk_uuid *uuid,
uint64_t num_blocks, uint32_t block_size);
int create_null_bdev(struct spdk_bdev **bdev, const char *name, const struct spdk_uuid *uuid,
uint64_t num_blocks, uint32_t block_size);
/**
* Delete null bdev.

View File

@ -69,24 +69,42 @@ spdk_rpc_construct_null_bdev(struct spdk_jsonrpc_request *request,
struct spdk_uuid *uuid = NULL;
struct spdk_uuid decoded_uuid;
struct spdk_bdev *bdev;
int rc = 0;
if (spdk_json_decode_object(params, rpc_construct_null_decoders,
SPDK_COUNTOF(rpc_construct_null_decoders),
&req)) {
SPDK_DEBUGLOG(SPDK_LOG_BDEV_NULL, "spdk_json_decode_object failed\n");
goto invalid;
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
"spdk_json_decode_object failed");
goto cleanup;
}
if (req.block_size % 512 != 0) {
spdk_jsonrpc_send_error_response_fmt(request, -EINVAL,
"Block size %u is not a multiple of 512", req.block_size);
goto cleanup;
}
if (req.num_blocks == 0) {
spdk_jsonrpc_send_error_response(request, -EINVAL,
"Disk num_blocks must be greater than 0");
goto cleanup;
}
if (req.uuid) {
if (spdk_uuid_parse(&decoded_uuid, req.uuid)) {
goto invalid;
spdk_jsonrpc_send_error_response(request, -EINVAL,
"Failed to parse bdev UUID");
goto cleanup;
}
uuid = &decoded_uuid;
}
bdev = create_null_bdev(req.name, uuid, req.num_blocks, req.block_size);
if (bdev == NULL) {
goto invalid;
rc = create_null_bdev(&bdev, req.name, uuid, req.num_blocks, req.block_size);
if (rc) {
spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc));
goto cleanup;
}
w = spdk_jsonrpc_begin_result(request);
@ -100,8 +118,7 @@ spdk_rpc_construct_null_bdev(struct spdk_jsonrpc_request *request,
free_rpc_construct_null(&req);
return;
invalid:
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters");
cleanup:
free_rpc_construct_null(&req);
}
SPDK_RPC_REGISTER("construct_null_bdev", spdk_rpc_construct_null_bdev, SPDK_RPC_RUNTIME)
@ -141,19 +158,19 @@ spdk_rpc_delete_null_bdev(struct spdk_jsonrpc_request *request,
{
struct rpc_delete_null req = {NULL};
struct spdk_bdev *bdev;
int rc;
if (spdk_json_decode_object(params, rpc_delete_null_decoders,
SPDK_COUNTOF(rpc_delete_null_decoders),
&req)) {
rc = -EINVAL;
goto invalid;
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
"spdk_json_decode_object failed");
goto cleanup;
}
bdev = spdk_bdev_get_by_name(req.name);
if (bdev == NULL) {
rc = -ENODEV;
goto invalid;
spdk_jsonrpc_send_error_response(request, -ENODEV, spdk_strerror(ENODEV));
goto cleanup;
}
delete_null_bdev(bdev, _spdk_rpc_delete_null_bdev_cb, request);
@ -162,8 +179,7 @@ spdk_rpc_delete_null_bdev(struct spdk_jsonrpc_request *request,
return;
invalid:
cleanup:
free_rpc_delete_null(&req);
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, spdk_strerror(-rc));
}
SPDK_RPC_REGISTER("delete_null_bdev", spdk_rpc_delete_null_bdev, SPDK_RPC_RUNTIME)