block/rbd: bump librbd requirement to luminous release

Ceph Luminous (version 12.2.z) is almost 4 years old at this point.
Bump the requirement to get rid of the ifdef'ry in the code.
Qemu 6.1 dropped the support for RHEL-7 which was the last supported
OS that required an older librbd.

Signed-off-by: Peter Lieven <pl@kamp.de>
Reviewed-by: Ilya Dryomov <idryomov@gmail.com>
Message-Id: <20210702172356.11574-2-idryomov@gmail.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Peter Lieven 2021-07-02 19:23:51 +02:00 committed by Kevin Wolf
parent 42e4ac9ef5
commit 48672ac058
2 changed files with 13 additions and 114 deletions

View File

@ -55,24 +55,10 @@
* leading "\". * leading "\".
*/ */
/* rbd_aio_discard added in 0.1.2 */
#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(0, 1, 2)
#define LIBRBD_SUPPORTS_DISCARD
#else
#undef LIBRBD_SUPPORTS_DISCARD
#endif
#define OBJ_MAX_SIZE (1UL << OBJ_DEFAULT_OBJ_ORDER) #define OBJ_MAX_SIZE (1UL << OBJ_DEFAULT_OBJ_ORDER)
#define RBD_MAX_SNAPS 100 #define RBD_MAX_SNAPS 100
/* The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h */
#ifdef LIBRBD_SUPPORTS_IOVEC
#define LIBRBD_USE_IOVEC 1
#else
#define LIBRBD_USE_IOVEC 0
#endif
#define RBD_ENCRYPTION_LUKS_HEADER_VERIFICATION_LEN 8 #define RBD_ENCRYPTION_LUKS_HEADER_VERIFICATION_LEN 8
static const char rbd_luks_header_verification[ static const char rbd_luks_header_verification[
@ -96,7 +82,6 @@ typedef struct RBDAIOCB {
BlockAIOCB common; BlockAIOCB common;
int64_t ret; int64_t ret;
QEMUIOVector *qiov; QEMUIOVector *qiov;
char *bounce;
RBDAIOCmd cmd; RBDAIOCmd cmd;
int error; int error;
struct BDRVRBDState *s; struct BDRVRBDState *s;
@ -106,7 +91,6 @@ typedef struct RADOSCB {
RBDAIOCB *acb; RBDAIOCB *acb;
struct BDRVRBDState *s; struct BDRVRBDState *s;
int64_t size; int64_t size;
char *buf;
int64_t ret; int64_t ret;
} RADOSCB; } RADOSCB;
@ -354,13 +338,9 @@ static int qemu_rbd_set_keypairs(rados_t cluster, const char *keypairs_json,
static void qemu_rbd_memset(RADOSCB *rcb, int64_t offs) static void qemu_rbd_memset(RADOSCB *rcb, int64_t offs)
{ {
if (LIBRBD_USE_IOVEC) { RBDAIOCB *acb = rcb->acb;
RBDAIOCB *acb = rcb->acb; iov_memset(acb->qiov->iov, acb->qiov->niov, offs, 0,
iov_memset(acb->qiov->iov, acb->qiov->niov, offs, 0, acb->qiov->size - offs);
acb->qiov->size - offs);
} else {
memset(rcb->buf + offs, 0, rcb->size - offs);
}
} }
#ifdef LIBRBD_SUPPORTS_ENCRYPTION #ifdef LIBRBD_SUPPORTS_ENCRYPTION
@ -787,13 +767,6 @@ static void qemu_rbd_complete_aio(RADOSCB *rcb)
g_free(rcb); g_free(rcb);
if (!LIBRBD_USE_IOVEC) {
if (acb->cmd == RBD_AIO_READ) {
qemu_iovec_from_buf(acb->qiov, 0, acb->bounce, acb->qiov->size);
}
qemu_vfree(acb->bounce);
}
acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret)); acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
qemu_aio_unref(acb); qemu_aio_unref(acb);
@ -1174,28 +1147,6 @@ static void rbd_finish_aiocb(rbd_completion_t c, RADOSCB *rcb)
rbd_finish_bh, rcb); rbd_finish_bh, rcb);
} }
static int rbd_aio_discard_wrapper(rbd_image_t image,
uint64_t off,
uint64_t len,
rbd_completion_t comp)
{
#ifdef LIBRBD_SUPPORTS_DISCARD
return rbd_aio_discard(image, off, len, comp);
#else
return -ENOTSUP;
#endif
}
static int rbd_aio_flush_wrapper(rbd_image_t image,
rbd_completion_t comp)
{
#ifdef LIBRBD_SUPPORTS_AIO_FLUSH
return rbd_aio_flush(image, comp);
#else
return -ENOTSUP;
#endif
}
static BlockAIOCB *rbd_start_aio(BlockDriverState *bs, static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
int64_t off, int64_t off,
QEMUIOVector *qiov, QEMUIOVector *qiov,
@ -1218,21 +1169,6 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
rcb = g_new(RADOSCB, 1); rcb = g_new(RADOSCB, 1);
if (!LIBRBD_USE_IOVEC) {
if (cmd == RBD_AIO_DISCARD || cmd == RBD_AIO_FLUSH) {
acb->bounce = NULL;
} else {
acb->bounce = qemu_try_blockalign(bs, qiov->size);
if (acb->bounce == NULL) {
goto failed;
}
}
if (cmd == RBD_AIO_WRITE) {
qemu_iovec_to_buf(acb->qiov, 0, acb->bounce, qiov->size);
}
rcb->buf = acb->bounce;
}
acb->ret = 0; acb->ret = 0;
acb->error = 0; acb->error = 0;
acb->s = s; acb->s = s;
@ -1246,7 +1182,7 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
} }
switch (cmd) { switch (cmd) {
case RBD_AIO_WRITE: { case RBD_AIO_WRITE:
/* /*
* RBD APIs don't allow us to write more than actual size, so in order * RBD APIs don't allow us to write more than actual size, so in order
* to support growing images, we resize the image before write * to support growing images, we resize the image before write
@ -1258,25 +1194,16 @@ static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
goto failed_completion; goto failed_completion;
} }
} }
#ifdef LIBRBD_SUPPORTS_IOVEC r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
r = rbd_aio_writev(s->image, qiov->iov, qiov->niov, off, c);
#else
r = rbd_aio_write(s->image, off, size, rcb->buf, c);
#endif
break; break;
}
case RBD_AIO_READ: case RBD_AIO_READ:
#ifdef LIBRBD_SUPPORTS_IOVEC r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
r = rbd_aio_readv(s->image, qiov->iov, qiov->niov, off, c);
#else
r = rbd_aio_read(s->image, off, size, rcb->buf, c);
#endif
break; break;
case RBD_AIO_DISCARD: case RBD_AIO_DISCARD:
r = rbd_aio_discard_wrapper(s->image, off, size, c); r = rbd_aio_discard(s->image, off, size, c);
break; break;
case RBD_AIO_FLUSH: case RBD_AIO_FLUSH:
r = rbd_aio_flush_wrapper(s->image, c); r = rbd_aio_flush(s->image, c);
break; break;
default: default:
r = -EINVAL; r = -EINVAL;
@ -1291,9 +1218,6 @@ failed_completion:
rbd_aio_release(c); rbd_aio_release(c);
failed: failed:
g_free(rcb); g_free(rcb);
if (!LIBRBD_USE_IOVEC) {
qemu_vfree(acb->bounce);
}
qemu_aio_unref(acb); qemu_aio_unref(acb);
return NULL; return NULL;
@ -1319,7 +1243,6 @@ static BlockAIOCB *qemu_rbd_aio_pwritev(BlockDriverState *bs,
RBD_AIO_WRITE); RBD_AIO_WRITE);
} }
#ifdef LIBRBD_SUPPORTS_AIO_FLUSH
static BlockAIOCB *qemu_rbd_aio_flush(BlockDriverState *bs, static BlockAIOCB *qemu_rbd_aio_flush(BlockDriverState *bs,
BlockCompletionFunc *cb, BlockCompletionFunc *cb,
void *opaque) void *opaque)
@ -1327,20 +1250,6 @@ static BlockAIOCB *qemu_rbd_aio_flush(BlockDriverState *bs,
return rbd_start_aio(bs, 0, NULL, 0, cb, opaque, RBD_AIO_FLUSH); return rbd_start_aio(bs, 0, NULL, 0, cb, opaque, RBD_AIO_FLUSH);
} }
#else
static int qemu_rbd_co_flush(BlockDriverState *bs)
{
#if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(0, 1, 1)
/* rbd_flush added in 0.1.1 */
BDRVRBDState *s = bs->opaque;
return rbd_flush(s->image);
#else
return 0;
#endif
}
#endif
static int qemu_rbd_getinfo(BlockDriverState *bs, BlockDriverInfo *bdi) static int qemu_rbd_getinfo(BlockDriverState *bs, BlockDriverInfo *bdi)
{ {
BDRVRBDState *s = bs->opaque; BDRVRBDState *s = bs->opaque;
@ -1546,7 +1455,6 @@ static int qemu_rbd_snap_list(BlockDriverState *bs,
return snap_count; return snap_count;
} }
#ifdef LIBRBD_SUPPORTS_DISCARD
static BlockAIOCB *qemu_rbd_aio_pdiscard(BlockDriverState *bs, static BlockAIOCB *qemu_rbd_aio_pdiscard(BlockDriverState *bs,
int64_t offset, int64_t offset,
int bytes, int bytes,
@ -1556,9 +1464,7 @@ static BlockAIOCB *qemu_rbd_aio_pdiscard(BlockDriverState *bs,
return rbd_start_aio(bs, offset, NULL, bytes, cb, opaque, return rbd_start_aio(bs, offset, NULL, bytes, cb, opaque,
RBD_AIO_DISCARD); RBD_AIO_DISCARD);
} }
#endif
#ifdef LIBRBD_SUPPORTS_INVALIDATE
static void coroutine_fn qemu_rbd_co_invalidate_cache(BlockDriverState *bs, static void coroutine_fn qemu_rbd_co_invalidate_cache(BlockDriverState *bs,
Error **errp) Error **errp)
{ {
@ -1568,7 +1474,6 @@ static void coroutine_fn qemu_rbd_co_invalidate_cache(BlockDriverState *bs,
error_setg_errno(errp, -r, "Failed to invalidate the cache"); error_setg_errno(errp, -r, "Failed to invalidate the cache");
} }
} }
#endif
static QemuOptsList qemu_rbd_create_opts = { static QemuOptsList qemu_rbd_create_opts = {
.name = "rbd-create-opts", .name = "rbd-create-opts",
@ -1643,23 +1548,14 @@ static BlockDriver bdrv_rbd = {
.bdrv_aio_preadv = qemu_rbd_aio_preadv, .bdrv_aio_preadv = qemu_rbd_aio_preadv,
.bdrv_aio_pwritev = qemu_rbd_aio_pwritev, .bdrv_aio_pwritev = qemu_rbd_aio_pwritev,
#ifdef LIBRBD_SUPPORTS_AIO_FLUSH
.bdrv_aio_flush = qemu_rbd_aio_flush, .bdrv_aio_flush = qemu_rbd_aio_flush,
#else
.bdrv_co_flush_to_disk = qemu_rbd_co_flush,
#endif
#ifdef LIBRBD_SUPPORTS_DISCARD
.bdrv_aio_pdiscard = qemu_rbd_aio_pdiscard, .bdrv_aio_pdiscard = qemu_rbd_aio_pdiscard,
#endif
.bdrv_snapshot_create = qemu_rbd_snap_create, .bdrv_snapshot_create = qemu_rbd_snap_create,
.bdrv_snapshot_delete = qemu_rbd_snap_remove, .bdrv_snapshot_delete = qemu_rbd_snap_remove,
.bdrv_snapshot_list = qemu_rbd_snap_list, .bdrv_snapshot_list = qemu_rbd_snap_list,
.bdrv_snapshot_goto = qemu_rbd_snap_rollback, .bdrv_snapshot_goto = qemu_rbd_snap_rollback,
#ifdef LIBRBD_SUPPORTS_INVALIDATE
.bdrv_co_invalidate_cache = qemu_rbd_co_invalidate_cache, .bdrv_co_invalidate_cache = qemu_rbd_co_invalidate_cache,
#endif
.strong_runtime_opts = qemu_rbd_strong_runtime_opts, .strong_runtime_opts = qemu_rbd_strong_runtime_opts,
}; };

View File

@ -710,13 +710,16 @@ if not get_option('rbd').auto() or have_block
int main(void) { int main(void) {
rados_t cluster; rados_t cluster;
rados_create(&cluster, NULL); rados_create(&cluster, NULL);
#if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
#error
#endif
return 0; return 0;
}''', dependencies: [librbd, librados]) }''', dependencies: [librbd, librados])
rbd = declare_dependency(dependencies: [librbd, librados]) rbd = declare_dependency(dependencies: [librbd, librados])
elif get_option('rbd').enabled() elif get_option('rbd').enabled()
error('could not link librados') error('librbd >= 1.12.0 required')
else else
warning('could not link librados, disabling') warning('librbd >= 1.12.0 not found, disabling')
endif endif
endif endif
endif endif