diff mbox

rbd: print a clear error message when write beyond EOF

Message ID 1418226457-22239-1-git-send-email-junmuzi@gmail.com
State New
Headers show

Commit Message

lijun Dec. 10, 2014, 3:47 p.m. UTC
Currently, as rbd driver do not support dynamic growth when write beyond EOF,
so just print a clear error message.

Signed-off-by: Jun Li <junmuzi@gmail.com>
---
 block/rbd.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

Comments

Josh Durgin Dec. 10, 2014, 9:48 p.m. UTC | #1
On 12/10/2014 07:47 AM, Jun Li wrote:
> Currently, as rbd driver do not support dynamic growth when write beyond EOF,
> so just print a clear error message.
>
> Signed-off-by: Jun Li <junmuzi@gmail.com>
> ---
>   block/rbd.c | 14 ++++++++++++++
>   1 file changed, 14 insertions(+)
>
> diff --git a/block/rbd.c b/block/rbd.c
> index 5b5a64a..65b01f0 100644
> --- a/block/rbd.c
> +++ b/block/rbd.c
> @@ -693,6 +693,20 @@ static BlockAIOCB *qemu_rbd_aio_writev(BlockDriverState *bs,
>                                          BlockCompletionFunc *cb,
>                                          void *opaque)
>   {
> +    BDRVRBDState *s = bs->opaque;
> +    uint64_t total_size;
> +    int64_t off, size;
> +
> +    off = sector_num * BDRV_SECTOR_SIZE;
> +    size = nb_sectors * BDRV_SECTOR_SIZE;
> +    rbd_get_size(s->image, &total_size);
> +
> +    if (off + size > total_size) {
> +        fprintf(stdout, "Image formats that grow on demand"
> +                        "are not supported on rbd.\n");
> +        return NULL;
> +    }
> +
>       return rbd_start_aio(bs, sector_num, qiov, nb_sectors, cb, opaque,
>                            RBD_AIO_WRITE);
>   }
>

This is one of the checks librbd does itself, so we could just look for
an EINVAL from rbd_aio_{read,write,discard} in rbd_start_aio()
to avoid duplicating the check. An out of bounds i/o is the only way
EINVAL can be returned from these functions in librbd.

Josh
lijun Dec. 11, 2014, 3:20 a.m. UTC | #2
On Wed, 12/10 13:48, Josh Durgin wrote:
> On 12/10/2014 07:47 AM, Jun Li wrote:
> >Currently, as rbd driver do not support dynamic growth when write beyond EOF,
> >so just print a clear error message.
> >
> >Signed-off-by: Jun Li <junmuzi@gmail.com>
> >---
> >  block/rbd.c | 14 ++++++++++++++
> >  1 file changed, 14 insertions(+)
> >
> >diff --git a/block/rbd.c b/block/rbd.c
> >index 5b5a64a..65b01f0 100644
> >--- a/block/rbd.c
> >+++ b/block/rbd.c
> >@@ -693,6 +693,20 @@ static BlockAIOCB *qemu_rbd_aio_writev(BlockDriverState *bs,
> >                                         BlockCompletionFunc *cb,
> >                                         void *opaque)
> >  {
> >+    BDRVRBDState *s = bs->opaque;
> >+    uint64_t total_size;
> >+    int64_t off, size;
> >+
> >+    off = sector_num * BDRV_SECTOR_SIZE;
> >+    size = nb_sectors * BDRV_SECTOR_SIZE;
> >+    rbd_get_size(s->image, &total_size);
> >+
> >+    if (off + size > total_size) {
> >+        fprintf(stdout, "Image formats that grow on demand"
> >+                        "are not supported on rbd.\n");
> >+        return NULL;
> >+    }
> >+
> >      return rbd_start_aio(bs, sector_num, qiov, nb_sectors, cb, opaque,
> >                           RBD_AIO_WRITE);
> >  }
> >
> 
> This is one of the checks librbd does itself, so we could just look for
> an EINVAL from rbd_aio_{read,write,discard} in rbd_start_aio()
> to avoid duplicating the check. An out of bounds i/o is the only way
> EINVAL can be returned from these functions in librbd.
> 

Ok, thx. Seems just need to look for an EINVAL from rbd_aio_write is ok. No
need to detect for rbd_aio_{read,discard,flush_wrapper}. 

I will submit a new version.

Regards,
Jun Li
diff mbox

Patch

diff --git a/block/rbd.c b/block/rbd.c
index 5b5a64a..65b01f0 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -693,6 +693,20 @@  static BlockAIOCB *qemu_rbd_aio_writev(BlockDriverState *bs,
                                        BlockCompletionFunc *cb,
                                        void *opaque)
 {
+    BDRVRBDState *s = bs->opaque;
+    uint64_t total_size;
+    int64_t off, size;
+
+    off = sector_num * BDRV_SECTOR_SIZE;
+    size = nb_sectors * BDRV_SECTOR_SIZE;
+    rbd_get_size(s->image, &total_size);
+
+    if (off + size > total_size) {
+        fprintf(stdout, "Image formats that grow on demand"
+                        "are not supported on rbd.\n");
+        return NULL;
+    }
+
     return rbd_start_aio(bs, sector_num, qiov, nb_sectors, cb, opaque,
                          RBD_AIO_WRITE);
 }