Loading net/ceph/osdmap.c +11 −28 Original line number Diff line number Diff line Loading @@ -2437,40 +2437,23 @@ static void apply_upmap(struct ceph_osdmap *osdmap, for (i = 0; i < pg->pg_upmap.len; i++) raw->osds[i] = pg->pg_upmap.osds[i]; raw->size = pg->pg_upmap.len; return; /* check and apply pg_upmap_items, if any */ } pg = lookup_pg_mapping(&osdmap->pg_upmap_items, pgid); if (pg) { /* * Note: this approach does not allow a bidirectional swap, * e.g., [[1,2],[2,1]] applied to [0,1,2] -> [0,2,1]. */ for (i = 0; i < pg->pg_upmap_items.len; i++) { int from = pg->pg_upmap_items.from_to[i][0]; int to = pg->pg_upmap_items.from_to[i][1]; int pos = -1; bool exists = false; /* make sure replacement doesn't already appear */ for (j = 0; j < raw->size; j++) { int osd = raw->osds[j]; for (i = 0; i < raw->size; i++) { for (j = 0; j < pg->pg_upmap_items.len; j++) { int from = pg->pg_upmap_items.from_to[j][0]; int to = pg->pg_upmap_items.from_to[j][1]; if (osd == to) { exists = true; break; } /* ignore mapping if target is marked out */ if (osd == from && pos < 0 && !(to != CRUSH_ITEM_NONE && if (from == raw->osds[i]) { if (!(to != CRUSH_ITEM_NONE && to < osdmap->max_osd && osdmap->osd_weight[to] == 0)) { pos = j; } osdmap->osd_weight[to] == 0)) raw->osds[i] = to; break; } if (!exists && pos >= 0) { raw->osds[pos] = to; return; } } } Loading Loading
net/ceph/osdmap.c +11 −28 Original line number Diff line number Diff line Loading @@ -2437,40 +2437,23 @@ static void apply_upmap(struct ceph_osdmap *osdmap, for (i = 0; i < pg->pg_upmap.len; i++) raw->osds[i] = pg->pg_upmap.osds[i]; raw->size = pg->pg_upmap.len; return; /* check and apply pg_upmap_items, if any */ } pg = lookup_pg_mapping(&osdmap->pg_upmap_items, pgid); if (pg) { /* * Note: this approach does not allow a bidirectional swap, * e.g., [[1,2],[2,1]] applied to [0,1,2] -> [0,2,1]. */ for (i = 0; i < pg->pg_upmap_items.len; i++) { int from = pg->pg_upmap_items.from_to[i][0]; int to = pg->pg_upmap_items.from_to[i][1]; int pos = -1; bool exists = false; /* make sure replacement doesn't already appear */ for (j = 0; j < raw->size; j++) { int osd = raw->osds[j]; for (i = 0; i < raw->size; i++) { for (j = 0; j < pg->pg_upmap_items.len; j++) { int from = pg->pg_upmap_items.from_to[j][0]; int to = pg->pg_upmap_items.from_to[j][1]; if (osd == to) { exists = true; break; } /* ignore mapping if target is marked out */ if (osd == from && pos < 0 && !(to != CRUSH_ITEM_NONE && if (from == raw->osds[i]) { if (!(to != CRUSH_ITEM_NONE && to < osdmap->max_osd && osdmap->osd_weight[to] == 0)) { pos = j; } osdmap->osd_weight[to] == 0)) raw->osds[i] = to; break; } if (!exists && pos >= 0) { raw->osds[pos] = to; return; } } } Loading