diff --git a/drivers/block/rnbd/rnbd-srv.c b/drivers/block/rnbd/rnbd-srv.c index 1e3de82fd70b..1cfa2c580759 100644 --- a/drivers/block/rnbd/rnbd-srv.c +++ b/drivers/block/rnbd/rnbd-srv.c @@ -360,14 +360,15 @@ static void process_msg_close(struct rnbd_srv_session *srv_sess, trace_process_msg_close(srv_sess, close_msg); - sess_dev = rnbd_get_sess_dev(le32_to_cpu(close_msg->device_id), - srv_sess); - if (IS_ERR(sess_dev)) - return; - - rnbd_put_sess_dev(sess_dev); + /* + * Each teardown of a sess_dev runs under srv_sess->lock and erases the + * ID, so an entry that is found under the lock is alive. + */ mutex_lock(&srv_sess->lock); - rnbd_srv_destroy_dev_session_sysfs(sess_dev); + sess_dev = xa_load(&srv_sess->index_idr, + le32_to_cpu(close_msg->device_id)); + if (sess_dev) + rnbd_srv_destroy_dev_session_sysfs(sess_dev); mutex_unlock(&srv_sess->lock); }