mirror of https://gitee.com/openkylin/linux.git
ceph: fix pg pool decoding from incremental osdmap update
The incremental map decoding of pg pool updates wasn't skipping the snaps and removed_snaps vectors. This caused osd requests to stall when pool snapshots were created or fs snapshots were deleted. Use a common helper for full and incremental map decoders that decodes pools properly. Signed-off-by: Sage Weil <sage@newdream.net>
This commit is contained in:
parent
80fc7314a7
commit
efd7576b23
|
@ -480,6 +480,14 @@ static struct ceph_pg_pool_info *__lookup_pg_pool(struct rb_root *root, int id)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __decode_pool(void **p, struct ceph_pg_pool_info *pi)
|
||||||
|
{
|
||||||
|
ceph_decode_copy(p, &pi->v, sizeof(pi->v));
|
||||||
|
calc_pg_masks(pi);
|
||||||
|
*p += le32_to_cpu(pi->v.num_snaps) * sizeof(u64);
|
||||||
|
*p += le32_to_cpu(pi->v.num_removed_snap_intervals) * sizeof(u64) * 2;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* decode a full map.
|
* decode a full map.
|
||||||
*/
|
*/
|
||||||
|
@ -526,12 +534,8 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end)
|
||||||
ev, CEPH_PG_POOL_VERSION);
|
ev, CEPH_PG_POOL_VERSION);
|
||||||
goto bad;
|
goto bad;
|
||||||
}
|
}
|
||||||
ceph_decode_copy(p, &pi->v, sizeof(pi->v));
|
__decode_pool(p, pi);
|
||||||
__insert_pg_pool(&map->pg_pools, pi);
|
__insert_pg_pool(&map->pg_pools, pi);
|
||||||
calc_pg_masks(pi);
|
|
||||||
*p += le32_to_cpu(pi->v.num_snaps) * sizeof(u64);
|
|
||||||
*p += le32_to_cpu(pi->v.num_removed_snap_intervals)
|
|
||||||
* sizeof(u64) * 2;
|
|
||||||
}
|
}
|
||||||
ceph_decode_32_safe(p, end, map->pool_max, bad);
|
ceph_decode_32_safe(p, end, map->pool_max, bad);
|
||||||
|
|
||||||
|
@ -714,8 +718,7 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
|
||||||
pi->id = pool;
|
pi->id = pool;
|
||||||
__insert_pg_pool(&map->pg_pools, pi);
|
__insert_pg_pool(&map->pg_pools, pi);
|
||||||
}
|
}
|
||||||
ceph_decode_copy(p, &pi->v, sizeof(pi->v));
|
__decode_pool(p, pi);
|
||||||
calc_pg_masks(pi);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* old_pool */
|
/* old_pool */
|
||||||
|
|
Loading…
Reference in New Issue