Re: [Qemu-devel] [PATCH v4 1/4] rbd: use the higher level librbd instead of just librados

2011-05-25 Thread Josh Durgin

On 05/25/2011 12:18 PM, Christian Brunner wrote:

Apart from two cosmetic issues (see below), I think this patch is
ready to replace the old rbd driver. You can add:

Reviewed-by: Christian Brunner

Regards
Christian


Thanks, I fixed these in v5.

Josh



2011/5/24 Josh Durgin:

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.

Signed-off-by: Josh Durgin
Signed-off-by: Yehuda Sadeh
---
  block/rbd.c   |  790 +++--
  block/rbd_types.h |   71 -
  configure |   33 +--
  3 files changed, 224 insertions(+), 670 deletions(-)
  delete mode 100644 block/rbd_types.h

diff --git a/block/rbd.c b/block/rbd.c
index 249a590..1c8e7c7 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -1,20 +1,22 @@
  /*
  * QEMU Block driver for RADOS (Ceph)
  *
- * Copyright (C) 2010 Christian Brunner
+ * Copyright (C) 2010-2011 Christian Brunner,
+ * Josh Durgin
  *
  * This work is licensed under the terms of the GNU GPL, version 2.  See
  * the COPYING file in the top-level directory.
  *
  */

+#include
+
  #include "qemu-common.h"
  #include "qemu-error.h"

-#include "rbd_types.h"
  #include "block_int.h"

-#include
+#include



@@ -40,6 +42,12 @@

  #define OBJ_MAX_SIZE (1UL<<  OBJ_DEFAULT_OBJ_ORDER)

