bdev: Add public function spdk_bdev_rbd_create().
Make sure the function reentrant, prepare for rpc method. Change-Id: Ie5230e4ac6c9a750e8e779c5e0b67134729c07e3 Signed-off-by: Cunyin Chang <cunyin.chang@intel.com>
This commit is contained in:
parent
076c7d5953
commit
e578cfe3d4
@ -31,8 +31,9 @@
|
|||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "blockdev_rbd.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
@ -484,23 +485,6 @@ static const struct spdk_bdev_fn_table rbd_fn_table = {
|
|||||||
.get_io_channel = blockdev_rbd_get_io_channel,
|
.get_io_channel = blockdev_rbd_get_io_channel,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int
|
|
||||||
blockdev_create_rbd_disk(struct blockdev_rbd *disk, uint32_t block_size)
|
|
||||||
{
|
|
||||||
snprintf(disk->disk.name, SPDK_BDEV_MAX_NAME_LENGTH, "Ceph%d",
|
|
||||||
blockdev_rbd_count);
|
|
||||||
snprintf(disk->disk.product_name, SPDK_BDEV_MAX_PRODUCT_NAME_LENGTH, "Ceph rbd");
|
|
||||||
blockdev_rbd_count++;
|
|
||||||
|
|
||||||
disk->disk.write_cache = 0;
|
|
||||||
disk->disk.blocklen = block_size;
|
|
||||||
disk->disk.blockcnt = disk->info.size / disk->disk.blocklen;
|
|
||||||
disk->disk.ctxt = disk;
|
|
||||||
disk->disk.fn_table = &rbd_fn_table;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
blockdev_rbd_library_fini(void)
|
blockdev_rbd_library_fini(void)
|
||||||
{
|
{
|
||||||
@ -542,15 +526,66 @@ blockdev_rbd_pool_info_init(const char *rbd_pool_name)
|
|||||||
return pool_info;
|
return pool_info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
spdk_bdev_rbd_create(const char *pool_name, const char *rbd_name, uint32_t block_size)
|
||||||
|
{
|
||||||
|
struct blockdev_rbd_pool_info *pool_info;
|
||||||
|
struct blockdev_rbd *rbd;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
pool_info = blockdev_rbd_pool_info_init(pool_name);
|
||||||
|
if (pool_info == NULL) {
|
||||||
|
SPDK_ERRLOG("failed to create blockdev_rbd_pool_info\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
rbd = calloc(1, sizeof(struct blockdev_rbd));
|
||||||
|
if (rbd == NULL) {
|
||||||
|
SPDK_ERRLOG("Failed to allocate blockdev_rbd struct\n");
|
||||||
|
free(pool_info);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
rbd->pool_info = pool_info;
|
||||||
|
rbd->rbd_name = rbd_name;
|
||||||
|
ret = blockdev_rbd_init(pool_info->name, rbd_name, &rbd->info);
|
||||||
|
if (ret < 0) {
|
||||||
|
free(pool_info);
|
||||||
|
free(rbd);
|
||||||
|
SPDK_ERRLOG("Failed to init rbd device\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(rbd->disk.name, SPDK_BDEV_MAX_NAME_LENGTH, "Ceph%d",
|
||||||
|
blockdev_rbd_count);
|
||||||
|
snprintf(rbd->disk.product_name, SPDK_BDEV_MAX_PRODUCT_NAME_LENGTH, "Ceph rbd");
|
||||||
|
blockdev_rbd_count++;
|
||||||
|
|
||||||
|
rbd->disk.write_cache = 0;
|
||||||
|
rbd->disk.blocklen = block_size;
|
||||||
|
rbd->disk.blockcnt = rbd->info.size / rbd->disk.blocklen;
|
||||||
|
rbd->disk.ctxt = rbd;
|
||||||
|
rbd->disk.fn_table = &rbd_fn_table;
|
||||||
|
|
||||||
|
SPDK_NOTICELOG("Add %s rbd disk to lun\n", rbd->disk.name);
|
||||||
|
TAILQ_INSERT_TAIL(&g_rbds, rbd, tailq);
|
||||||
|
|
||||||
|
spdk_io_device_register(&rbd->disk, blockdev_rbd_create_cb,
|
||||||
|
blockdev_rbd_destroy_cb,
|
||||||
|
sizeof(struct blockdev_rbd_io_channel));
|
||||||
|
spdk_bdev_register(&rbd->disk);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
blockdev_rbd_library_init(void)
|
blockdev_rbd_library_init(void)
|
||||||
{
|
{
|
||||||
int i, ret;
|
int i, ret;
|
||||||
const char *val;
|
const char *val;
|
||||||
|
const char *pool_name;
|
||||||
const char *rbd_name;
|
const char *rbd_name;
|
||||||
uint32_t block_size;
|
uint32_t block_size;
|
||||||
struct blockdev_rbd_pool_info *pool_info;
|
|
||||||
struct blockdev_rbd *rbd;
|
|
||||||
struct spdk_conf_section *sp = spdk_conf_find_section(NULL, "Ceph");
|
struct spdk_conf_section *sp = spdk_conf_find_section(NULL, "Ceph");
|
||||||
|
|
||||||
if (sp == NULL) {
|
if (sp == NULL) {
|
||||||
@ -567,18 +602,12 @@ blockdev_rbd_library_init(void)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
/* get the Rbd_pool name */
|
/* get the Rbd_pool name */
|
||||||
val = spdk_conf_section_get_nmval(sp, "Ceph", i, 0);
|
pool_name = spdk_conf_section_get_nmval(sp, "Ceph", i, 0);
|
||||||
if (val == NULL) {
|
if (pool_name == NULL) {
|
||||||
SPDK_ERRLOG("Ceph%d: rbd pool name needs to be provided\n", i);
|
SPDK_ERRLOG("Ceph%d: rbd pool name needs to be provided\n", i);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
pool_info = blockdev_rbd_pool_info_init(val);
|
|
||||||
if (pool_info == NULL) {
|
|
||||||
SPDK_ERRLOG("Ceph%d: failed to create blockdev_rbd_pool_info\n", i);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
rbd_name = spdk_conf_section_get_nmval(sp, "Ceph", i, 1);
|
rbd_name = spdk_conf_section_get_nmval(sp, "Ceph", i, 1);
|
||||||
if (rbd_name == NULL) {
|
if (rbd_name == NULL) {
|
||||||
SPDK_ERRLOG("Ceph%d: format error\n", i);
|
SPDK_ERRLOG("Ceph%d: format error\n", i);
|
||||||
@ -598,32 +627,10 @@ blockdev_rbd_library_init(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rbd = calloc(1, sizeof(struct blockdev_rbd));
|
ret = spdk_bdev_rbd_create(pool_name, rbd_name, block_size);
|
||||||
if (rbd == NULL) {
|
if (ret) {
|
||||||
SPDK_ERRLOG("Failed to allocate blockdev_rbd struct\n");
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
rbd->pool_info = pool_info;
|
|
||||||
rbd->rbd_name = rbd_name;
|
|
||||||
ret = blockdev_rbd_init(pool_info->name, rbd_name, &rbd->info);
|
|
||||||
if (ret < 0) {
|
|
||||||
SPDK_ERRLOG("Failed to init rbd device\n");
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = blockdev_create_rbd_disk(rbd, block_size);
|
|
||||||
if (ret < 0) {
|
|
||||||
SPDK_ERRLOG("Failed to create rbd disk\n");
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
SPDK_NOTICELOG("Add %s rbd disk to lun\n", rbd->disk.name);
|
|
||||||
TAILQ_INSERT_TAIL(&g_rbds, rbd, tailq);
|
|
||||||
|
|
||||||
spdk_io_device_register(&rbd->disk, blockdev_rbd_create_cb,
|
|
||||||
blockdev_rbd_destroy_cb,
|
|
||||||
sizeof(struct blockdev_rbd_io_channel));
|
|
||||||
spdk_bdev_register(&rbd->disk);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
41
lib/bdev/rbd/blockdev_rbd.h
Normal file
41
lib/bdev/rbd/blockdev_rbd.h
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/*-
|
||||||
|
* BSD LICENSE
|
||||||
|
*
|
||||||
|
* Copyright (c) Intel Corporation.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* * Neither the name of Intel Corporation nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SPDK_BLOCKDEV_RBD_H
|
||||||
|
#define SPDK_BLOCKDEV_RBD_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
spdk_bdev_rbd_create(const char *pool_name, const char *rbd_name, uint32_t block_size);
|
||||||
|
#endif // SPDK_BLOCKDEV_RBD_H
|
Loading…
Reference in New Issue
Block a user