d80b60f throttle: Fix crash on reopen

1 file Authored by Alberto Garcia 5 years ago, Committed by Michael Roth 5 years ago,
    throttle: Fix crash on reopen
    
    The throttle block filter can be reopened, and with this it is
    possible to change the throttle group that the filter belongs to.
    
    The way the code does that is the following:
    
      - On throttle_reopen_prepare(): create a new ThrottleGroupMember
        and attach it to the new throttle group.
    
      - On throttle_reopen_commit(): detach the old ThrottleGroupMember,
        delete it and replace it with the new one.
    
    The problem with this is that by replacing the ThrottleGroupMember the
    previous value of io_limits_disabled is lost, causing an assertion
    failure in throttle_co_drain_end().
    
    This problem can be reproduced by reopening a throttle node:
    
       $QEMU -monitor stdio
       -object throttle-group,id=tg0,x-iops-total=1000 \
       -blockdev node-name=hd0,driver=qcow2,file.driver=file,file.filename=hd.qcow2 \
       -blockdev node-name=root,driver=throttle,throttle-group=tg0,file=hd0,read-only=on
    
       (qemu) block_stream root
       block/throttle.c:214: throttle_co_drain_end: Assertion `tgm->io_limits_disabled' failed.
    
    Since we only want to change the throttle group on reopen there's no
    need to create a ThrottleGroupMember and discard the old one. It's
    easier if we simply detach it from its current group and attach it to
    the new one.
    
    Signed-off-by: Alberto Garcia <berto@igalia.com>
    Message-id: 20180608151536.7378-1-berto@igalia.com
    Signed-off-by: Max Reitz <mreitz@redhat.com>
    (cherry picked from commit bc33c047d1ec0b35c9cd8be62bcefae2da28654f)
    Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
    
        
file modified
+33 -21