diff options
-rw-r--r-- | net/ceph/osdmap.c | 39 |
1 files changed, 11 insertions, 28 deletions
diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c index 2586e5546143..0bec71fa712e 100644 --- a/net/ceph/osdmap.c +++ b/net/ceph/osdmap.c | |||
@@ -2437,40 +2437,23 @@ static void apply_upmap(struct ceph_osdmap *osdmap, | |||
2437 | for (i = 0; i < pg->pg_upmap.len; i++) | 2437 | for (i = 0; i < pg->pg_upmap.len; i++) |
2438 | raw->osds[i] = pg->pg_upmap.osds[i]; | 2438 | raw->osds[i] = pg->pg_upmap.osds[i]; |
2439 | raw->size = pg->pg_upmap.len; | 2439 | raw->size = pg->pg_upmap.len; |
2440 | return; | 2440 | /* check and apply pg_upmap_items, if any */ |
2441 | } | 2441 | } |
2442 | 2442 | ||
2443 | pg = lookup_pg_mapping(&osdmap->pg_upmap_items, pgid); | 2443 | pg = lookup_pg_mapping(&osdmap->pg_upmap_items, pgid); |
2444 | if (pg) { | 2444 | if (pg) { |
2445 | /* | 2445 | for (i = 0; i < raw->size; i++) { |
2446 | * Note: this approach does not allow a bidirectional swap, | 2446 | for (j = 0; j < pg->pg_upmap_items.len; j++) { |
2447 | * e.g., [[1,2],[2,1]] applied to [0,1,2] -> [0,2,1]. | 2447 | int from = pg->pg_upmap_items.from_to[j][0]; |
2448 | */ | 2448 | int to = pg->pg_upmap_items.from_to[j][1]; |
2449 | for (i = 0; i < pg->pg_upmap_items.len; i++) { | 2449 | |
2450 | int from = pg->pg_upmap_items.from_to[i][0]; | 2450 | if (from == raw->osds[i]) { |
2451 | int to = pg->pg_upmap_items.from_to[i][1]; | 2451 | if (!(to != CRUSH_ITEM_NONE && |
2452 | int pos = -1; | 2452 | to < osdmap->max_osd && |
2453 | bool exists = false; | 2453 | osdmap->osd_weight[to] == 0)) |
2454 | 2454 | raw->osds[i] = to; | |
2455 | /* make sure replacement doesn't already appear */ | ||
2456 | for (j = 0; j < raw->size; j++) { | ||
2457 | int osd = raw->osds[j]; | ||
2458 | |||
2459 | if (osd == to) { | ||
2460 | exists = true; | ||
2461 | break; | 2455 | break; |
2462 | } | 2456 | } |
2463 | /* ignore mapping if target is marked out */ | ||
2464 | if (osd == from && pos < 0 && | ||
2465 | !(to != CRUSH_ITEM_NONE && | ||
2466 | to < osdmap->max_osd && | ||
2467 | osdmap->osd_weight[to] == 0)) { | ||
2468 | pos = j; | ||
2469 | } | ||
2470 | } | ||
2471 | if (!exists && pos >= 0) { | ||
2472 | raw->osds[pos] = to; | ||
2473 | return; | ||
2474 | } | 2457 | } |
2475 | } | 2458 | } |
2476 | } | 2459 | } |