Commit 6098d87e authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'ceph-for-6.8-rc2' of https://github.com/ceph/ceph-client

Pull ceph fixes from Ilya Dryomov:
 "A fix to avoid triggering an assert in some cases where RBD exclusive
  mappings are involved and a deprecated API cleanup"

* tag 'ceph-for-6.8-rc2' of https://github.com/ceph/ceph-client:
  rbd: don't move requests to the running list on errors
  rbd: remove usage of the deprecated ida_simple_*() API
parents f22face1 ded080c8
Loading
Loading
Loading
Loading
+19 −13
Original line number Diff line number Diff line
@@ -3452,14 +3452,15 @@ static bool rbd_lock_add_request(struct rbd_img_request *img_req)
static void rbd_lock_del_request(struct rbd_img_request *img_req)
{
	struct rbd_device *rbd_dev = img_req->rbd_dev;
	bool need_wakeup;
	bool need_wakeup = false;

	lockdep_assert_held(&rbd_dev->lock_rwsem);
	spin_lock(&rbd_dev->lock_lists_lock);
	rbd_assert(!list_empty(&img_req->lock_item));
	if (!list_empty(&img_req->lock_item)) {
		list_del_init(&img_req->lock_item);
		need_wakeup = (rbd_dev->lock_state == RBD_LOCK_STATE_RELEASING &&
			       list_empty(&rbd_dev->running_list));
	}
	spin_unlock(&rbd_dev->lock_lists_lock);
	if (need_wakeup)
		complete(&rbd_dev->releasing_wait);
@@ -3842,14 +3843,19 @@ static void wake_lock_waiters(struct rbd_device *rbd_dev, int result)
		return;
	}

	list_for_each_entry(img_req, &rbd_dev->acquiring_list, lock_item) {
	while (!list_empty(&rbd_dev->acquiring_list)) {
		img_req = list_first_entry(&rbd_dev->acquiring_list,
					   struct rbd_img_request, lock_item);
		mutex_lock(&img_req->state_mutex);
		rbd_assert(img_req->state == RBD_IMG_EXCLUSIVE_LOCK);
		if (!result)
			list_move_tail(&img_req->lock_item,
				       &rbd_dev->running_list);
		else
			list_del_init(&img_req->lock_item);
		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 bool locker_equal(const struct ceph_locker *lhs,
@@ -5326,7 +5332,7 @@ static void rbd_dev_release(struct device *dev)

	if (need_put) {
		destroy_workqueue(rbd_dev->task_wq);
		ida_simple_remove(&rbd_dev_id_ida, rbd_dev->dev_id);
		ida_free(&rbd_dev_id_ida, rbd_dev->dev_id);
	}

	rbd_dev_free(rbd_dev);
@@ -5402,8 +5408,8 @@ static struct rbd_device *rbd_dev_create(struct rbd_client *rbdc,
		return NULL;

	/* get an id and fill in device name */
	rbd_dev->dev_id = ida_simple_get(&rbd_dev_id_ida, 0,
					 minor_to_rbd_dev_id(1 << MINORBITS),
	rbd_dev->dev_id = ida_alloc_max(&rbd_dev_id_ida,
					minor_to_rbd_dev_id(1 << MINORBITS) - 1,
					GFP_KERNEL);
	if (rbd_dev->dev_id < 0)
		goto fail_rbd_dev;
@@ -5425,7 +5431,7 @@ static struct rbd_device *rbd_dev_create(struct rbd_client *rbdc,
	return rbd_dev;

fail_dev_id:
	ida_simple_remove(&rbd_dev_id_ida, rbd_dev->dev_id);
	ida_free(&rbd_dev_id_ida, rbd_dev->dev_id);
fail_rbd_dev:
	rbd_dev_free(rbd_dev);
	return NULL;