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

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
...@@ -6639,10 +6639,13 @@ static int rbd_add_acquire_lock(struct rbd_device *rbd_dev) ...@@ -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); queue_delayed_work(rbd_dev->task_wq, &rbd_dev->lock_dwork, 0);
ret = wait_for_completion_killable_timeout(&rbd_dev->acquire_wait, ret = wait_for_completion_killable_timeout(&rbd_dev->acquire_wait,
ceph_timeout_jiffies(rbd_dev->opts->lock_timeout)); ceph_timeout_jiffies(rbd_dev->opts->lock_timeout));
if (ret > 0) if (ret > 0) {
ret = rbd_dev->acquire_err; ret = rbd_dev->acquire_err;
else if (!ret) } else {
cancel_delayed_work_sync(&rbd_dev->lock_dwork);
if (!ret)
ret = -ETIMEDOUT; ret = -ETIMEDOUT;
}
if (ret) { if (ret) {
rbd_warn(rbd_dev, "failed to acquire exclusive lock: %ld", ret); rbd_warn(rbd_dev, "failed to acquire exclusive lock: %ld", ret);
......
...@@ -384,8 +384,8 @@ static int parse_reply_info_readdir(void **p, void *end, ...@@ -384,8 +384,8 @@ static int parse_reply_info_readdir(void **p, void *end,
} }
done: done:
if (*p != end) /* Skip over any unrecognized fields */
goto bad; *p = end;
return 0; return 0;
bad: bad:
...@@ -406,12 +406,10 @@ static int parse_reply_info_filelock(void **p, void *end, ...@@ -406,12 +406,10 @@ static int parse_reply_info_filelock(void **p, void *end,
goto bad; goto bad;
info->filelock_reply = *p; info->filelock_reply = *p;
*p += sizeof(*info->filelock_reply);
if (unlikely(*p != end)) /* Skip over any unrecognized fields */
goto bad; *p = end;
return 0; return 0;
bad: bad:
return -EIO; return -EIO;
} }
...@@ -425,18 +423,21 @@ static int parse_reply_info_create(void **p, void *end, ...@@ -425,18 +423,21 @@ static int parse_reply_info_create(void **p, void *end,
{ {
if (features == (u64)-1 || if (features == (u64)-1 ||
(features & CEPH_FEATURE_REPLY_CREATE_INODE)) { (features & CEPH_FEATURE_REPLY_CREATE_INODE)) {
/* Malformed reply? */
if (*p == end) { if (*p == end) {
info->has_create_ino = false; info->has_create_ino = false;
} else { } else {
info->has_create_ino = true; 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)) /* Skip over any unrecognized fields */
goto bad; *p = end;
return 0; return 0;
bad: bad:
return -EIO; return -EIO;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment