goto out;
  }
  
- static void wake_requests(struct rbd_device *rbd_dev, bool wake_all)
+ /*
+  * Either image request state machine(s) or rbd_add_acquire_lock()
+  * (i.e. "rbd map").
+  */
+ static void wake_lock_waiters(struct rbd_device *rbd_dev, int result)
  {
-       dout("%s rbd_dev %p wake_all %d\n", __func__, rbd_dev, wake_all);
+       struct rbd_img_request *img_req;
+ 
+       dout("%s rbd_dev %p result %d\n", __func__, rbd_dev, result);
 -      lockdep_assert_held_exclusive(&rbd_dev->lock_rwsem);
++      lockdep_assert_held_write(&rbd_dev->lock_rwsem);
  
        cancel_delayed_work(&rbd_dev->lock_dwork);
-       if (wake_all)
-               wake_up_all(&rbd_dev->lock_waitq);
-       else
-               wake_up(&rbd_dev->lock_waitq);
+       if (!completion_done(&rbd_dev->acquire_wait)) {
+               rbd_assert(list_empty(&rbd_dev->acquiring_list) &&
+                          list_empty(&rbd_dev->running_list));
+               rbd_dev->acquire_err = result;
+               complete_all(&rbd_dev->acquire_wait);
+               return;
+       }
+ 
+       list_for_each_entry(img_req, &rbd_dev->acquiring_list, lock_item) {
+               mutex_lock(&img_req->state_mutex);
+               rbd_assert(img_req->state == RBD_IMG_EXCLUSIVE_LOCK);
+               rbd_img_schedule(img_req, result);
+               mutex_unlock(&img_req->state_mutex);
+       }
+ 
+       list_splice_tail_init(&rbd_dev->acquiring_list, &rbd_dev->running_list);
  }
  
  static int get_lock_owner_info(struct rbd_device *rbd_dev,
        }
  }
  
- /*
-  * lock_rwsem must be held for write
-  */
- static bool rbd_release_lock(struct rbd_device *rbd_dev)
+ static bool rbd_quiesce_lock(struct rbd_device *rbd_dev)
  {
-       dout("%s rbd_dev %p read lock_state %d\n", __func__, rbd_dev,
-            rbd_dev->lock_state);
+       bool need_wait;
+ 
+       dout("%s rbd_dev %p\n", __func__, rbd_dev);
 -      lockdep_assert_held_exclusive(&rbd_dev->lock_rwsem);
++      lockdep_assert_held_write(&rbd_dev->lock_rwsem);
+ 
        if (rbd_dev->lock_state != RBD_LOCK_STATE_LOCKED)
                return false;