Commit 6b95cf9b authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'ceph-for-5.4-rc4' of git://github.com/ceph/ceph-client

Pull ceph fixes from Ilya Dryomov:
 "A future-proofing decoding fix from Jeff intended for stable and a
  patch for a mostly benign race from Dongsheng"

* tag 'ceph-for-5.4-rc4' of git://github.com/ceph/ceph-client:
  rbd: cancel lock_dwork if the wait is interrupted
  ceph: just skip unrecognized info in ceph_reply_info_extra
parents fb8527e5 25e6be21
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -6639,10 +6639,13 @@ static int rbd_add_acquire_lock(struct rbd_device *rbd_dev)
	queue_delayed_work(rbd_dev->task_wq, &rbd_dev->lock_dwork, 0);
	ret = wait_for_completion_killable_timeout(&rbd_dev->acquire_wait,
			    ceph_timeout_jiffies(rbd_dev->opts->lock_timeout));
	if (ret > 0)
	if (ret > 0) {
		ret = rbd_dev->acquire_err;
	else if (!ret)
	} else {
		cancel_delayed_work_sync(&rbd_dev->lock_dwork);
		if (!ret)
			ret = -ETIMEDOUT;
	}

	if (ret) {
		rbd_warn(rbd_dev, "failed to acquire exclusive lock: %ld", ret);
+11 −10
Original line number Diff line number Diff line
@@ -384,8 +384,8 @@ static int parse_reply_info_readdir(void **p, void *end,
	}

done:
	if (*p != end)
		goto bad;
	/* Skip over any unrecognized fields */
	*p = end;
	return 0;

bad:
@@ -406,12 +406,10 @@ static int parse_reply_info_filelock(void **p, void *end,
		goto bad;

	info->filelock_reply = *p;
	*p += sizeof(*info->filelock_reply);

	if (unlikely(*p != end))
		goto bad;
	/* Skip over any unrecognized fields */
	*p = end;
	return 0;

bad:
	return -EIO;
}
@@ -425,18 +423,21 @@ static int parse_reply_info_create(void **p, void *end,
{
	if (features == (u64)-1 ||
	    (features & CEPH_FEATURE_REPLY_CREATE_INODE)) {
		/* Malformed reply? */
		if (*p == end) {
			info->has_create_ino = false;
		} else {
			info->has_create_ino = true;
			info->ino = ceph_decode_64(p);
			ceph_decode_64_safe(p, end, info->ino, bad);
		}
	} else {
		if (*p != end)
			goto bad;
	}

	if (unlikely(*p != end))
		goto bad;
	/* Skip over any unrecognized fields */
	*p = end;
	return 0;

bad:
	return -EIO;
}