]> git.ipfire.org Git - people/arne_f/kernel.git/commitdiff
libceph: use target pi for calc_target() calculations
authorIlya Dryomov <idryomov@gmail.com>
Thu, 15 Jun 2017 14:30:55 +0000 (16:30 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Fri, 7 Jul 2017 15:25:17 +0000 (17:25 +0200)
For luminous and beyond we are encoding the actual spgid, which
requires operating with the correct pg_num, i.e. that of the target
pool.

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
net/ceph/osd_client.c

index c050e28d3c97fdb9c03672f81d6905d90dff10c0..ce0055dc7544826e36651ec3adce1f218426f87f 100644 (file)
@@ -1306,7 +1306,7 @@ static bool target_should_be_paused(struct ceph_osd_client *osdc,
                       ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL) ||
                       __pool_full(pi);
 
-       WARN_ON(pi->id != t->base_oloc.pool);
+       WARN_ON(pi->id != t->target_oloc.pool);
        return ((t->flags & CEPH_OSD_FLAG_READ) && pauserd) ||
               ((t->flags & CEPH_OSD_FLAG_WRITE) && pausewr) ||
               (osdc->osdmap->epoch < osdc->epoch_barrier);
@@ -1359,6 +1359,13 @@ static enum calc_target_result calc_target(struct ceph_osd_client *osdc,
                        t->target_oloc.pool = pi->read_tier;
                if (t->flags & CEPH_OSD_FLAG_WRITE && pi->write_tier >= 0)
                        t->target_oloc.pool = pi->write_tier;
+
+               pi = ceph_pg_pool_by_id(osdc->osdmap, t->target_oloc.pool);
+               if (!pi) {
+                       t->osd = CEPH_HOMELESS_OSD;
+                       ct_res = CALC_TARGET_POOL_DNE;
+                       goto out;
+               }
        }
 
        ret = ceph_object_locator_to_pg(osdc->osdmap, &t->target_oid,