Skip to content
  • Hanna Reitz's avatar
    d4311314
    job: Context changes in job_completed_txn_abort() · d4311314
    Hanna Reitz authored
    
    
    Finalizing the job may cause its AioContext to change.  This is noted by
    job_exit(), which points at job_txn_apply() to take this fact into
    account.
    
    However, job_completed() does not necessarily invoke job_txn_apply()
    (through job_completed_txn_success()), but potentially also
    job_completed_txn_abort().  The latter stores the context in a local
    variable, and so always acquires the same context at its end that it has
    released in the beginning -- which may be a different context from the
    one that job_exit() releases at its end.  If it is different, qemu
    aborts ("qemu_mutex_unlock_impl: Operation not permitted").
    
    Drop the local @outer_ctx variable from job_completed_txn_abort(), and
    instead re-acquire the actual job's context at the end of the function,
    so job_exit() will release the same.
    
    Signed-off-by: default avatarHanna Reitz <hreitz@redhat.com>
    Reviewed-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
    Message-Id: <20211006151940.214590-2-hreitz@redhat.com>
    Signed-off-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
    d4311314
    job: Context changes in job_completed_txn_abort()
    Hanna Reitz authored
    
    
    Finalizing the job may cause its AioContext to change.  This is noted by
    job_exit(), which points at job_txn_apply() to take this fact into
    account.
    
    However, job_completed() does not necessarily invoke job_txn_apply()
    (through job_completed_txn_success()), but potentially also
    job_completed_txn_abort().  The latter stores the context in a local
    variable, and so always acquires the same context at its end that it has
    released in the beginning -- which may be a different context from the
    one that job_exit() releases at its end.  If it is different, qemu
    aborts ("qemu_mutex_unlock_impl: Operation not permitted").
    
    Drop the local @outer_ctx variable from job_completed_txn_abort(), and
    instead re-acquire the actual job's context at the end of the function,
    so job_exit() will release the same.
    
    Signed-off-by: default avatarHanna Reitz <hreitz@redhat.com>
    Reviewed-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
    Message-Id: <20211006151940.214590-2-hreitz@redhat.com>
    Signed-off-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Loading