On Mon, 07/15 05:42, Xu Wang wrote: > If there is a loop exists in the backing file chain, many problems > could be caused by it, such as no response and segment fault during > system boot. Hence stopping backing file loop appear is very necessary. > This patch refine and export loop checking function from collect_image_ > info_list() to block.c and build a independent function named bdrv_ > backing_file_loop_check(). > > Signed-off-by: Xu Wang <cngesa...@gmail.com> > --- > block.c | 97 > +++++++++++++++++++++++++++++++++++++++++++++++++++ > include/block/block.h | 4 +++ > qemu-img.c | 29 +++++---------- > 3 files changed, 110 insertions(+), 20 deletions(-) > > diff --git a/block.c b/block.c > index 183fec8..c1d060d 100644 > --- a/block.c > +++ b/block.c > @@ -4433,6 +4433,103 @@ bdrv_acct_done(BlockDriverState *bs, BlockAcctCookie > *cookie) > bs->total_time_ns[cookie->type] += get_clock() - cookie->start_time_ns; > } > > +static gboolean str_equal_func(gconstpointer a, gconstpointer b) > +{ > + return strcmp(a, b) == 0; > +} > + > +/** > + * Check backing file chain if there is a loop in it and build list of > + * ImageInfo if needed.
Need fix for this? Image info built in collect_image_info_list, not here, right? Fam > + * > + * @filename: topmost image filename, absolute or relative path is OK. > + * @fmt: topmost image format (may be NULL to autodetect) > + * @backing_file: if this value is set, @filename inode (-1 if it doesn't > + * exist) will insert into hash table directly. Loop check > + * starts from it. Absolute or relative path is OK for it. > + * @backing_format: format of backing file > + * > + * Returns: true for backing file loop or error happened, false for no loop. > + */ > +bool bdrv_backing_file_loop_check(const char *filename, const char *fmt, > + const char *backing_file, > + const char *backing_format) {