diff mbox

[v3,03/29] block: Update BlockLimits when they might have changed

Message ID 1389968119-24771-4-git-send-email-kwolf@redhat.com
State New
Headers show

Commit Message

Kevin Wolf Jan. 17, 2014, 2:14 p.m. UTC
When reopening with different flags, or when backing files disappear
from the chain, the limits may change. Make sure they get updated in
these cases.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
---
 block.c               | 5 ++++-
 block/stream.c        | 2 ++
 include/block/block.h | 1 +
 3 files changed, 7 insertions(+), 1 deletion(-)

Comments

Benoît Canet Jan. 17, 2014, 10:47 p.m. UTC | #1
Le Friday 17 Jan 2014 à 15:14:53 (+0100), Kevin Wolf a écrit :
> When reopening with different flags, or when backing files disappear
> from the chain, the limits may change. Make sure they get updated in
> these cases.
> 
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> Reviewed-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
> Reviewed-by: Max Reitz <mreitz@redhat.com>
> ---
>  block.c               | 5 ++++-
>  block/stream.c        | 2 ++
>  include/block/block.h | 1 +
>  3 files changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/block.c b/block.c
> index 20f85cb..9a8562d 100644
> --- a/block.c
> +++ b/block.c
> @@ -479,7 +479,7 @@ int bdrv_create_file(const char* filename, QEMUOptionParameter *options,
>      return ret;
>  }
>  
> -static int bdrv_refresh_limits(BlockDriverState *bs)
> +int bdrv_refresh_limits(BlockDriverState *bs)
>  {
>      BlockDriver *drv = bs->drv;
>  
> @@ -1464,6 +1464,8 @@ void bdrv_reopen_commit(BDRVReopenState *reopen_state)
>      reopen_state->bs->enable_write_cache = !!(reopen_state->flags &
>                                                BDRV_O_CACHE_WB);
>      reopen_state->bs->read_only = !(reopen_state->flags & BDRV_O_RDWR);
> +
> +    bdrv_refresh_limits(reopen_state->bs);
>  }
>  
>  /*
> @@ -2261,6 +2263,7 @@ int bdrv_drop_intermediate(BlockDriverState *active, BlockDriverState *top,
>      }
>      new_top_bs->backing_hd = base_bs;
>  
> +    bdrv_refresh_limits(new_top_bs);
>  
>      QSIMPLEQ_FOREACH_SAFE(intermediate_state, &states_to_delete, entry, next) {
>          /* so that bdrv_close() does not recursively close the chain */
> diff --git a/block/stream.c b/block/stream.c
> index 46bec7d..dd0b4ac 100644
> --- a/block/stream.c
> +++ b/block/stream.c
> @@ -75,6 +75,8 @@ static void close_unused_images(BlockDriverState *top, BlockDriverState *base,
>          unused->backing_hd = NULL;
>          bdrv_unref(unused);
>      }
> +
> +    bdrv_refresh_limits(top);
>  }
>  
>  static void coroutine_fn stream_run(void *opaque)
> diff --git a/include/block/block.h b/include/block/block.h
> index 36efaea..64fb319 100644
> --- a/include/block/block.h
> +++ b/include/block/block.h
> @@ -249,6 +249,7 @@ int bdrv_truncate(BlockDriverState *bs, int64_t offset);
>  int64_t bdrv_getlength(BlockDriverState *bs);
>  int64_t bdrv_get_allocated_file_size(BlockDriverState *bs);
>  void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr);
> +int bdrv_refresh_limits(BlockDriverState *bs);
>  int bdrv_commit(BlockDriverState *bs);
>  int bdrv_commit_all(void);
>  int bdrv_change_backing_file(BlockDriverState *bs,
> -- 
> 1.8.1.4
> 
Reviewed-by: Benoît Canet <benoit@irqsave.net>

>
diff mbox

Patch

diff --git a/block.c b/block.c
index 20f85cb..9a8562d 100644
--- a/block.c
+++ b/block.c
@@ -479,7 +479,7 @@  int bdrv_create_file(const char* filename, QEMUOptionParameter *options,
     return ret;
 }
 
-static int bdrv_refresh_limits(BlockDriverState *bs)
+int bdrv_refresh_limits(BlockDriverState *bs)
 {
     BlockDriver *drv = bs->drv;
 
@@ -1464,6 +1464,8 @@  void bdrv_reopen_commit(BDRVReopenState *reopen_state)
     reopen_state->bs->enable_write_cache = !!(reopen_state->flags &
                                               BDRV_O_CACHE_WB);
     reopen_state->bs->read_only = !(reopen_state->flags & BDRV_O_RDWR);
+
+    bdrv_refresh_limits(reopen_state->bs);
 }
 
 /*
@@ -2261,6 +2263,7 @@  int bdrv_drop_intermediate(BlockDriverState *active, BlockDriverState *top,
     }
     new_top_bs->backing_hd = base_bs;
 
+    bdrv_refresh_limits(new_top_bs);
 
     QSIMPLEQ_FOREACH_SAFE(intermediate_state, &states_to_delete, entry, next) {
         /* so that bdrv_close() does not recursively close the chain */
diff --git a/block/stream.c b/block/stream.c
index 46bec7d..dd0b4ac 100644
--- a/block/stream.c
+++ b/block/stream.c
@@ -75,6 +75,8 @@  static void close_unused_images(BlockDriverState *top, BlockDriverState *base,
         unused->backing_hd = NULL;
         bdrv_unref(unused);
     }
+
+    bdrv_refresh_limits(top);
 }
 
 static void coroutine_fn stream_run(void *opaque)
diff --git a/include/block/block.h b/include/block/block.h
index 36efaea..64fb319 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -249,6 +249,7 @@  int bdrv_truncate(BlockDriverState *bs, int64_t offset);
 int64_t bdrv_getlength(BlockDriverState *bs);
 int64_t bdrv_get_allocated_file_size(BlockDriverState *bs);
 void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr);
+int bdrv_refresh_limits(BlockDriverState *bs);
 int bdrv_commit(BlockDriverState *bs);
 int bdrv_commit_all(void);
 int bdrv_change_backing_file(BlockDriverState *bs,