δΊ 2013-2-27 21:58, Markus Armbruster ει: > Wenchao Xia <xiaw...@linux.vnet.ibm.com> writes: > >> Compared to bdrv_can_snapshot(), this function return whether >> bs* is ready to read snapshot info from instead of write. If yes, >> caller can then query snapshot information, but taking snapshot >> is not always possible for that *bs may be read only. >> >> Signed-off-by: Wenchao Xia <xiaw...@linux.vnet.ibm.com> >> Reviewed-by: Eric Blake <ebl...@redhat.com> >> --- >> block.c | 19 +++++++++++++++++++ >> include/block/block.h | 1 + >> 2 files changed, 20 insertions(+), 0 deletions(-) >> >> diff --git a/block.c b/block.c >> index 50dab8e..19c2d7b 100644 >> --- a/block.c >> +++ b/block.c >> @@ -3058,6 +3058,25 @@ bool bdrv_debug_is_suspended(BlockDriverState *bs, >> const char *tag) >> /**************************************************************/ >> /* handling of snapshots */ >> >> +/* return whether internal snapshot can be read on @bs */ >> +bool bdrv_can_read_snapshot(BlockDriverState *bs) >> +{ >> + BlockDriver *drv = bs->drv; >> + if (!drv || !bdrv_is_inserted(bs)) { >> + return false; >> + } >> + >> + if (!drv->bdrv_snapshot_create) { >> + if (bs->file != NULL) { >> + return bdrv_can_read_snapshot(bs->file); >> + } >> + return false; >> + } >> + >> + return true; >> +} > > Looks like > > bdrv_can_read_snapshot(bs) && !bdrv_is_read_only(bs) == bdrv_can_snapshot(bs) > > Correct? > not equal, it is tricky for that recusively check is done inside bdrv_can_snapshot(bs), that is why I did not use a common internal static function.
>> + >> +/* return whether internal snapshot can be write on @bs */ > > "be written". > > Or more succinctly: > > /* Can @bs take a snapshot? */ > OK, this seems better. >> int bdrv_can_snapshot(BlockDriverState *bs) >> { >> BlockDriver *drv = bs->drv; >> diff --git a/include/block/block.h b/include/block/block.h >> index 5c3b911..4c48052 100644 >> --- a/include/block/block.h >> +++ b/include/block/block.h >> @@ -321,6 +321,7 @@ void bdrv_get_full_backing_filename(BlockDriverState *bs, >> char *dest, size_t sz); >> BlockInfo *bdrv_query_info(BlockDriverState *s); >> BlockStats *bdrv_query_stats(const BlockDriverState *bs); >> +bool bdrv_can_read_snapshot(BlockDriverState *bs); >> int bdrv_can_snapshot(BlockDriverState *bs); >> int bdrv_is_snapshot(BlockDriverState *bs); >> BlockDriverState *bdrv_snapshots(void); > -- Best Regards Wenchao Xia