• Bob Liu's avatar
    xen-blkfront: don't call talk_to_blkback when already connected to blkback · efd15352
    Bob Liu authored
    Sometimes blkfront may twice receive blkback_changed() notification
    (XenbusStateConnected) after migration, which will cause
    talk_to_blkback() to be called twice too and confuse xen-blkback.
    
    The flow is as follow:
       blkfront                                        blkback
    blkfront_resume()
     > talk_to_blkback()
      > Set blkfront to XenbusStateInitialised
                                                    front changed()
                                                     > Connect()
                                                      > Set blkback to XenbusStateConnected
    
    blkback_changed()
     > Skip talk_to_blkback()
       because frontstate == XenbusStateInitialised
     > blkfront_connect()
      > Set blkfront to XenbusStateConnected
    
    -----
    And here we get another XenbusStateConnected notification leading
    to:
    -----
    blkback_changed()
     > because now frontstate != XenbusStateInitialised
       talk_to_blkback() is also called again
      > blkfront state changed from
      XenbusStateConnected to XenbusStateInitialised
        (Which is not correct!)
    
    						front_changed():
                                                     > Do nothing because blkback
                                                       already in XenbusStateConnected
    
    Now blkback is in XenbusStateConnected but blkfront is still
    in XenbusStateInitialised - leading to no disks.
    
    Poking of the XenbusStateConnected state is allowed (to deal with
    block disk change) and has to be dealt with. The most likely
    cause of this bug are custom udev scripts hooking up the disks
    and then validating the size.
    Signed-off-by: default avatarBob Liu <bob.liu@oracle.com>
    Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    efd15352
xen-blkfront.c 72.3 KB