• Alex Elder's avatar
    ceph: let osd client clean up for interrupted request · 7d7d51ce
    Alex Elder authored
    In ceph_sync_write(), if a safe callback is supplied with a request,
    and an error is returned by ceph_osdc_wait_request(), a block of
    code is executed to remove the request from the unsafe writes list
    and drop references to capabilities acquired just prior to a call to
    ceph_osdc_wait_request().
    
    The only function used for this callback is sync_write_commit(),
    and it does *exactly* what that block of error handling code does.
    
    Now in ceph_osdc_wait_request(), if an error occurs (due to an
    interupt during a wait_for_completion_interruptible() call),
    complete_request() gets called, and that calls the request's
    safe_callback method if it's defined.
    
    So this means that this cleanup activity gets called twice in this
    case, which is erroneous (and in fact leads to a crash).
    
    Fix this by just letting the osd client handle the cleanup in
    the event of an interrupt.
    
    This resolves one problem mentioned in:
        http://tracker.ceph.com/issues/4706Signed-off-by: default avatarAlex Elder <elder@inktank.com>
    Reviewed-by: default avatarYan, Zheng <zheng.z.yan@intel.com>
    7d7d51ce
file.c 23.6 KB