diff options
author | Yan, Zheng <zyan@redhat.com> | 2016-06-13 19:05:13 +0800 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2016-07-28 02:55:37 +0200 |
commit | cd08e0a274ba6215b79c83809b331e8af17196ba (patch) | |
tree | 47f2224fe1be44a30239b4a355eb262373919ab5 /net/ceph | |
parent | 30c156d9951e0aa88202707d80c583b0a09d3167 (diff) | |
download | linux-stable-cd08e0a274ba6215b79c83809b331e8af17196ba.tar.gz linux-stable-cd08e0a274ba6215b79c83809b331e8af17196ba.tar.bz2 linux-stable-cd08e0a274ba6215b79c83809b331e8af17196ba.zip |
libceph: make sure redirect does not change namespace
Signed-off-by: Yan, Zheng <zyan@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Diffstat (limited to 'net/ceph')
-rw-r--r-- | net/ceph/osd_client.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c index b68cc15e9cdc..b5ec09612ff7 100644 --- a/net/ceph/osd_client.c +++ b/net/ceph/osd_client.c @@ -2608,10 +2608,23 @@ static int ceph_oloc_decode(void **p, void *end, } if (struct_v >= 5) { + bool changed = false; + len = ceph_decode_32(p); if (len > 0) { ceph_decode_need(p, end, len, e_inval); + if (!oloc->pool_ns || + ceph_compare_string(oloc->pool_ns, *p, len)) + changed = true; *p += len; + } else { + if (oloc->pool_ns) + changed = true; + } + if (changed) { + /* redirect changes namespace */ + pr_warn("ceph_object_locator::nspace is changed\n"); + goto e_inval; } } @@ -2820,7 +2833,9 @@ static void handle_reply(struct ceph_osd *osd, struct ceph_msg *msg) goto out_unlock_session; } + m.redirect.oloc.pool_ns = req->r_t.target_oloc.pool_ns; ret = decode_MOSDOpReply(msg, &m); + m.redirect.oloc.pool_ns = NULL; if (ret) { pr_err("failed to decode MOSDOpReply for tid %llu: %d\n", req->r_tid, ret); |