lvol: add option to change default data erase method
Some users require to do write zeroes operation when erasing data on lvol. Currently the default method is unmap. This patch adds flag to spdk_rpc_construct_lvol_bdev call that changes default erase method. This is also a base implementation for possible future function for erasing data on lvol bdev. Signed-off-by: Maciej Szwed <maciej.szwed@intel.com> Change-Id: I8964f170b13c2268fe3c18104f7956c32be96040 Reviewed-on: https://review.gerrithub.io/c/441527 Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
This commit is contained in:
parent
0652c0a6c4
commit
adb39585ef
@ -4183,6 +4183,7 @@ size | Required | number | Desired size of logical volum
|
||||
thin_provision | Optional | boolean | True to enable thin provisioning
|
||||
uuid | Optional | string | UUID of logical volume store to create logical volume on
|
||||
lvs_name | Optional | string | Name of logical volume store to create logical volume on
|
||||
clear_method | Optional | string | Change default data clusters clear method. Available: none, unmap, write_zeroes
|
||||
|
||||
Size will be rounded up to a multiple of cluster size. Either uuid or lvs_name must be specified, but not both.
|
||||
lvol_name will be used in the alias of the created logical volume.
|
||||
@ -4203,6 +4204,7 @@ Example request:
|
||||
"lvol_name": "LVOL0",
|
||||
"size": 1048576,
|
||||
"lvs_name": "LVS0",
|
||||
"clear_method": "unmap",
|
||||
"thin_provision": true
|
||||
}
|
||||
}
|
||||
|
@ -70,6 +70,13 @@ typedef uint64_t spdk_blob_id;
|
||||
#define SPDK_BLOBID_INVALID (uint64_t)-1
|
||||
#define SPDK_BLOBSTORE_TYPE_LENGTH 16
|
||||
|
||||
enum blob_clear_method {
|
||||
BLOB_CLEAR_WITH_DEFAULT,
|
||||
BLOB_CLEAR_WITH_NONE,
|
||||
BLOB_CLEAR_WITH_UNMAP,
|
||||
BLOB_CLEAR_WITH_WRITE_ZEROES,
|
||||
};
|
||||
|
||||
struct spdk_blob_store;
|
||||
struct spdk_io_channel;
|
||||
struct spdk_blob;
|
||||
@ -572,6 +579,17 @@ void spdk_bs_inflate_blob(struct spdk_blob_store *bs, struct spdk_io_channel *ch
|
||||
void spdk_bs_blob_decouple_parent(struct spdk_blob_store *bs, struct spdk_io_channel *channel,
|
||||
spdk_blob_id blobid, spdk_blob_op_complete cb_fn, void *cb_arg);
|
||||
|
||||
struct spdk_blob_open_opts {
|
||||
enum blob_clear_method clear_method;
|
||||
};
|
||||
|
||||
/**
|
||||
* Initialize a spdk_blob_open_opts structure to the default blob option values.
|
||||
*
|
||||
* \param opts spdk_blob_open_opts structure to initialize.
|
||||
*/
|
||||
void spdk_blob_open_opts_init(struct spdk_blob_open_opts *opts);
|
||||
|
||||
/**
|
||||
* Open a blob from the given blobstore.
|
||||
*
|
||||
@ -583,6 +601,18 @@ void spdk_bs_blob_decouple_parent(struct spdk_blob_store *bs, struct spdk_io_cha
|
||||
void spdk_bs_open_blob(struct spdk_blob_store *bs, spdk_blob_id blobid,
|
||||
spdk_blob_op_with_handle_complete cb_fn, void *cb_arg);
|
||||
|
||||
/**
|
||||
* Open a blob from the given blobstore with additional options.
|
||||
*
|
||||
* \param bs blobstore.
|
||||
* \param blobid The id of the blob to open.
|
||||
* \param opts The structure which contains the option values for the blob.
|
||||
* \param cb_fn Called when the operation is complete.
|
||||
* \param cb_arg Argument passed to function cb_fn.
|
||||
*/
|
||||
void spdk_bs_open_blob_ext(struct spdk_blob_store *bs, spdk_blob_id blobid,
|
||||
struct spdk_blob_open_opts *opts, spdk_blob_op_with_handle_complete cb_fn, void *cb_arg);
|
||||
|
||||
/**
|
||||
* Resize a blob to 'sz' clusters. These changes are not persisted to disk until
|
||||
* spdk_bs_md_sync_blob() is called.
|
||||
|
@ -48,6 +48,14 @@ struct spdk_bs_dev;
|
||||
struct spdk_lvol_store;
|
||||
struct spdk_lvol;
|
||||
|
||||
enum lvol_clear_method {
|
||||
LVOL_CLEAR_WITH_DEFAULT,
|
||||
LVOL_CLEAR_WITH_NONE,
|
||||
LVOL_CLEAR_WITH_UNMAP,
|
||||
LVOL_CLEAR_WITH_WRITE_ZEROES,
|
||||
};
|
||||
|
||||
|
||||
/* Must include null terminator. */
|
||||
#define SPDK_LVS_NAME_MAX 64
|
||||
#define SPDK_LVOL_NAME_MAX 64
|
||||
@ -164,13 +172,15 @@ int spdk_lvs_destroy(struct spdk_lvol_store *lvol_store,
|
||||
* \param name Name of lvol.
|
||||
* \param sz size of lvol in bytes.
|
||||
* \param thin_provisioned Enables thin provisioning.
|
||||
* \param clear_method Changes default data clusters clear method
|
||||
* \param cb_fn Completion callback.
|
||||
* \param cb_arg Completion callback custom arguments.
|
||||
*
|
||||
* \return 0 on success, negative errno on failure.
|
||||
*/
|
||||
int spdk_lvol_create(struct spdk_lvol_store *lvs, const char *name, uint64_t sz,
|
||||
bool thin_provisioned, spdk_lvol_op_with_handle_complete cb_fn, void *cb_arg);
|
||||
bool thin_provisioned, enum lvol_clear_method clear_method,
|
||||
spdk_lvol_op_with_handle_complete cb_fn, void *cb_arg);
|
||||
/**
|
||||
* Create snapshot of given lvol.
|
||||
*
|
||||
|
@ -112,6 +112,7 @@ struct spdk_lvol {
|
||||
struct spdk_bdev *bdev;
|
||||
int ref_count;
|
||||
bool action_in_progress;
|
||||
enum blob_clear_method clear_method;
|
||||
TAILQ_ENTRY(spdk_lvol) link;
|
||||
};
|
||||
|
||||
|
@ -1004,7 +1004,8 @@ end:
|
||||
|
||||
int
|
||||
vbdev_lvol_create(struct spdk_lvol_store *lvs, const char *name, uint64_t sz,
|
||||
bool thin_provision, spdk_lvol_op_with_handle_complete cb_fn, void *cb_arg)
|
||||
bool thin_provision, enum lvol_clear_method clear_method, spdk_lvol_op_with_handle_complete cb_fn,
|
||||
void *cb_arg)
|
||||
{
|
||||
struct spdk_lvol_with_handle_req *req;
|
||||
int rc;
|
||||
@ -1016,7 +1017,8 @@ vbdev_lvol_create(struct spdk_lvol_store *lvs, const char *name, uint64_t sz,
|
||||
req->cb_fn = cb_fn;
|
||||
req->cb_arg = cb_arg;
|
||||
|
||||
rc = spdk_lvol_create(lvs, name, sz, thin_provision, _vbdev_lvol_create_cb, req);
|
||||
rc = spdk_lvol_create(lvs, name, sz, thin_provision, clear_method,
|
||||
_vbdev_lvol_create_cb, req);
|
||||
if (rc != 0) {
|
||||
free(req);
|
||||
}
|
||||
|
@ -53,7 +53,9 @@ void vbdev_lvs_destruct(struct spdk_lvol_store *lvs, spdk_lvs_op_complete cb_fn,
|
||||
void vbdev_lvs_unload(struct spdk_lvol_store *lvs, spdk_lvs_op_complete cb_fn, void *cb_arg);
|
||||
|
||||
int vbdev_lvol_create(struct spdk_lvol_store *lvs, const char *name, uint64_t sz,
|
||||
bool thin_provisioned, spdk_lvol_op_with_handle_complete cb_fn, void *cb_arg);
|
||||
bool thin_provisioned, enum lvol_clear_method clear_method,
|
||||
spdk_lvol_op_with_handle_complete cb_fn,
|
||||
void *cb_arg);
|
||||
|
||||
void vbdev_lvol_create_snapshot(struct spdk_lvol *lvol, const char *snapshot_name,
|
||||
spdk_lvol_op_with_handle_complete cb_fn, void *cb_arg);
|
||||
|
@ -323,6 +323,7 @@ struct rpc_construct_lvol_bdev {
|
||||
char *lvol_name;
|
||||
uint64_t size;
|
||||
bool thin_provision;
|
||||
char *clear_method;
|
||||
};
|
||||
|
||||
static void
|
||||
@ -331,6 +332,7 @@ free_rpc_construct_lvol_bdev(struct rpc_construct_lvol_bdev *req)
|
||||
free(req->uuid);
|
||||
free(req->lvs_name);
|
||||
free(req->lvol_name);
|
||||
free(req->clear_method);
|
||||
}
|
||||
|
||||
static const struct spdk_json_object_decoder rpc_construct_lvol_bdev_decoders[] = {
|
||||
@ -339,6 +341,7 @@ static const struct spdk_json_object_decoder rpc_construct_lvol_bdev_decoders[]
|
||||
{"lvol_name", offsetof(struct rpc_construct_lvol_bdev, lvol_name), spdk_json_decode_string, true},
|
||||
{"size", offsetof(struct rpc_construct_lvol_bdev, size), spdk_json_decode_uint64},
|
||||
{"thin_provision", offsetof(struct rpc_construct_lvol_bdev, thin_provision), spdk_json_decode_bool, true},
|
||||
{"clear_method", offsetof(struct rpc_construct_lvol_bdev, clear_method), spdk_json_decode_string, true},
|
||||
};
|
||||
|
||||
static void
|
||||
@ -370,6 +373,7 @@ spdk_rpc_construct_lvol_bdev(struct spdk_jsonrpc_request *request,
|
||||
const struct spdk_json_val *params)
|
||||
{
|
||||
struct rpc_construct_lvol_bdev req = {};
|
||||
enum lvol_clear_method clear_method;
|
||||
int rc;
|
||||
struct spdk_lvol_store *lvs = NULL;
|
||||
|
||||
@ -394,8 +398,23 @@ spdk_rpc_construct_lvol_bdev(struct spdk_jsonrpc_request *request,
|
||||
goto invalid;
|
||||
}
|
||||
|
||||
if (req.clear_method != NULL) {
|
||||
if (!strcasecmp(req.clear_method, "none")) {
|
||||
clear_method = LVOL_CLEAR_WITH_NONE;
|
||||
} else if (!strcasecmp(req.clear_method, "unmap")) {
|
||||
clear_method = LVOL_CLEAR_WITH_UNMAP;
|
||||
} else if (!strcasecmp(req.clear_method, "write_zeroes")) {
|
||||
clear_method = LVOL_CLEAR_WITH_WRITE_ZEROES;
|
||||
} else {
|
||||
rc = -EINVAL;
|
||||
goto invalid;
|
||||
}
|
||||
} else {
|
||||
clear_method = LVOL_CLEAR_WITH_DEFAULT;
|
||||
}
|
||||
|
||||
rc = vbdev_lvol_create(lvs, req.lvol_name, req.size, req.thin_provision,
|
||||
_spdk_rpc_construct_lvol_bdev_cb, request);
|
||||
clear_method, _spdk_rpc_construct_lvol_bdev_cb, request);
|
||||
if (rc < 0) {
|
||||
goto invalid;
|
||||
}
|
||||
|
@ -153,6 +153,12 @@ spdk_blob_opts_init(struct spdk_blob_opts *opts)
|
||||
_spdk_blob_xattrs_init(&opts->xattrs);
|
||||
}
|
||||
|
||||
void
|
||||
spdk_blob_open_opts_init(struct spdk_blob_open_opts *opts)
|
||||
{
|
||||
opts->clear_method = BLOB_CLEAR_WITH_UNMAP;
|
||||
}
|
||||
|
||||
static struct spdk_blob *
|
||||
_spdk_blob_alloc(struct spdk_blob_store *bs, spdk_blob_id id)
|
||||
{
|
||||
@ -1072,6 +1078,18 @@ struct spdk_blob_persist_ctx {
|
||||
void *cb_arg;
|
||||
};
|
||||
|
||||
static void
|
||||
spdk_bs_batch_clear_dev(struct spdk_blob_persist_ctx *ctx, spdk_bs_batch_t *batch, uint64_t lba,
|
||||
uint32_t lba_count)
|
||||
{
|
||||
if (ctx->blob->clear_method == BLOB_CLEAR_WITH_DEFAULT ||
|
||||
ctx->blob->clear_method == BLOB_CLEAR_WITH_UNMAP) {
|
||||
spdk_bs_batch_unmap_dev(batch, lba, lba_count);
|
||||
} else if (ctx->blob->clear_method == BLOB_CLEAR_WITH_WRITE_ZEROES) {
|
||||
spdk_bs_batch_write_zeroes_dev(batch, lba, lba_count);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_spdk_blob_persist_complete(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno)
|
||||
{
|
||||
@ -1091,7 +1109,7 @@ _spdk_blob_persist_complete(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno)
|
||||
}
|
||||
|
||||
static void
|
||||
_spdk_blob_persist_unmap_clusters_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno)
|
||||
_spdk_blob_persist_clear_clusters_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno)
|
||||
{
|
||||
struct spdk_blob_persist_ctx *ctx = cb_arg;
|
||||
struct spdk_blob *blob = ctx->blob;
|
||||
@ -1124,7 +1142,7 @@ _spdk_blob_persist_unmap_clusters_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int
|
||||
}
|
||||
|
||||
static void
|
||||
_spdk_blob_persist_unmap_clusters(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno)
|
||||
_spdk_blob_persist_clear_clusters(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno)
|
||||
{
|
||||
struct spdk_blob_persist_ctx *ctx = cb_arg;
|
||||
struct spdk_blob *blob = ctx->blob;
|
||||
@ -1138,9 +1156,9 @@ _spdk_blob_persist_unmap_clusters(spdk_bs_sequence_t *seq, void *cb_arg, int bse
|
||||
* at the end, but no changes ever occur in the middle of the list.
|
||||
*/
|
||||
|
||||
batch = spdk_bs_sequence_to_batch(seq, _spdk_blob_persist_unmap_clusters_cpl, ctx);
|
||||
batch = spdk_bs_sequence_to_batch(seq, _spdk_blob_persist_clear_clusters_cpl, ctx);
|
||||
|
||||
/* Unmap all clusters that were truncated */
|
||||
/* Clear all clusters that were truncated */
|
||||
lba = 0;
|
||||
lba_count = 0;
|
||||
for (i = blob->active.num_clusters; i < blob->active.cluster_array_size; i++) {
|
||||
@ -1155,11 +1173,9 @@ _spdk_blob_persist_unmap_clusters(spdk_bs_sequence_t *seq, void *cb_arg, int bse
|
||||
|
||||
/* This cluster is not contiguous with the previous one. */
|
||||
|
||||
/* If a run of LBAs previously existing, send them
|
||||
* as an unmap.
|
||||
*/
|
||||
/* If a run of LBAs previously existing, clear them now */
|
||||
if (lba_count > 0) {
|
||||
spdk_bs_batch_unmap_dev(batch, lba, lba_count);
|
||||
spdk_bs_batch_clear_dev(ctx, batch, lba, lba_count);
|
||||
}
|
||||
|
||||
/* Start building the next batch */
|
||||
@ -1171,9 +1187,9 @@ _spdk_blob_persist_unmap_clusters(spdk_bs_sequence_t *seq, void *cb_arg, int bse
|
||||
}
|
||||
}
|
||||
|
||||
/* If we ended with a contiguous set of LBAs, send the unmap now */
|
||||
/* If we ended with a contiguous set of LBAs, clear them now */
|
||||
if (lba_count > 0) {
|
||||
spdk_bs_batch_unmap_dev(batch, lba, lba_count);
|
||||
spdk_bs_batch_clear_dev(ctx, batch, lba, lba_count);
|
||||
}
|
||||
|
||||
spdk_bs_batch_close(batch);
|
||||
@ -1202,8 +1218,8 @@ _spdk_blob_persist_zero_pages_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bse
|
||||
spdk_bit_array_clear(bs->used_md_pages, page_num);
|
||||
}
|
||||
|
||||
/* Move on to unmapping clusters */
|
||||
_spdk_blob_persist_unmap_clusters(seq, ctx, 0);
|
||||
/* Move on to clearing clusters */
|
||||
_spdk_blob_persist_clear_clusters(seq, ctx, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -5065,11 +5081,12 @@ _spdk_bs_open_blob_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno)
|
||||
spdk_bs_sequence_finish(seq, bserrno);
|
||||
}
|
||||
|
||||
void spdk_bs_open_blob(struct spdk_blob_store *bs, spdk_blob_id blobid,
|
||||
spdk_blob_op_with_handle_complete cb_fn, void *cb_arg)
|
||||
static void _spdk_bs_open_blob(struct spdk_blob_store *bs, spdk_blob_id blobid,
|
||||
struct spdk_blob_open_opts *opts, spdk_blob_op_with_handle_complete cb_fn, void *cb_arg)
|
||||
{
|
||||
struct spdk_blob *blob;
|
||||
struct spdk_bs_cpl cpl;
|
||||
struct spdk_blob_open_opts opts_default;
|
||||
spdk_bs_sequence_t *seq;
|
||||
uint32_t page_num;
|
||||
|
||||
@ -5096,6 +5113,13 @@ void spdk_bs_open_blob(struct spdk_blob_store *bs, spdk_blob_id blobid,
|
||||
return;
|
||||
}
|
||||
|
||||
if (!opts) {
|
||||
spdk_blob_open_opts_init(&opts_default);
|
||||
opts = &opts_default;
|
||||
}
|
||||
|
||||
blob->clear_method = opts->clear_method;
|
||||
|
||||
cpl.type = SPDK_BS_CPL_TYPE_BLOB_HANDLE;
|
||||
cpl.u.blob_handle.cb_fn = cb_fn;
|
||||
cpl.u.blob_handle.cb_arg = cb_arg;
|
||||
@ -5110,6 +5134,19 @@ void spdk_bs_open_blob(struct spdk_blob_store *bs, spdk_blob_id blobid,
|
||||
|
||||
_spdk_blob_load(seq, blob, _spdk_bs_open_blob_cpl, blob);
|
||||
}
|
||||
|
||||
void spdk_bs_open_blob(struct spdk_blob_store *bs, spdk_blob_id blobid,
|
||||
spdk_blob_op_with_handle_complete cb_fn, void *cb_arg)
|
||||
{
|
||||
_spdk_bs_open_blob(bs, blobid, NULL, cb_fn, cb_arg);
|
||||
}
|
||||
|
||||
void spdk_bs_open_blob_ext(struct spdk_blob_store *bs, spdk_blob_id blobid,
|
||||
struct spdk_blob_open_opts *opts, spdk_blob_op_with_handle_complete cb_fn, void *cb_arg)
|
||||
{
|
||||
_spdk_bs_open_blob(bs, blobid, opts, cb_fn, cb_arg);
|
||||
}
|
||||
|
||||
/* END spdk_bs_open_blob */
|
||||
|
||||
/* START spdk_blob_set_read_only */
|
||||
|
@ -149,6 +149,7 @@ struct spdk_blob {
|
||||
|
||||
uint32_t frozen_refcnt;
|
||||
bool resize_in_progress;
|
||||
enum blob_clear_method clear_method;
|
||||
};
|
||||
|
||||
struct spdk_blob_store {
|
||||
|
@ -110,6 +110,7 @@ void
|
||||
spdk_lvol_open(struct spdk_lvol *lvol, spdk_lvol_op_with_handle_complete cb_fn, void *cb_arg)
|
||||
{
|
||||
struct spdk_lvol_with_handle_req *req;
|
||||
struct spdk_blob_open_opts opts;
|
||||
|
||||
assert(cb_fn != NULL);
|
||||
|
||||
@ -142,7 +143,10 @@ spdk_lvol_open(struct spdk_lvol *lvol, spdk_lvol_op_with_handle_complete cb_fn,
|
||||
req->cb_arg = cb_arg;
|
||||
req->lvol = lvol;
|
||||
|
||||
spdk_bs_open_blob(lvol->lvol_store->blobstore, lvol->blob_id, _spdk_lvol_open_cb, req);
|
||||
spdk_blob_open_opts_init(&opts);
|
||||
opts.clear_method = lvol->clear_method;
|
||||
|
||||
spdk_bs_open_blob_ext(lvol->lvol_store->blobstore, lvol->blob_id, &opts, _spdk_lvol_open_cb, req);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -163,6 +167,7 @@ _spdk_load_next_lvol(void *cb_arg, struct spdk_blob *blob, int lvolerrno)
|
||||
struct spdk_lvol *lvol, *tmp;
|
||||
spdk_blob_id blob_id;
|
||||
const char *attr;
|
||||
const enum blob_clear_method *clear_method;
|
||||
size_t value_len;
|
||||
int rc;
|
||||
|
||||
@ -221,6 +226,13 @@ _spdk_load_next_lvol(void *cb_arg, struct spdk_blob *blob, int lvolerrno)
|
||||
goto invalid;
|
||||
}
|
||||
|
||||
rc = spdk_blob_get_xattr_value(blob, "clear_method", (const void **)&clear_method, &value_len);
|
||||
if (rc != 0) {
|
||||
lvol->clear_method = BLOB_CLEAR_WITH_DEFAULT;
|
||||
} else {
|
||||
lvol->clear_method = *clear_method;
|
||||
}
|
||||
|
||||
snprintf(lvol->name, sizeof(lvol->name), "%s", attr);
|
||||
|
||||
TAILQ_INSERT_TAIL(&lvs->lvols, lvol, link);
|
||||
@ -935,6 +947,7 @@ _spdk_lvol_create_cb(void *cb_arg, spdk_blob_id blobid, int lvolerrno)
|
||||
{
|
||||
struct spdk_lvol_with_handle_req *req = cb_arg;
|
||||
struct spdk_blob_store *bs;
|
||||
struct spdk_blob_open_opts opts;
|
||||
|
||||
if (lvolerrno < 0) {
|
||||
TAILQ_REMOVE(&req->lvol->lvol_store->pending_lvols, req->lvol, link);
|
||||
@ -945,9 +958,11 @@ _spdk_lvol_create_cb(void *cb_arg, spdk_blob_id blobid, int lvolerrno)
|
||||
return;
|
||||
}
|
||||
|
||||
spdk_blob_open_opts_init(&opts);
|
||||
opts.clear_method = req->lvol->clear_method;
|
||||
bs = req->lvol->lvol_store->blobstore;
|
||||
|
||||
spdk_bs_open_blob(bs, blobid, _spdk_lvol_create_open_cb, req);
|
||||
spdk_bs_open_blob_ext(bs, blobid, &opts, _spdk_lvol_create_open_cb, req);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -962,6 +977,9 @@ spdk_lvol_get_xattr_value(void *xattr_ctx, const char *name,
|
||||
} else if (!strcmp("uuid", name)) {
|
||||
*value = lvol->uuid_str;
|
||||
*value_len = sizeof(lvol->uuid_str);
|
||||
} else if (!strcmp("clear_method", name)) {
|
||||
*value = &lvol->clear_method;
|
||||
*value_len = sizeof(int);
|
||||
}
|
||||
}
|
||||
|
||||
@ -999,14 +1017,15 @@ _spdk_lvs_verify_lvol_name(struct spdk_lvol_store *lvs, const char *name)
|
||||
|
||||
int
|
||||
spdk_lvol_create(struct spdk_lvol_store *lvs, const char *name, uint64_t sz,
|
||||
bool thin_provision, spdk_lvol_op_with_handle_complete cb_fn, void *cb_arg)
|
||||
bool thin_provision, enum lvol_clear_method clear_method, spdk_lvol_op_with_handle_complete cb_fn,
|
||||
void *cb_arg)
|
||||
{
|
||||
struct spdk_lvol_with_handle_req *req;
|
||||
struct spdk_blob_store *bs;
|
||||
struct spdk_lvol *lvol;
|
||||
struct spdk_blob_opts opts;
|
||||
uint64_t num_clusters;
|
||||
char *xattr_names[] = {LVOL_NAME, "uuid"};
|
||||
char *xattr_names[] = {LVOL_NAME, "uuid", "clear_method"};
|
||||
int rc;
|
||||
|
||||
if (lvs == NULL) {
|
||||
@ -1038,6 +1057,7 @@ spdk_lvol_create(struct spdk_lvol_store *lvs, const char *name, uint64_t sz,
|
||||
lvol->lvol_store = lvs;
|
||||
num_clusters = spdk_divide_round_up(sz, spdk_bs_get_cluster_size(bs));
|
||||
lvol->thin_provision = thin_provision;
|
||||
lvol->clear_method = (enum blob_clear_method)clear_method;
|
||||
snprintf(lvol->name, sizeof(lvol->name), "%s", name);
|
||||
TAILQ_INSERT_TAIL(&lvol->lvol_store->pending_lvols, lvol, link);
|
||||
spdk_uuid_generate(&lvol->uuid);
|
||||
|
@ -1033,6 +1033,7 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
|
||||
lvol_name=args.lvol_name,
|
||||
size=args.size * 1024 * 1024,
|
||||
thin_provision=args.thin_provision,
|
||||
clear_method=args.clear_method,
|
||||
uuid=args.uuid,
|
||||
lvs_name=args.lvs_name))
|
||||
|
||||
@ -1040,6 +1041,8 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
|
||||
p.add_argument('-u', '--uuid', help='lvol store UUID', required=False)
|
||||
p.add_argument('-l', '--lvs-name', help='lvol store name', required=False)
|
||||
p.add_argument('-t', '--thin-provision', action='store_true', help='create lvol bdev as thin provisioned')
|
||||
p.add_argument('-c', '--clear-method', help="""Change default data clusters clear method.
|
||||
Available: none, unmap, write_zeroes""", required=False)
|
||||
p.add_argument('lvol_name', help='name for this lvol')
|
||||
p.add_argument('size', help='size in MiB for this bdev', type=int)
|
||||
p.set_defaults(func=construct_lvol_bdev)
|
||||
|
@ -29,7 +29,7 @@ def rename_lvol_store(client, old_name, new_name):
|
||||
return client.call('rename_lvol_store', params)
|
||||
|
||||
|
||||
def construct_lvol_bdev(client, lvol_name, size, thin_provision=False, uuid=None, lvs_name=None):
|
||||
def construct_lvol_bdev(client, lvol_name, size, thin_provision=False, uuid=None, lvs_name=None, clear_method=None):
|
||||
"""Create a logical volume on a logical volume store.
|
||||
|
||||
Args:
|
||||
@ -54,6 +54,8 @@ def construct_lvol_bdev(client, lvol_name, size, thin_provision=False, uuid=None
|
||||
params['uuid'] = uuid
|
||||
if lvs_name:
|
||||
params['lvs_name'] = lvs_name
|
||||
if clear_method:
|
||||
params['clear_method'] = clear_method
|
||||
return client.call('construct_lvol_bdev', params)
|
||||
|
||||
|
||||
|
@ -623,7 +623,8 @@ _lvol_create(struct spdk_lvol_store *lvs)
|
||||
|
||||
int
|
||||
spdk_lvol_create(struct spdk_lvol_store *lvs, const char *name, size_t sz,
|
||||
bool thin_provision, spdk_lvol_op_with_handle_complete cb_fn, void *cb_arg)
|
||||
bool thin_provision, enum lvol_clear_method clear_method, spdk_lvol_op_with_handle_complete cb_fn,
|
||||
void *cb_arg)
|
||||
{
|
||||
struct spdk_lvol *lvol;
|
||||
|
||||
@ -717,7 +718,8 @@ ut_lvs_destroy(void)
|
||||
|
||||
/* Successfully create lvol, which should be unloaded with lvs later */
|
||||
g_lvolerrno = -1;
|
||||
rc = vbdev_lvol_create(lvs, "lvol", sz, false, vbdev_lvol_create_complete, NULL);
|
||||
rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
|
||||
NULL);
|
||||
CU_ASSERT(rc == 0);
|
||||
CU_ASSERT(g_lvolerrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
@ -745,7 +747,8 @@ ut_lvol_init(void)
|
||||
|
||||
/* Successful lvol create */
|
||||
g_lvolerrno = -1;
|
||||
rc = vbdev_lvol_create(lvs, "lvol", sz, false, vbdev_lvol_create_complete, NULL);
|
||||
rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
|
||||
NULL);
|
||||
SPDK_CU_ASSERT_FATAL(rc == 0);
|
||||
CU_ASSERT(g_lvol != NULL);
|
||||
CU_ASSERT(g_lvolerrno == 0);
|
||||
@ -778,7 +781,8 @@ ut_lvol_snapshot(void)
|
||||
|
||||
/* Successful lvol create */
|
||||
g_lvolerrno = -1;
|
||||
rc = vbdev_lvol_create(lvs, "lvol", sz, false, vbdev_lvol_create_complete, NULL);
|
||||
rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
|
||||
NULL);
|
||||
SPDK_CU_ASSERT_FATAL(rc == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
CU_ASSERT(g_lvolerrno == 0);
|
||||
@ -826,7 +830,8 @@ ut_lvol_clone(void)
|
||||
|
||||
/* Successful lvol create */
|
||||
g_lvolerrno = -1;
|
||||
rc = vbdev_lvol_create(lvs, "lvol", sz, false, vbdev_lvol_create_complete, NULL);
|
||||
rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
|
||||
NULL);
|
||||
SPDK_CU_ASSERT_FATAL(rc == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
CU_ASSERT(g_lvolerrno == 0);
|
||||
@ -983,14 +988,16 @@ ut_lvol_rename(void)
|
||||
|
||||
/* Successful lvols create */
|
||||
g_lvolerrno = -1;
|
||||
rc = vbdev_lvol_create(lvs, "lvol", sz, false, vbdev_lvol_create_complete, NULL);
|
||||
rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
|
||||
NULL);
|
||||
SPDK_CU_ASSERT_FATAL(rc == 0);
|
||||
CU_ASSERT(g_lvol != NULL);
|
||||
CU_ASSERT(g_lvolerrno == 0);
|
||||
lvol = g_lvol;
|
||||
|
||||
g_lvolerrno = -1;
|
||||
rc = vbdev_lvol_create(lvs, "lvol2", sz, false, vbdev_lvol_create_complete, NULL);
|
||||
rc = vbdev_lvol_create(lvs, "lvol2", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
|
||||
NULL);
|
||||
SPDK_CU_ASSERT_FATAL(rc == 0);
|
||||
CU_ASSERT(g_lvol != NULL);
|
||||
CU_ASSERT(g_lvolerrno == 0);
|
||||
@ -1045,14 +1052,16 @@ ut_lvol_destroy(void)
|
||||
|
||||
/* Successful lvols create */
|
||||
g_lvolerrno = -1;
|
||||
rc = vbdev_lvol_create(lvs, "lvol", sz, false, vbdev_lvol_create_complete, NULL);
|
||||
rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
|
||||
NULL);
|
||||
SPDK_CU_ASSERT_FATAL(rc == 0);
|
||||
CU_ASSERT(g_lvol != NULL);
|
||||
CU_ASSERT(g_lvolerrno == 0);
|
||||
lvol = g_lvol;
|
||||
|
||||
g_lvolerrno = -1;
|
||||
rc = vbdev_lvol_create(lvs, "lvol2", sz, false, vbdev_lvol_create_complete, NULL);
|
||||
rc = vbdev_lvol_create(lvs, "lvol2", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
|
||||
NULL);
|
||||
SPDK_CU_ASSERT_FATAL(rc == 0);
|
||||
CU_ASSERT(g_lvol != NULL);
|
||||
CU_ASSERT(g_lvolerrno == 0);
|
||||
@ -1097,7 +1106,8 @@ ut_lvol_resize(void)
|
||||
|
||||
/* Successful lvol create */
|
||||
g_lvolerrno = -1;
|
||||
rc = vbdev_lvol_create(lvs, "lvol", sz, false, vbdev_lvol_create_complete, NULL);
|
||||
rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
|
||||
NULL);
|
||||
CU_ASSERT(rc == 0);
|
||||
CU_ASSERT(g_lvolerrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
@ -1141,7 +1151,8 @@ ut_lvol_set_read_only(void)
|
||||
|
||||
/* Successful lvol create */
|
||||
g_lvolerrno = -1;
|
||||
rc = vbdev_lvol_create(lvs, "lvol", sz, false, vbdev_lvol_create_complete, NULL);
|
||||
rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
|
||||
NULL);
|
||||
CU_ASSERT(rc == 0);
|
||||
CU_ASSERT(g_lvolerrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
@ -1183,7 +1194,8 @@ ut_lvs_unload(void)
|
||||
|
||||
/* Successfully create lvol, which should be destroyed with lvs later */
|
||||
g_lvolerrno = -1;
|
||||
rc = vbdev_lvol_create(lvs, "lvol", sz, false, vbdev_lvol_create_complete, NULL);
|
||||
rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
|
||||
NULL);
|
||||
CU_ASSERT(rc == 0);
|
||||
CU_ASSERT(g_lvolerrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
@ -1381,7 +1393,8 @@ ut_lvs_rename(void)
|
||||
|
||||
/* Successfully create lvol, which should be destroyed with lvs later */
|
||||
g_lvolerrno = -1;
|
||||
rc = vbdev_lvol_create(lvs, "lvol", sz, false, vbdev_lvol_create_complete, NULL);
|
||||
rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
|
||||
NULL);
|
||||
CU_ASSERT(rc == 0);
|
||||
CU_ASSERT(g_lvolerrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
|
@ -381,6 +381,13 @@ spdk_blob_sync_md(struct spdk_blob *blob, spdk_blob_op_complete cb_fn, void *cb_
|
||||
cb_fn(cb_arg, 0);
|
||||
}
|
||||
|
||||
void
|
||||
spdk_bs_open_blob_ext(struct spdk_blob_store *bs, spdk_blob_id blobid,
|
||||
struct spdk_blob_open_opts *opts, spdk_blob_op_with_handle_complete cb_fn, void *cb_arg)
|
||||
{
|
||||
spdk_bs_open_blob(bs, blobid, cb_fn, cb_arg);
|
||||
}
|
||||
|
||||
void
|
||||
spdk_bs_open_blob(struct spdk_blob_store *bs, spdk_blob_id blobid,
|
||||
spdk_blob_op_with_handle_complete cb_fn, void *cb_arg)
|
||||
@ -417,6 +424,12 @@ spdk_blob_opts_init(struct spdk_blob_opts *opts)
|
||||
opts->xattrs.get_value = NULL;
|
||||
}
|
||||
|
||||
void
|
||||
spdk_blob_open_opts_init(struct spdk_blob_open_opts *opts)
|
||||
{
|
||||
opts->clear_method = BLOB_CLEAR_WITH_DEFAULT;
|
||||
}
|
||||
|
||||
void
|
||||
spdk_bs_create_blob(struct spdk_blob_store *bs,
|
||||
spdk_blob_op_with_id_complete cb_fn, void *cb_arg)
|
||||
@ -523,7 +536,8 @@ lvs_init_unload_success(void)
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
|
||||
CU_ASSERT(!TAILQ_EMPTY(&g_lvol_stores));
|
||||
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, lvol_op_with_handle_complete, NULL);
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, LVOL_CLEAR_WITH_DEFAULT,
|
||||
lvol_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
|
||||
@ -568,7 +582,8 @@ lvs_init_destroy_success(void)
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
|
||||
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, lvol_op_with_handle_complete, NULL);
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, LVOL_CLEAR_WITH_DEFAULT,
|
||||
lvol_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
|
||||
@ -754,7 +769,8 @@ lvol_create_destroy_success(void)
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
|
||||
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, lvol_op_with_handle_complete, NULL);
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, LVOL_CLEAR_WITH_DEFAULT,
|
||||
lvol_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
|
||||
@ -795,12 +811,13 @@ lvol_create_fail(void)
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
|
||||
|
||||
g_lvol = NULL;
|
||||
rc = spdk_lvol_create(NULL, "lvol", 10, false, lvol_op_with_handle_complete, NULL);
|
||||
rc = spdk_lvol_create(NULL, "lvol", 10, false, LVOL_CLEAR_WITH_DEFAULT,
|
||||
lvol_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(rc != 0);
|
||||
CU_ASSERT(g_lvol == NULL);
|
||||
|
||||
g_lvol = NULL;
|
||||
rc = spdk_lvol_create(g_lvol_store, "lvol", DEV_BUFFER_SIZE + 1, false,
|
||||
rc = spdk_lvol_create(g_lvol_store, "lvol", DEV_BUFFER_SIZE + 1, false, LVOL_CLEAR_WITH_DEFAULT,
|
||||
lvol_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(rc == 0);
|
||||
CU_ASSERT(g_lvserrno != 0);
|
||||
@ -832,7 +849,8 @@ lvol_destroy_fail(void)
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
|
||||
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, lvol_op_with_handle_complete, NULL);
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, LVOL_CLEAR_WITH_DEFAULT,
|
||||
lvol_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
|
||||
@ -867,7 +885,8 @@ lvol_close_fail(void)
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
|
||||
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, lvol_op_with_handle_complete, NULL);
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, LVOL_CLEAR_WITH_DEFAULT,
|
||||
lvol_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
|
||||
@ -901,7 +920,8 @@ lvol_close_success(void)
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
|
||||
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, lvol_op_with_handle_complete, NULL);
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, LVOL_CLEAR_WITH_DEFAULT,
|
||||
lvol_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
|
||||
@ -936,7 +956,8 @@ lvol_resize(void)
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
|
||||
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, lvol_op_with_handle_complete, NULL);
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, LVOL_CLEAR_WITH_DEFAULT,
|
||||
lvol_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
|
||||
@ -1002,7 +1023,8 @@ lvol_set_read_only(void)
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
|
||||
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, lvol_op_with_handle_complete, NULL);
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, LVOL_CLEAR_WITH_DEFAULT,
|
||||
lvol_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(g_lvolerrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
lvol = g_lvol;
|
||||
@ -1349,7 +1371,8 @@ lvol_snapshot(void)
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
|
||||
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, true, lvol_op_with_handle_complete, NULL);
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, true, LVOL_CLEAR_WITH_DEFAULT,
|
||||
lvol_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
|
||||
@ -1396,7 +1419,8 @@ lvol_snapshot_fail(void)
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
|
||||
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, true, lvol_op_with_handle_complete, NULL);
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, true, LVOL_CLEAR_WITH_DEFAULT,
|
||||
lvol_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
|
||||
@ -1460,7 +1484,8 @@ lvol_clone(void)
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
|
||||
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, true, lvol_op_with_handle_complete, NULL);
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, true, LVOL_CLEAR_WITH_DEFAULT,
|
||||
lvol_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
|
||||
@ -1520,7 +1545,8 @@ lvol_clone_fail(void)
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
|
||||
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, true, lvol_op_with_handle_complete, NULL);
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, true, LVOL_CLEAR_WITH_DEFAULT,
|
||||
lvol_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
|
||||
@ -1596,28 +1622,34 @@ lvol_names(void)
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
|
||||
lvs = g_lvol_store;
|
||||
|
||||
rc = spdk_lvol_create(lvs, NULL, 1, false, lvol_op_with_handle_complete, NULL);
|
||||
rc = spdk_lvol_create(lvs, NULL, 1, false, LVOL_CLEAR_WITH_DEFAULT, lvol_op_with_handle_complete,
|
||||
NULL);
|
||||
CU_ASSERT(rc == -EINVAL);
|
||||
|
||||
rc = spdk_lvol_create(lvs, "", 1, false, lvol_op_with_handle_complete, NULL);
|
||||
rc = spdk_lvol_create(lvs, "", 1, false, LVOL_CLEAR_WITH_DEFAULT, lvol_op_with_handle_complete,
|
||||
NULL);
|
||||
CU_ASSERT(rc == -EINVAL);
|
||||
|
||||
memset(fullname, 'x', sizeof(fullname));
|
||||
rc = spdk_lvol_create(lvs, fullname, 1, false, lvol_op_with_handle_complete, NULL);
|
||||
rc = spdk_lvol_create(lvs, fullname, 1, false, LVOL_CLEAR_WITH_DEFAULT,
|
||||
lvol_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(rc == -EINVAL);
|
||||
|
||||
g_lvserrno = -1;
|
||||
rc = spdk_lvol_create(lvs, "lvol", 1, false, lvol_op_with_handle_complete, NULL);
|
||||
rc = spdk_lvol_create(lvs, "lvol", 1, false, LVOL_CLEAR_WITH_DEFAULT, lvol_op_with_handle_complete,
|
||||
NULL);
|
||||
CU_ASSERT(rc == 0);
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
lvol = g_lvol;
|
||||
|
||||
rc = spdk_lvol_create(lvs, "lvol", 1, false, lvol_op_with_handle_complete, NULL);
|
||||
rc = spdk_lvol_create(lvs, "lvol", 1, false, LVOL_CLEAR_WITH_DEFAULT, lvol_op_with_handle_complete,
|
||||
NULL);
|
||||
CU_ASSERT(rc == -EEXIST);
|
||||
|
||||
g_lvserrno = -1;
|
||||
rc = spdk_lvol_create(lvs, "lvol2", 1, false, lvol_op_with_handle_complete, NULL);
|
||||
rc = spdk_lvol_create(lvs, "lvol2", 1, false, LVOL_CLEAR_WITH_DEFAULT, lvol_op_with_handle_complete,
|
||||
NULL);
|
||||
CU_ASSERT(rc == 0);
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
@ -1628,7 +1660,8 @@ lvol_names(void)
|
||||
|
||||
g_lvserrno = -1;
|
||||
g_lvol = NULL;
|
||||
rc = spdk_lvol_create(lvs, "lvol", 1, false, lvol_op_with_handle_complete, NULL);
|
||||
rc = spdk_lvol_create(lvs, "lvol", 1, false, LVOL_CLEAR_WITH_DEFAULT, lvol_op_with_handle_complete,
|
||||
NULL);
|
||||
CU_ASSERT(rc == 0);
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
@ -1645,14 +1678,16 @@ lvol_names(void)
|
||||
SPDK_CU_ASSERT_FATAL(lvol != NULL);
|
||||
snprintf(lvol->name, sizeof(lvol->name), "tmp_name");
|
||||
TAILQ_INSERT_TAIL(&lvs->pending_lvols, lvol, link);
|
||||
rc = spdk_lvol_create(lvs, "tmp_name", 1, false, lvol_op_with_handle_complete, NULL);
|
||||
rc = spdk_lvol_create(lvs, "tmp_name", 1, false, LVOL_CLEAR_WITH_DEFAULT,
|
||||
lvol_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(rc == -EEXIST);
|
||||
|
||||
/* Remove name from temporary list and try again. */
|
||||
TAILQ_REMOVE(&lvs->pending_lvols, lvol, link);
|
||||
free(lvol);
|
||||
|
||||
rc = spdk_lvol_create(lvs, "tmp_name", 1, false, lvol_op_with_handle_complete, NULL);
|
||||
rc = spdk_lvol_create(lvs, "tmp_name", 1, false, LVOL_CLEAR_WITH_DEFAULT,
|
||||
lvol_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(rc == 0);
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
@ -1692,7 +1727,8 @@ lvol_rename(void)
|
||||
|
||||
/* Trying to create new lvol */
|
||||
g_lvserrno = -1;
|
||||
rc = spdk_lvol_create(lvs, "lvol", 1, false, lvol_op_with_handle_complete, NULL);
|
||||
rc = spdk_lvol_create(lvs, "lvol", 1, false, LVOL_CLEAR_WITH_DEFAULT, lvol_op_with_handle_complete,
|
||||
NULL);
|
||||
CU_ASSERT(rc == 0);
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
@ -1701,14 +1737,16 @@ lvol_rename(void)
|
||||
/* Trying to create second lvol with existing lvol name */
|
||||
g_lvserrno = -1;
|
||||
g_lvol = NULL;
|
||||
rc = spdk_lvol_create(lvs, "lvol", 1, false, lvol_op_with_handle_complete, NULL);
|
||||
rc = spdk_lvol_create(lvs, "lvol", 1, false, LVOL_CLEAR_WITH_DEFAULT, lvol_op_with_handle_complete,
|
||||
NULL);
|
||||
CU_ASSERT(rc == -EEXIST);
|
||||
CU_ASSERT(g_lvserrno == -1);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol == NULL);
|
||||
|
||||
/* Trying to create second lvol with non existing name */
|
||||
g_lvserrno = -1;
|
||||
rc = spdk_lvol_create(lvs, "lvol2", 1, false, lvol_op_with_handle_complete, NULL);
|
||||
rc = spdk_lvol_create(lvs, "lvol2", 1, false, LVOL_CLEAR_WITH_DEFAULT, lvol_op_with_handle_complete,
|
||||
NULL);
|
||||
CU_ASSERT(rc == 0);
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
@ -1833,7 +1871,8 @@ static void lvol_refcnt(void)
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
|
||||
|
||||
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, lvol_op_with_handle_complete, NULL);
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, LVOL_CLEAR_WITH_DEFAULT,
|
||||
lvol_op_with_handle_complete, NULL);
|
||||
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
@ -1892,7 +1931,8 @@ lvol_create_thin_provisioned(void)
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
|
||||
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, lvol_op_with_handle_complete, NULL);
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, LVOL_CLEAR_WITH_DEFAULT,
|
||||
lvol_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
|
||||
@ -1903,7 +1943,8 @@ lvol_create_thin_provisioned(void)
|
||||
spdk_lvol_destroy(g_lvol, destroy_cb, NULL);
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, true, lvol_op_with_handle_complete, NULL);
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, true, LVOL_CLEAR_WITH_DEFAULT,
|
||||
lvol_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
|
||||
@ -1941,7 +1982,8 @@ lvol_inflate(void)
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
|
||||
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, lvol_op_with_handle_complete, NULL);
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, LVOL_CLEAR_WITH_DEFAULT,
|
||||
lvol_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
|
||||
@ -1990,7 +2032,8 @@ lvol_decouple_parent(void)
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
|
||||
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, lvol_op_with_handle_complete, NULL);
|
||||
spdk_lvol_create(g_lvol_store, "lvol", 10, false, LVOL_CLEAR_WITH_DEFAULT,
|
||||
lvol_op_with_handle_complete, NULL);
|
||||
CU_ASSERT(g_lvserrno == 0);
|
||||
SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user