diff options
| -rw-r--r-- | drivers/block/rnbd/rnbd-srv.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/block/rnbd/rnbd-srv.c b/drivers/block/rnbd/rnbd-srv.c index 1cfa2c580759..1c80e8fe0267 100644 --- a/drivers/block/rnbd/rnbd-srv.c +++ b/drivers/block/rnbd/rnbd-srv.c @@ -431,7 +431,7 @@ static struct rnbd_srv_sess_dev if (!sess_dev) return ERR_PTR(-ENOMEM); - error = xa_alloc(&srv_sess->index_idr, &sess_dev->device_id, sess_dev, + error = xa_alloc(&srv_sess->index_idr, &sess_dev->device_id, NULL, xa_limit_32b, GFP_NOWAIT); if (error < 0) { pr_warn("Allocating idr failed, err: %d\n", error); @@ -802,6 +802,13 @@ static int process_msg_open(struct rnbd_srv_session *srv_sess, list_add(&srv_sess_dev->dev_list, &srv_dev->sess_dev_list); mutex_unlock(&srv_dev->lock); + /* + * Nothing fails from here on, so let I/O messages find the sess_dev. + * The ID is reserved, so this store allocates nothing. + */ + xa_store(&srv_sess->index_idr, srv_sess_dev->device_id, srv_sess_dev, + GFP_KERNEL); + rnbd_srv_info(srv_sess_dev, "Opened device '%s'\n", srv_dev->name); kfree(full_path); @@ -813,7 +820,6 @@ fill_response: free_srv_sess_dev: xa_erase(&srv_sess->index_idr, srv_sess_dev->device_id); - synchronize_rcu(); kfree(srv_sess_dev); srv_dev_put: if (open_msg->access_mode != RNBD_ACCESS_RO) { |
