Message ID | 1394232956-27852-4-git-send-email-mreitz@redhat.com |
---|---|
State | New |
Headers | show |
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 --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
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(+)