On Thu, Aug 03, 2017 at 05:02:57PM +0200, Kevin Wolf wrote: > Commit 8ee03995 refactored the code incorrectly and broke the release of > permissions on the old BDS. Instead of changing the permissions to the > new required values after removing the old BDS from the list of > children, it only re-obtains the permissions it already had. > > Change the order of operations so that the old BDS is removed again > before calculating the new required permissions. > > Signed-off-by: Kevin Wolf <kw...@redhat.com> > --- > block.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/block.c b/block.c > index ce9cce7b3c..ab908cdc50 100644 > --- a/block.c > +++ b/block.c > @@ -1933,6 +1933,8 @@ static void bdrv_replace_child(BdrvChild *child, > BlockDriverState *new_bs) > BlockDriverState *old_bs = child->bs; > uint64_t perm, shared_perm; > > + bdrv_replace_child_noperm(child, new_bs); > + > if (old_bs) { > /* Update permissions for old node. This is guaranteed to succeed > * because we're just taking a parent away, so we're loosening > @@ -1942,8 +1944,6 @@ static void bdrv_replace_child(BdrvChild *child, > BlockDriverState *new_bs) > bdrv_set_perm(old_bs, perm, shared_perm); > } > > - bdrv_replace_child_noperm(child, new_bs); > - > if (new_bs) { > bdrv_get_cumulative_perm(new_bs, &perm, &shared_perm); > bdrv_set_perm(new_bs, perm, shared_perm); > -- > 2.13.3 > >
Reviewed-by: Jeff Cody <jc...@redhat.com>