diff mbox

[v2,03/12] block: Add "has_single_child" field for drivers

Message ID 1394232956-27852-4-git-send-email-mreitz@redhat.com
State New
Headers show

Commit Message

Max Reitz March 7, 2014, 10:55 p.m. UTC
This field should be used by block drivers acting as filters which have
only a single child BDS which is referenced through the "file" field of
the BDS.

Setting this field allows other block functions to "access" the child
BDS, for instance in bdrv_recurse_is_first_non_filter(). Therefore, it
should not be set if the block layer should not have access to the child
through the filter.

Signed-off-by: Max Reitz <mreitz@redhat.com>
---
 block.c                   | 4 ++++
 include/block/block_int.h | 7 +++++++
 2 files changed, 11 insertions(+)

Comments

Benoît Canet March 9, 2014, 12:15 p.m. UTC | #1
The Friday 07 Mar 2014 à 23:55:47 (+0100), Max Reitz wrote :
> This field should be used by block drivers acting as filters which have
> only a single child BDS which is referenced through the "file" field of
> the BDS.
> 
> Setting this field allows other block functions to "access" the child
> BDS, for instance in bdrv_recurse_is_first_non_filter(). Therefore, it
> should not be set if the block layer should not have access to the child
> through the filter.
> 
> Signed-off-by: Max Reitz <mreitz@redhat.com>
> ---
>  block.c                   | 4 ++++
>  include/block/block_int.h | 7 +++++++
>  2 files changed, 11 insertions(+)
> 
> diff --git a/block.c b/block.c
> index 06fbc0a..aec325f 100644
> --- a/block.c
> +++ b/block.c
> @@ -5418,6 +5418,10 @@ bool bdrv_recurse_is_first_non_filter(BlockDriverState *bs,
>          return bs->drv->bdrv_recurse_is_first_non_filter(bs, candidate);
>      }
>  
> +    if (bs->drv->has_single_child) {
> +        return bdrv_recurse_is_first_non_filter(bs->file, candidate);
> +    }
> +
>      /* the driver is a block filter but don't allow to recurse -> return false
>       */
>      return false;
> diff --git a/include/block/block_int.h b/include/block/block_int.h
> index 4fc5ea8..7815587 100644
> --- a/include/block/block_int.h
> +++ b/include/block/block_int.h
> @@ -78,6 +78,13 @@ struct BlockDriver {
>  
>      /* set to true if the BlockDriver is a block filter */
>      bool is_filter;
> +    /* Set to true if the BlockDriver is a filter with a single child referenced
> +     * through the "file" field in the BDS. This allows the block layer to
> +     * access that child through the filter (e.g., for
> +     * bdrv_recurse_is_first_non_filter()); if this is not desired, set it to
> +     * false (the "file" field should not have been used in this case anyway,
> +     * though). */
> +    bool has_single_child;
>      /* for snapshots block filter like Quorum can implement the
>       * following recursive callback.
>       * It's purpose is to recurse on the filter children while calling
> -- 
> 1.9.0
> 
> 
Reviewed-by: Benoit Canet <benoit@irqsave.net>
diff mbox

Patch

diff --git a/block.c b/block.c
index 06fbc0a..aec325f 100644
--- a/block.c
+++ b/block.c
@@ -5418,6 +5418,10 @@  bool bdrv_recurse_is_first_non_filter(BlockDriverState *bs,
         return bs->drv->bdrv_recurse_is_first_non_filter(bs, candidate);
     }
 
+    if (bs->drv->has_single_child) {
+        return bdrv_recurse_is_first_non_filter(bs->file, candidate);
+    }
+
     /* the driver is a block filter but don't allow to recurse -> return false
      */
     return false;
diff --git a/include/block/block_int.h b/include/block/block_int.h
index 4fc5ea8..7815587 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -78,6 +78,13 @@  struct BlockDriver {
 
     /* set to true if the BlockDriver is a block filter */
     bool is_filter;
+    /* Set to true if the BlockDriver is a filter with a single child referenced
+     * through the "file" field in the BDS. This allows the block layer to
+     * access that child through the filter (e.g., for
+     * bdrv_recurse_is_first_non_filter()); if this is not desired, set it to
+     * false (the "file" field should not have been used in this case anyway,
+     * though). */
+    bool has_single_child;
     /* for snapshots block filter like Quorum can implement the
      * following recursive callback.
      * It's purpose is to recurse on the filter children while calling