|
@@ -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);
|