@@ -3452,14 +3452,15 @@ static bool rbd_lock_add_request(struct rbd_img_request *img_req)
3452
3452
static void rbd_lock_del_request (struct rbd_img_request * img_req )
3453
3453
{
3454
3454
struct rbd_device * rbd_dev = img_req -> rbd_dev ;
3455
- bool need_wakeup ;
3455
+ bool need_wakeup = false ;
3456
3456
3457
3457
lockdep_assert_held (& rbd_dev -> lock_rwsem );
3458
3458
spin_lock (& rbd_dev -> lock_lists_lock );
3459
- rbd_assert (!list_empty (& img_req -> lock_item ));
3460
- list_del_init (& img_req -> lock_item );
3461
- need_wakeup = (rbd_dev -> lock_state == RBD_LOCK_STATE_RELEASING &&
3462
- list_empty (& rbd_dev -> running_list ));
3459
+ if (!list_empty (& img_req -> lock_item )) {
3460
+ list_del_init (& img_req -> lock_item );
3461
+ need_wakeup = (rbd_dev -> lock_state == RBD_LOCK_STATE_RELEASING &&
3462
+ list_empty (& rbd_dev -> running_list ));
3463
+ }
3463
3464
spin_unlock (& rbd_dev -> lock_lists_lock );
3464
3465
if (need_wakeup )
3465
3466
complete (& rbd_dev -> releasing_wait );
@@ -3842,14 +3843,19 @@ static void wake_lock_waiters(struct rbd_device *rbd_dev, int result)
3842
3843
return ;
3843
3844
}
3844
3845
3845
- list_for_each_entry (img_req , & rbd_dev -> acquiring_list , lock_item ) {
3846
+ while (!list_empty (& rbd_dev -> acquiring_list )) {
3847
+ img_req = list_first_entry (& rbd_dev -> acquiring_list ,
3848
+ struct rbd_img_request , lock_item );
3846
3849
mutex_lock (& img_req -> state_mutex );
3847
3850
rbd_assert (img_req -> state == RBD_IMG_EXCLUSIVE_LOCK );
3851
+ if (!result )
3852
+ list_move_tail (& img_req -> lock_item ,
3853
+ & rbd_dev -> running_list );
3854
+ else
3855
+ list_del_init (& img_req -> lock_item );
3848
3856
rbd_img_schedule (img_req , result );
3849
3857
mutex_unlock (& img_req -> state_mutex );
3850
3858
}
3851
-
3852
- list_splice_tail_init (& rbd_dev -> acquiring_list , & rbd_dev -> running_list );
3853
3859
}
3854
3860
3855
3861
static bool locker_equal (const struct ceph_locker * lhs ,
@@ -5326,7 +5332,7 @@ static void rbd_dev_release(struct device *dev)
5326
5332
5327
5333
if (need_put ) {
5328
5334
destroy_workqueue (rbd_dev -> task_wq );
5329
- ida_simple_remove (& rbd_dev_id_ida , rbd_dev -> dev_id );
5335
+ ida_free (& rbd_dev_id_ida , rbd_dev -> dev_id );
5330
5336
}
5331
5337
5332
5338
rbd_dev_free (rbd_dev );
@@ -5402,9 +5408,9 @@ static struct rbd_device *rbd_dev_create(struct rbd_client *rbdc,
5402
5408
return NULL ;
5403
5409
5404
5410
/* get an id and fill in device name */
5405
- rbd_dev -> dev_id = ida_simple_get (& rbd_dev_id_ida , 0 ,
5406
- minor_to_rbd_dev_id (1 << MINORBITS ),
5407
- GFP_KERNEL );
5411
+ rbd_dev -> dev_id = ida_alloc_max (& rbd_dev_id_ida ,
5412
+ minor_to_rbd_dev_id (1 << MINORBITS ) - 1 ,
5413
+ GFP_KERNEL );
5408
5414
if (rbd_dev -> dev_id < 0 )
5409
5415
goto fail_rbd_dev ;
5410
5416
@@ -5425,7 +5431,7 @@ static struct rbd_device *rbd_dev_create(struct rbd_client *rbdc,
5425
5431
return rbd_dev ;
5426
5432
5427
5433
fail_dev_id :
5428
- ida_simple_remove (& rbd_dev_id_ida , rbd_dev -> dev_id );
5434
+ ida_free (& rbd_dev_id_ida , rbd_dev -> dev_id );
5429
5435
fail_rbd_dev :
5430
5436
rbd_dev_free (rbd_dev );
5431
5437
return NULL ;
0 commit comments