+#define RBD_MAX_CONF_NAME_SIZE 128
+#define RBD_MAX_CONF_VAL_SIZE 512
+#define RBD_MAX_CONF_SIZE 1024
+#define RBD_MAX_POOL_NAME_SIZE 128
+#define RBD_MAX_SNAP_NAME_SIZE 128
+
  typedef struct RBDAIOCB {
 BlockDriverAIOCB common;
 QEMUBH *bh;
@@ -48,7 +56,6 @@ typedef struct RBDAIOCB {
 char *bounce;
 int write;
 int64_t sector_num;
-int aiocnt;
 int error;
 struct BDRVRBDState *s;
 int cancelled;
@@ -59,7 +66,7 @@ typedef struct RADOSCB {
 RBDAIOCB *acb;
 struct BDRVRBDState *s;
 int done;
-int64_t segsize;
+int64_t size;
 char *buf;
 int ret;
  } RADOSCB;
@@ -69,25 +76,22 @@ typedef struct RADOSCB {

  typedef struct BDRVRBDState {
 int fds[2];
-rados_pool_t pool;
-rados_pool_t header_pool;
-char name[RBD_MAX_OBJ_NAME_SIZE];
-char block_name[RBD_MAX_BLOCK_NAME_SIZE];
-uint64_t size;
-uint64_t objsize;
+rados_t cluster;
+rados_ioctx_t io_ctx;
+rbd_image_t image;
+char name[RBD_MAX_IMAGE_NAME_SIZE];
 int qemu_aio_count;
+char *snap;
 int event_reader_pos;
 RADOSCB *event_rcb;
  } BDRVRBDState;

-typedef struct rbd_obj_header_ondisk RbdHeader1;
-
  static void rbd_aio_bh_cb(void *opaque);

-static int rbd_next_tok(char *dst, int dst_len,
-char *src, char delim,
-const char *name,
-char **p)
+static int qemu_rbd_next_tok(char *dst, int dst_len,
+ char *src, char delim,
+ const char *name,
+ char **p)
  {
 int l;
 char *end;
@@ -115,10 +119,10 @@ static int rbd_next_tok(char *dst, int dst_len,
 return 0;
  }

-static int rbd_parsename(const char *filename,
- char *pool, int pool_len,
- char *snap, int snap_len,
- char *name, int name_len)
+static int qemu_rbd_parsename(const char *filename,
+  char *pool, int pool_len,
+  char *snap, int snap_len,
+  char *name, int name_len)
  {
 const char *start;
 char *p, *buf;
@@ -131,12 +135,12 @@ static int rbd_parsename(const char *filename,
 buf = qemu_strdup(start);
 p = buf;

-ret = rbd_next_tok(pool, pool_len, p, '/', "pool name",&p);
+ret = qemu_rbd_next_tok(pool, pool_len, p, '/', "pool name",&p);
 if (ret<  0 || !p) {
 ret = -EINVAL;
 goto done;
 }
-ret = rbd_next_tok(name, name_len, p, '@', "object name",&p);
+ret = qemu_rbd_next_tok(name, name_len, p, '@', "object name",&p);
 if (ret<  0) {
 goto done;
 }
@@ -145,123 +149,35 @@ static int rbd_parsename(const char *filename,
 goto done;
 }

-ret = rbd_next_tok(snap, snap_len, p, '\0', "snap name",&p);
+ret = qemu_rbd_next_tok(snap, snap_len, p, '\0', "snap name",&p);

  done:
 qemu_free(buf);
 return ret;
  }

-static int create_tmap_op(uint8_t op, const char *name, char **tmap_desc)
-{
-uint32_t len = strlen(name);
-uint32_t len_le = cpu_to_le32(len);
-/* total_len = encoding op + name + empty buffer */
-uint32_t total_len = 1 + (sizeof(uint32_t) + len) + sizeof(uint32_t);
-uint8_t *desc = NULL;
-
-desc = qemu_malloc(total_len);
-
-*tmap_desc = (char *)desc;
-
-*desc = op;
-desc++;
-memcpy(desc,&len_le, sizeof(len_le));
-desc += sizeof(len_le);
-memcpy(desc, name, len);
-desc += len;
-len = 0; /* no need for endian conversio

Re: [Qemu-devel] [PATCH v4 1/4] rbd: use the higher level librbd instead of just librados

2011-05-25 Thread Christian Brunner
Apart from two cosmetic issues (see below), I think this patch is
ready to replace the old rbd driver. You can add:

Reviewed-by: Christian Brunner 

Regards
Christian

2011/5/24 Josh Durgin :
> 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.
>
> Signed-off-by: Josh Durgin 
> Signed-off-by: Yehuda Sadeh 
> ---
>  block/rbd.c       |  790 
> +++--
>  block/rbd_types.h |   71 -
>  configure         |   33 +--
>  3 files changed, 224 insertions(+), 670 deletions(-)
>  delete mode 100644 block/rbd_types.h
>
> diff --git a/block/rbd.c b/block/rbd.c
> index 249a590..1c8e7c7 100644
> --- a/block/rbd.c
> +++ b/block/rbd.c
> @@ -1,20 +1,22 @@
>  /*
>  * QEMU Block driver for RADOS (Ceph)
>  *
> - * Copyright (C) 2010 Christian Brunner 
> + * Copyright (C) 2010-2011 Christian Brunner ,
> + *                         Josh Durgin 
>  *
>  * This work is licensed under the terms of the GNU GPL, version 2.  See
>  * the COPYING file in the top-level directory.
>  *
>  */
>
> +#include 
> +
>  #include "qemu-common.h"
>  #include "qemu-error.h"
>
> -#include "rbd_types.h"
>  #include "block_int.h"
>
> -#include 
> +#include 
>
>
>
> @@ -40,6 +42,12 @@
>
>  #define OBJ_MAX_SIZE (1UL << OBJ_DEFAULT_OBJ_ORDER)
>
> +#define RBD_MAX_CONF_NAME_SIZE 128
> +#define RBD_MAX_CONF_VAL_SIZE 512
> +#define RBD_MAX_CONF_SIZE 1024
> +#define RBD_MAX_POOL_NAME_SIZE 128
> +#define RBD_MAX_SNAP_NAME_SIZE 128
> +
>  typedef struct RBDAIOCB {
>     BlockDriverAIOCB common;
>     QEMUBH *bh;
> @@ -48,7 +56,6 @@ typedef struct RBDAIOCB {
>     char *bounce;
>     int write;
>     int64_t sector_num;
> -    int aiocnt;
>     int error;
>     struct BDRVRBDState *s;
>     int cancelled;
> @@ -59,7 +66,7 @@ typedef struct RADOSCB {
>     RBDAIOCB *acb;
>     struct BDRVRBDState *s;
>     int done;
> -    int64_t segsize;
> +    int64_t size;
>     char *buf;
>     int ret;
>  } RADOSCB;
> @@ -69,25 +76,22 @@ typedef struct RADOSCB {
>
>  typedef struct BDRVRBDState {
>     int fds[2];
> -    rados_pool_t pool;
> -    rados_pool_t header_pool;
> -    char name[RBD_MAX_OBJ_NAME_SIZE];
> -    char block_name[RBD_MAX_BLOCK_NAME_SIZE];
> -    uint64_t size;
> -    uint64_t objsize;
> +    rados_t cluster;
> +    rados_ioctx_t io_ctx;
> +    rbd_image_t image;
> +    char name[RBD_MAX_IMAGE_NAME_SIZE];
>     int qemu_aio_count;
> +    char *snap;
>     int event_reader_pos;
>     RADOSCB *event_rcb;
>  } BDRVRBDState;
>
> -typedef struct rbd_obj_header_ondisk RbdHeader1;
> -
>  static void rbd_aio_bh_cb(void *opaque);
>
> -static int rbd_next_tok(char *dst, int dst_len,
> -                        char *src, char delim,
> -                        const char *name,
> -                        char **p)
> +static int qemu_rbd_next_tok(char *dst, int dst_len,
> +                             char *src, char delim,
> +                             const char *name,
> +                             char **p)
>  {
>     int l;
>     char *end;
> @@ -115,10 +119,10 @@ static int rbd_next_tok(char *dst, int dst_len,
>     return 0;
>  }
>
> -static int rbd_parsename(const char *filename,
> -                         char *pool, int pool_len,
> -                         char *snap, int snap_len,
> -                         char *name, int name_len)
> +static int qemu_rbd_parsename(const char *filename,
> +                              char *pool, int pool_len,
> +                              char *snap, int snap_len,
> +                              char *name, int name_len)
>  {
>     const char *start;
>     char *p, *buf;
> @@ -131,12 +135,12 @@ static int rbd_parsename(const char *filename,
>     buf = qemu_strdup(start);
>     p = buf;
>
> -    ret = rbd_next_tok(pool, pool_len, p, '/', "pool name", &p);
> +    ret = qemu_rbd_next_tok(pool, pool_len, p, '/', "pool name", &p);
>     if (ret < 0 || !p) {
>         ret = -EINVAL;
>         goto done;
>     }
> -    ret = rbd_next_tok(name, name_len, p, '@', "object name", &p);
> +    ret = qemu_rbd_next_tok(name, name_len, p, '@', "object name", &p);
>     if (ret < 0) {
>         goto done;
>     }
> @@ -145,123 +149,35 @@ static int rbd_parsename(const char *filename,
>         goto done;
>     }
>
> -    ret = rbd_next_tok(snap, snap_len, p, '\0', "snap name", &p);
> +    ret = qemu_rbd_next_tok(snap, snap_len, p, '\0', "snap name", &p);
>
>  done:
>     qemu_free(buf);
>     return ret;
>  }
>
> -static int create_tmap_op(uint8_t op, const char *name, char **tmap_desc)
> -{
> -    uint32_t len = strlen(name);
> -    uint32_t len_le = cpu_to_le32(len);
> -    /* total_len = encoding op + name + empty buffer */
> -    uint32_t total_len = 1 + (sizeof(uint32_t) + len) + sizeof(uint32_t);
> -    uint8_t *desc = NULL;
> -
> -    desc = qemu_malloc(total_len);
> -
> -    *tmap_desc = (char *)desc;
> -
> -    *desc = op;

[PATCH v4 1/4] rbd: use the higher level librbd instead of just librados

2011-05-24 Thread Josh Durgin
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.

Signed-off-by: Josh Durgin 
Signed-off-by: Yehuda Sadeh 
---
 block/rbd.c   |  790 +++--
 block/rbd_types.h |   71 -
 configure |   33 +--
 3 files changed, 224 insertions(+), 670 deletions(-)
 delete mode 100644 block/rbd_types.h

diff --git a/block/rbd.c b/block/rbd.c
index 249a590..1c8e7c7 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -1,20 +1,22 @@
 /*
  * QEMU Block driver for RADOS (Ceph)
  *
- * Copyright (C) 2010 Christian Brunner 
+ * Copyright (C) 2010-2011 Christian Brunner ,
+ * Josh Durgin 
  *
  * This work is licensed under the terms of the GNU GPL, version 2.  See
  * the COPYING file in the top-level directory.
  *
  */
 
+#include 
+
 #include "qemu-common.h"
 #include "qemu-error.h"
 
-#include "rbd_types.h"
 #include "block_int.h"
 
-#include 
+#include 
 
 
 
@@ -40,6 +42,12 @@
 
 #define OBJ_MAX_SIZE (1UL << OBJ_DEFAULT_OBJ_ORDER)
 
+#define RBD_MAX_CONF_NAME_SIZE 128
+#define RBD_MAX_CONF_VAL_SIZE 512
+#define RBD_MAX_CONF_SIZE 1024
+#define RBD_MAX_POOL_NAME_SIZE 128
+#define RBD_MAX_SNAP_NAME_SIZE 128
+
 typedef struct RBDAIOCB {
 BlockDriverAIOCB common;
 QEMUBH *bh;
@@ -48,7 +56,6 @@ typedef struct RBDAIOCB {
 char *bounce;
 int write;
 int64_t sector_num;
-int aiocnt;
 int error;
 struct BDRVRBDState *s;
 int cancelled;
@@ -59,7 +66,7 @@ typedef struct RADOSCB {
 RBDAIOCB *acb;
 struct BDRVRBDState *s;
 int done;
-int64_t segsize;
+int64_t size;
 char *buf;
 int ret;
 } RADOSCB;
@@ -69,25 +76,22 @@ typedef struct RADOSCB {
 
 typedef struct BDRVRBDState {
 int fds[2];
-rados_pool_t pool;
-rados_pool_t header_pool;
-char name[RBD_MAX_OBJ_NAME_SIZE];
-char block_name[RBD_MAX_BLOCK_NAME_SIZE];
-uint64_t size;
-uint64_t objsize;
+rados_t cluster;
+rados_ioctx_t io_ctx;
+rbd_image_t image;
+char name[RBD_MAX_IMAGE_NAME_SIZE];
 int qemu_aio_count;
+char *snap;
 int event_reader_pos;
 RADOSCB *event_rcb;
 } BDRVRBDState;
 
-typedef struct rbd_obj_header_ondisk RbdHeader1;
-
 static void rbd_aio_bh_cb(void *opaque);
 
-static int rbd_next_tok(char *dst, int dst_len,
-char *src, char delim,
-const char *name,
-char **p)
+static int qemu_rbd_next_tok(char *dst, int dst_len,
+ char *src, char delim,
+ const char *name,
+ char **p)
 {
 int l;
 char *end;
@@ -115,10 +119,10 @@ static int rbd_next_tok(char *dst, int dst_len,
 return 0;
 }
 
-static int rbd_parsename(const char *filename,
- char *pool, int pool_len,
- char *snap, int snap_len,
- char *name, int name_len)
+static int qemu_rbd_parsename(const char *filename,
+  char *pool, int pool_len,
+  char *snap, int snap_len,
+  char *name, int name_len)
 {
 const char *start;
 char *p, *buf;
@@ -131,12 +135,12 @@ static int rbd_parsename(const char *filename,
 buf = qemu_strdup(start);
 p = buf;
 
-ret = rbd_next_tok(pool, pool_len, p, '/', "pool name", &p);
+ret = qemu_rbd_next_tok(pool, pool_len, p, '/', "pool name", &p);
 if (ret < 0 || !p) {
 ret = -EINVAL;
 goto done;
 }
-ret = rbd_next_tok(name, name_len, p, '@', "object name", &p);
+ret = qemu_rbd_next_tok(name, name_len, p, '@', "object name", &p);
 if (ret < 0) {
 goto done;
 }
@@ -145,123 +149,35 @@ static int rbd_parsename(const char *filename,
 goto done;
 }
 
-ret = rbd_next_tok(snap, snap_len, p, '\0', "snap name", &p);
+ret = qemu_rbd_next_tok(snap, snap_len, p, '\0', "snap name", &p);
 
 done:
 qemu_free(buf);
 return ret;
 }
 
-static int create_tmap_op(uint8_t op, const char *name, char **tmap_desc)
-{
-uint32_t len = strlen(name);
-uint32_t len_le = cpu_to_le32(len);
-/* total_len = encoding op + name + empty buffer */
-uint32_t total_len = 1 + (sizeof(uint32_t) + len) + sizeof(uint32_t);
-uint8_t *desc = NULL;
-
-desc = qemu_malloc(total_len);
-
-*tmap_desc = (char *)desc;
-
-*desc = op;
-desc++;
-memcpy(desc, &len_le, sizeof(len_le));
-desc += sizeof(len_le);
-memcpy(desc, name, len);
-desc += len;
-len = 0; /* no need for endian conversion for 0 */
-memcpy(desc, &len, sizeof(len));
-desc += sizeof(len);
-
-return (char *)desc - *tmap_desc;
-}
-
-static void free_tmap_op(char *tmap_desc)
-{
-qemu_free(tmap_desc);
-}
-
-static int rbd_register_image(rados_pool_t pool, const char *name)
-{
-