rbd: use the higher level librbd instead of just librados

librbd stacks on top of librados to provide access
to rbd images.

Using librbd simplifies the qemu code, and allows
qemu to use new versions of the rbd format
with few (if any) changes.

Reviewed-by: Christian Brunner <chb@muc.de>
Signed-off-by: Josh Durgin <josh.durgin@dreamhost.com>
Signed-off-by: Yehuda Sadeh <yehuda@hq.newdream.net>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Josh Durgin 2011-05-26 16:07:31 -07:00 committed by Kevin Wolf
parent d1f6fd8d14
commit ad32e9c003
3 changed files with 238 additions and 685 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,71 +0,0 @@
/*
* Ceph - scalable distributed file system
*
* Copyright (C) 2004-2010 Sage Weil <sage@newdream.net>
*
* This is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software
* Foundation. See file COPYING.LIB.
*
*/
#ifndef CEPH_RBD_TYPES_H
#define CEPH_RBD_TYPES_H
/*
* rbd image 'foo' consists of objects
* foo.rbd - image metadata
* foo.00000000
* foo.00000001
* ... - data
*/
#define RBD_SUFFIX ".rbd"
#define RBD_DIRECTORY "rbd_directory"
#define RBD_INFO "rbd_info"
#define RBD_DEFAULT_OBJ_ORDER 22 /* 4MB */
#define RBD_MAX_OBJ_NAME_SIZE 96
#define RBD_MAX_BLOCK_NAME_SIZE 24
#define RBD_MAX_SEG_NAME_SIZE 128
#define RBD_COMP_NONE 0
#define RBD_CRYPT_NONE 0
#define RBD_HEADER_TEXT "<<< Rados Block Device Image >>>\n"
#define RBD_HEADER_SIGNATURE "RBD"
#define RBD_HEADER_VERSION "001.005"
struct rbd_info {
uint64_t max_id;
} __attribute__ ((packed));
struct rbd_obj_snap_ondisk {
uint64_t id;
uint64_t image_size;
} __attribute__((packed));
struct rbd_obj_header_ondisk {
char text[40];
char block_name[RBD_MAX_BLOCK_NAME_SIZE];
char signature[4];
char version[8];
struct {
uint8_t order;
uint8_t crypt_type;
uint8_t comp_type;
uint8_t unused;
} __attribute__((packed)) options;
uint64_t image_size;
uint64_t snap_seq;
uint32_t snap_count;
uint32_t reserved;
uint64_t snap_names_len;
struct rbd_obj_snap_ondisk snaps[0];
} __attribute__((packed));
#endif

33
configure vendored
View File

@ -1917,41 +1917,24 @@ fi
if test "$rbd" != "no" ; then if test "$rbd" != "no" ; then
cat > $TMPC <<EOF cat > $TMPC <<EOF
#include <stdio.h> #include <stdio.h>
#include <rados/librados.h> #include <rbd/librbd.h>
int main(void) { rados_initialize(0, NULL); return 0; }
EOF
rbd_libs="-lrados"
if compile_prog "" "$rbd_libs" ; then
librados_too_old=no
cat > $TMPC <<EOF
#include <stdio.h>
#include <rados/librados.h>
#ifndef CEPH_OSD_TMAP_SET
#error missing CEPH_OSD_TMAP_SET
#endif
int main(void) { int main(void) {
int (*func)(const rados_pool_t pool, uint64_t *snapid) = rados_selfmanaged_snap_create; rados_t cluster;
rados_initialize(0, NULL); rados_create(&cluster, NULL);
return 0; return 0;
} }
EOF EOF
if compile_prog "" "$rbd_libs" ; then rbd_libs="-lrbd -lrados"
rbd=yes if compile_prog "" "$rbd_libs" ; then
libs_tools="$rbd_libs $libs_tools" rbd=yes
libs_softmmu="$rbd_libs $libs_softmmu" libs_tools="$rbd_libs $libs_tools"
else libs_softmmu="$rbd_libs $libs_softmmu"
rbd=no
librados_too_old=yes
fi
else else
if test "$rbd" = "yes" ; then if test "$rbd" = "yes" ; then
feature_not_found "rados block device" feature_not_found "rados block device"
fi fi
rbd=no rbd=no
fi fi
if test "$librados_too_old" = "yes" ; then
echo "-> Your librados version is too old - upgrade needed to have rbd support"
fi
fi fi
########################################## ##########################################