@ -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 ] ;
if ( osd = = to ) {
exists = true ;
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 ( from = = raw - > osds [ i ] ) {
if ( ! ( to ! = CRUSH_ITEM_NONE & &
to < osdmap - > max_osd & &
osdmap - > osd_weight [ to ] = = 0 ) )
raw - > osds [ i ] = to ;
break ;
}
/* ignore mapping if target is marked out */
if ( osd = = from & & pos < 0 & &
! ( to ! = CRUSH_ITEM_NONE & &
to < osdmap - > max_osd & &
osdmap - > osd_weight [ to ] = = 0 ) ) {
pos = j ;
}
}
if ( ! exists & & pos > = 0 ) {
raw - > osds [ pos ] = to ;
return ;
}
}
}