• Ilya Dryomov's avatar
    libceph: always signal completion when done · c297eb42
    Ilya Dryomov authored
    r_safe_completion is currently, and has always been, signaled only if
    on-disk ack was requested.  It's there for fsync and syncfs, which wait
    for in-flight writes to flush - all data write requests set ONDISK.
    
    However, the pool perm check code introduced in 4.2 sends a write
    request with only ACK set.  An unfortunately timed syncfs can then hang
    forever: r_safe_completion won't be signaled because only an unsafe
    reply was requested.
    
    We could patch ceph_osdc_sync() to skip !ONDISK write requests, but
    that is somewhat incomplete and yet another special case.  Instead,
    rename this completion to r_done_completion and always signal it when
    the OSD client is done with the request, whether unsafe, safe, or
    error.  This is a bit cleaner and helps with the cancellation code.
    Reported-by: default avatarYan, Zheng <zyan@redhat.com>
    Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
    c297eb42
file.c 45.1 KB