diff mbox

[4/6] libceph: make sure redirect does not change namespace

Message ID 1454682697-84638-5-git-send-email-zyan@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Yan, Zheng Feb. 5, 2016, 2:31 p.m. UTC
Signed-off-by: Yan, Zheng <zyan@redhat.com>
---
 net/ceph/osd_client.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)
diff mbox

Patch

diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index 0eb27ad..1d13605 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -1725,10 +1725,23 @@  static int ceph_oloc_decode(void **p, void *end,
 	}
 
 	if (struct_v >= 5) {
+		bool changed = false;
 		u32 ns_len = ceph_decode_32(p);
 		if (ns_len > 0) {
 			ceph_decode_need(p, end, ns_len, e_inval);
+			if (oloc->pool != -1 &&
+			    (!oloc->pool_ns ||
+			     ceph_compare_pool_ns(oloc->pool_ns, *p, ns_len)))
+				changed = true;
 			*p += ns_len;
+		} else {
+			if (oloc->pool != -1 && oloc->pool_ns)
+				changed = true;
+		}
+		if (changed) {
+			/* redirect changes namespace */
+			pr_warn("ceph_object_locator::nspace is changed\n");
+			goto e_inval;
 		}
 	}
 
@@ -1901,7 +1914,9 @@  static void handle_reply(struct ceph_osd_client *osdc, struct ceph_msg *msg)
 	}
 
 	if (decode_redir) {
+		redir.oloc.pool_ns = req->r_target_oloc.pool_ns;
 		err = ceph_redirect_decode(&p, end, &redir);
+		redir.oloc.pool_ns = NULL;
 		if (err)
 			goto bad_put;
 	} else {