|
@@ -300,27 +300,22 @@ static u8 r2net_num_from_nn(struct r2net_node *nn)
|
|
|
|
|
|
static int r2net_prep_nsw(struct r2net_node *nn, struct r2net_status_wait *nsw)
|
|
|
{
|
|
|
- int ret = 0;
|
|
|
+ int ret;
|
|
|
|
|
|
- do {
|
|
|
- if (!idr_pre_get(&nn->nn_status_idr, GFP_ATOMIC)) {
|
|
|
- ret = -EAGAIN;
|
|
|
- break;
|
|
|
- }
|
|
|
- spin_lock(&nn->nn_lock);
|
|
|
- ret = idr_get_new(&nn->nn_status_idr, nsw, &nsw->ns_id);
|
|
|
- if (ret == 0)
|
|
|
- list_add_tail(&nsw->ns_node_item,
|
|
|
- &nn->nn_status_list);
|
|
|
- spin_unlock(&nn->nn_lock);
|
|
|
- } while (ret == -EAGAIN);
|
|
|
+ spin_lock(&nn->nn_lock);
|
|
|
+ ret = idr_alloc(&nn->nn_status_idr, nsw, 0, 0, GFP_ATOMIC);
|
|
|
+ if (ret >= 0) {
|
|
|
+ nsw->ns_id = ret;
|
|
|
+ list_add_tail(&nsw->ns_node_item, &nn->nn_status_list);
|
|
|
+ }
|
|
|
+ spin_unlock(&nn->nn_lock);
|
|
|
|
|
|
- if (ret == 0) {
|
|
|
+ if (ret >= 0) {
|
|
|
init_waitqueue_head(&nsw->ns_wq);
|
|
|
nsw->ns_sys_status = R2NET_ERR_NONE;
|
|
|
nsw->ns_status = 0;
|
|
|
+ return 0;
|
|
|
}
|
|
|
-
|
|
|
return ret;
|
|
|
}
|
|
|
|