Commit 9472eecb authored by Ziye Yang's avatar Ziye Yang Committed by Tomasz Zawadzki
Browse files

blob: Make the ABI compatibility of spdk_blob_open_opts structure.



Signed-off-by: default avatarZiye Yang <ziye.yang@intel.com>
Change-Id: I8627347f44f0a9cb4b50f41ac5effae18b427c6d
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/5701


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent b47f0f20
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -20,6 +20,11 @@ An `opts_size` element was added in the `spdk_blob_opts` structure to solve the
ABI compatiblity issue between different SPDK version. And also add `opts_size`
parameter in `spdk_blob_opts_init` function.

An `opts_size` element was added in the `spdk_blob_open_opts` structure to solve the
ABI compatiblity issue between different SPDK version. And also add `opts_size`
parameter in `spdk_blob_open_opts_init` function.


### event

The pci_whitelist and pci_blacklist members of struct spdk_app_opts have been
+10 −1
Original line number Diff line number Diff line
@@ -614,14 +614,23 @@ void spdk_bs_blob_decouple_parent(struct spdk_blob_store *bs, struct spdk_io_cha

struct spdk_blob_open_opts {
	enum blob_clear_method  clear_method;

	/**
	 * The size of spdk_blob_open_opts according to the caller of this library is used for ABI
	 * compatibility. The library uses this field to know how many fields in this
	 * structure are valid. And the library will populate any remaining fields with default values.
	 * New added fields should be put at the end of the struct.
	 */
	size_t opts_size;
};

/**
 * Initialize a spdk_blob_open_opts structure to the default blob option values.
 *
 * \param opts spdk_blob_open_opts structure to initialize.
 * \param opts_size It mus be the size of struct spdk_blob_open_opts.
 */
void spdk_blob_open_opts_init(struct spdk_blob_open_opts *opts);
void spdk_blob_open_opts_init(struct spdk_blob_open_opts *opts, size_t opts_size);

/**
 * Open a blob from the given blobstore.
+54 −7
Original line number Diff line number Diff line
@@ -241,9 +241,33 @@ spdk_blob_opts_init(struct spdk_blob_opts *opts, size_t opts_size)
}

void
spdk_blob_open_opts_init(struct spdk_blob_open_opts *opts)
spdk_blob_open_opts_init(struct spdk_blob_open_opts *opts, size_t opts_size)
{
	opts->clear_method = BLOB_CLEAR_WITH_DEFAULT;
	if (!opts) {
		SPDK_ERRLOG("opts should not be NULL\n");
		return;
	}

	if (!opts_size) {
		SPDK_ERRLOG("opts_size should not be zero value\n");
		return;
	}

	memset(opts, 0, opts_size);
	opts->opts_size = opts_size;

#define FIELD_OK(field) \
        offsetof(struct spdk_blob_open_opts, field) + sizeof(opts->field) <= opts_size

#define SET_FIELD(field, value) \
        if (FIELD_OK(field)) { \
                opts->field = value; \
        } \

	SET_FIELD(clear_method, BLOB_CLEAR_WITH_DEFAULT);

#undef FIELD_OK
#undef SET_FILED
}

static struct spdk_blob *
@@ -6821,6 +6845,29 @@ bs_open_blob_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno)
	bs_sequence_finish(seq, bserrno);
}

static inline void
blob_open_opts_copy(const struct spdk_blob_open_opts *src, struct spdk_blob_open_opts *dst)
{
#define FIELD_OK(field) \
        offsetof(struct spdk_blob_opts, field) + sizeof(src->field) <= src->opts_size

#define SET_FIELD(field) \
        if (FIELD_OK(field)) { \
                dst->field = src->field; \
        } \

	SET_FIELD(clear_method);

	dst->opts_size = src->opts_size;

	/* You should not remove this statement, but need to update the assert statement
	 * if you add a new field, and also add a corresponding SET_FIELD statement */
	SPDK_STATIC_ASSERT(sizeof(struct spdk_blob_open_opts) == 16, "Incorrect size");

#undef FIELD_OK
#undef SET_FIELD
}

static void
bs_open_blob(struct spdk_blob_store *bs,
	     spdk_blob_id blobid,
@@ -6830,7 +6877,7 @@ bs_open_blob(struct spdk_blob_store *bs,
{
	struct spdk_blob		*blob;
	struct spdk_bs_cpl		cpl;
	struct spdk_blob_open_opts	opts_default;
	struct spdk_blob_open_opts	opts_local;
	spdk_bs_sequence_t		*seq;
	uint32_t			page_num;

@@ -6857,12 +6904,12 @@ bs_open_blob(struct spdk_blob_store *bs,
		return;
	}

	if (!opts) {
		spdk_blob_open_opts_init(&opts_default);
		opts = &opts_default;
	spdk_blob_open_opts_init(&opts_local, sizeof(opts_local));
	if (opts) {
		blob_open_opts_copy(opts, &opts_local);
	}

	blob->clear_method = opts->clear_method;
	blob->clear_method = opts_local.clear_method;

	cpl.type = SPDK_BS_CPL_TYPE_BLOB_HANDLE;
	cpl.u.blob_handle.cb_fn = cb_fn;
+2 −2
Original line number Diff line number Diff line
@@ -143,7 +143,7 @@ spdk_lvol_open(struct spdk_lvol *lvol, spdk_lvol_op_with_handle_complete cb_fn,
	req->cb_arg = cb_arg;
	req->lvol = lvol;

	spdk_blob_open_opts_init(&opts);
	spdk_blob_open_opts_init(&opts, sizeof(opts));
	opts.clear_method = lvol->clear_method;

	spdk_bs_open_blob_ext(lvol->lvol_store->blobstore, lvol->blob_id, &opts, lvol_open_cb, req);
@@ -960,7 +960,7 @@ lvol_create_cb(void *cb_arg, spdk_blob_id blobid, int lvolerrno)
		return;
	}

	spdk_blob_open_opts_init(&opts);
	spdk_blob_open_opts_init(&opts, sizeof(opts));
	opts.clear_method = req->lvol->clear_method;
	bs = req->lvol->lvol_store->blobstore;

+2 −1
Original line number Diff line number Diff line
@@ -411,8 +411,9 @@ spdk_blob_opts_init(struct spdk_blob_opts *opts, size_t opts_size)
}

void
spdk_blob_open_opts_init(struct spdk_blob_open_opts *opts)
spdk_blob_open_opts_init(struct spdk_blob_open_opts *opts, size_t opts_size)
{
	opts->opts_size = opts_size;
	opts->clear_method = BLOB_CLEAR_WITH_DEFAULT;
}