Spdk/module/bdev/longhorn/bdev_longhorn_replica.c
Keith Lucas 70f0921810 Initial changes.
Signed-off-by: Keith Lucas <keith.lucas@suse.com>
2022-02-08 15:51:30 -05:00

132 lines
3.0 KiB
C

#include "spdk/stdinc.h"
#include "spdk/string.h"
#include "spdk/rpc.h"
#include "spdk/util.h"
#include "spdk/log.h"
#include "bdev_longhorn_lvol.h"
#include "bdev_longhorn_replica.h"
#include "bdev_longhorn_nvmf.h"
#include "spdk_internal/lvolstore.h"
#include "../lvol/vbdev_lvol.h"
#include "lib/blob/blobstore.h"
void bdev_longhorn_replica_detect(const char *name) {
struct spdk_lvol_store *lvs = longhorn_get_lvol_store_by_name(name);
}
void bdev_longhorn_replica_get_info(const char *name) {
struct spdk_bdev *bdev = NULL;
struct spdk_lvol *lvol = NULL;
spdk_blob_id parent_id;
bdev = spdk_bdev_get_by_name(name);
if (bdev != NULL) {
lvol = vbdev_lvol_get_from_bdev(bdev);
}
}
struct longhorn_replica_create_context {
char *name;
char *bdev_name;
struct spdk_lvol_store *lvs;
char *addr;
uint16_t port;
char *nqn;
longhorn_replica_create_cb cb_fn;
void *cb_arg;
};
static void longhorn_replica_create_context_free(struct longhorn_replica_create_context *ctx)
{
free(ctx->name);
free(ctx->addr);
free(ctx->nqn);
free(ctx);
}
static void longhorn_replica_publish_complete_cb(void *arg) {
struct longhorn_replica_create_context *ctx = arg;
ctx->cb_fn(ctx->lvs, ctx->name, ctx->nqn, ctx->cb_arg);
longhorn_replica_create_context_free(ctx);
}
static void longhorn_replica_create_complete_cb(void *arg,
struct spdk_lvol *lvol,
int volerrno)
{
struct longhorn_replica_create_context *ctx = arg;
if (ctx->addr && ctx->addr[0] != '\0') {
longhorn_publish_nvmf(lvol->bdev->name, ctx->nqn, ctx->addr, ctx->port,
longhorn_replica_publish_complete_cb, ctx);
} else {
ctx->cb_fn(ctx->lvs, ctx->name, ctx->nqn, ctx->cb_arg);
longhorn_replica_create_context_free(ctx);
}
}
void bdev_longhorn_replica_create(struct spdk_lvol_store *lvs,
const char *name,
uint64_t size,
const char *addr,
uint16_t port,
longhorn_replica_create_cb cb_fn,
void *cb_arg)
{
struct longhorn_replica_create_context *ctx;
struct spdk_bdev *bdev;
/* TODO Lookup name to see if it exists. */
ctx = calloc(1, sizeof(*ctx));
ctx->name = strdup(name);
ctx->cb_fn = cb_fn;
ctx->cb_arg = cb_arg;
ctx->lvs = lvs;
ctx->addr = strdup(addr);
ctx->port = port;
ctx->bdev_name = spdk_sprintf_alloc("%s/%s", lvs->name, name);
ctx->nqn = spdk_sprintf_alloc(REPLICA_FORMAT, lvs->name, name);
bdev = spdk_bdev_get_by_name(ctx->bdev_name);
if (bdev != NULL) {
longhorn_replica_create_complete_cb(ctx,
vbdev_lvol_get_from_bdev(bdev),
0);
} else {
vbdev_lvol_create(lvs, name, size, true, LVOL_CLEAR_WITH_DEFAULT,
longhorn_replica_create_complete_cb, ctx);
}
}
void bdev_longhorn_replica_snapshot(struct spdk_lvol_store *lvs,
const char *name,
const char *snapshot)
{
//vbdev_lvol_create_snapshot(struct spdk_lvol *lvol, const char *snapshot_name,
// spdk_lvol_op_with_handle_complete cb_fn, void *cb_arg
}