• Jack Wang's avatar
    block/rnbd-clt: avoid module unload race with close confirmation · 3a21777c
    Jack Wang authored
    We had kernel panic, it is caused by unload module and last
    close confirmation.
    
    call trace:
    [1196029.743127]  free_sess+0x15/0x50 [rtrs_client]
    [1196029.743128]  rtrs_clt_close+0x4c/0x70 [rtrs_client]
    [1196029.743129]  ? rnbd_clt_unmap_device+0x1b0/0x1b0 [rnbd_client]
    [1196029.743130]  close_rtrs+0x25/0x50 [rnbd_client]
    [1196029.743131]  rnbd_client_exit+0x93/0xb99 [rnbd_client]
    [1196029.743132]  __x64_sys_delete_module+0x190/0x260
    
    And in the crashdump confirmation kworker is also running.
    PID: 6943   TASK: ffff9e2ac8098000  CPU: 4   COMMAND: "kworker/4:2"
     #0 [ffffb206cf337c30] __schedule at ffffffff9f93f891
     #1 [ffffb206cf337cc8] schedule at ffffffff9f93fe98
     #2 [ffffb206cf337cd0] schedule_timeout at ffffffff9f943938
     #3 [ffffb206cf337d50] wait_for_completion at ffffffff9f9410a7
     #4 [ffffb206cf337da0] __flush_work at ffffffff9f08ce0e
     #5 [ffffb206cf337e20] rtrs_clt_close_conns at ffffffffc0d5f668 [rtrs_client]
     #6 [ffffb206cf337e48] rtrs_clt_close at ffffffffc0d5f801 [rtrs_client]
     #7 [ffffb206cf337e68] close_rtrs at ffffffffc0d26255 [rnbd_client]
     #8 [ffffb206cf337e78] free_sess at ffffffffc0d262ad [rnbd_client]
     #9 [ffffb206cf337e88] rnbd_clt_put_dev at ffffffffc0d266a7 [rnbd_client]
    
    The problem is both code path try to close same session, which lead to
    panic.
    
    To fix it, just skip the sess if the refcount already drop to 0.
    
    Fixes: f7a7a5c2 ("block/rnbd: client: main functionality")
    Signed-off-by: default avatarJack Wang <jinpu.wang@cloud.ionos.com>
    Reviewed-by: default avatarGioh Kim <gi-oh.kim@cloud.ionos.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    3a21777c
rnbd-clt.c 43.4 KB