diff options
Diffstat (limited to 'fs/ceph/osdmap.c')
| -rw-r--r-- | fs/ceph/osdmap.c | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/fs/ceph/osdmap.c b/fs/ceph/osdmap.c index 416d46adbf87..e31f118f1392 100644 --- a/fs/ceph/osdmap.c +++ b/fs/ceph/osdmap.c | |||
| @@ -424,12 +424,30 @@ static void __remove_pg_pool(struct rb_root *root, struct ceph_pg_pool_info *pi) | |||
| 424 | kfree(pi); | 424 | kfree(pi); |
| 425 | } | 425 | } |
| 426 | 426 | ||
| 427 | void __decode_pool(void **p, struct ceph_pg_pool_info *pi) | 427 | static int __decode_pool(void **p, void *end, struct ceph_pg_pool_info *pi) |
| 428 | { | 428 | { |
| 429 | unsigned n, m; | ||
| 430 | |||
| 429 | ceph_decode_copy(p, &pi->v, sizeof(pi->v)); | 431 | ceph_decode_copy(p, &pi->v, sizeof(pi->v)); |
| 430 | calc_pg_masks(pi); | 432 | calc_pg_masks(pi); |
| 431 | *p += le32_to_cpu(pi->v.num_snaps) * sizeof(u64); | 433 | |
| 434 | /* num_snaps * snap_info_t */ | ||
| 435 | n = le32_to_cpu(pi->v.num_snaps); | ||
| 436 | while (n--) { | ||
| 437 | ceph_decode_need(p, end, sizeof(u64) + 1 + sizeof(u64) + | ||
| 438 | sizeof(struct ceph_timespec), bad); | ||
| 439 | *p += sizeof(u64) + /* key */ | ||
| 440 | 1 + sizeof(u64) + /* u8, snapid */ | ||
| 441 | sizeof(struct ceph_timespec); | ||
| 442 | m = ceph_decode_32(p); /* snap name */ | ||
| 443 | *p += m; | ||
| 444 | } | ||
| 445 | |||
| 432 | *p += le32_to_cpu(pi->v.num_removed_snap_intervals) * sizeof(u64) * 2; | 446 | *p += le32_to_cpu(pi->v.num_removed_snap_intervals) * sizeof(u64) * 2; |
| 447 | return 0; | ||
| 448 | |||
| 449 | bad: | ||
| 450 | return -EINVAL; | ||
| 433 | } | 451 | } |
| 434 | 452 | ||
| 435 | static int __decode_pool_names(void **p, void *end, struct ceph_osdmap *map) | 453 | static int __decode_pool_names(void **p, void *end, struct ceph_osdmap *map) |
| @@ -571,7 +589,9 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end) | |||
| 571 | kfree(pi); | 589 | kfree(pi); |
| 572 | goto bad; | 590 | goto bad; |
| 573 | } | 591 | } |
| 574 | __decode_pool(p, pi); | 592 | err = __decode_pool(p, end, pi); |
| 593 | if (err < 0) | ||
| 594 | goto bad; | ||
| 575 | __insert_pg_pool(&map->pg_pools, pi); | 595 | __insert_pg_pool(&map->pg_pools, pi); |
| 576 | } | 596 | } |
| 577 | 597 | ||
| @@ -760,7 +780,9 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, | |||
| 760 | pi->id = pool; | 780 | pi->id = pool; |
| 761 | __insert_pg_pool(&map->pg_pools, pi); | 781 | __insert_pg_pool(&map->pg_pools, pi); |
| 762 | } | 782 | } |
| 763 | __decode_pool(p, pi); | 783 | err = __decode_pool(p, end, pi); |
| 784 | if (err < 0) | ||
| 785 | goto bad; | ||
| 764 | } | 786 | } |
| 765 | if (version >= 5 && __decode_pool_names(p, end, map) < 0) | 787 | if (version >= 5 && __decode_pool_names(p, end, map) < 0) |
| 766 | goto bad; | 788 | goto bad; |
| @@ -833,7 +855,7 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, | |||
| 833 | node)->pgid, pgid) <= 0) { | 855 | node)->pgid, pgid) <= 0) { |
| 834 | struct ceph_pg_mapping *cur = | 856 | struct ceph_pg_mapping *cur = |
| 835 | rb_entry(rbp, struct ceph_pg_mapping, node); | 857 | rb_entry(rbp, struct ceph_pg_mapping, node); |
| 836 | 858 | ||
| 837 | rbp = rb_next(rbp); | 859 | rbp = rb_next(rbp); |
| 838 | dout(" removed pg_temp %llx\n", *(u64 *)&cur->pgid); | 860 | dout(" removed pg_temp %llx\n", *(u64 *)&cur->pgid); |
| 839 | rb_erase(&cur->node, &map->pg_temp); | 861 | rb_erase(&cur->node, &map->pg_temp); |
| @@ -1026,8 +1048,9 @@ static int *calc_pg_raw(struct ceph_osdmap *osdmap, struct ceph_pg pgid, | |||
| 1026 | ruleno = crush_find_rule(osdmap->crush, pool->v.crush_ruleset, | 1048 | ruleno = crush_find_rule(osdmap->crush, pool->v.crush_ruleset, |
| 1027 | pool->v.type, pool->v.size); | 1049 | pool->v.type, pool->v.size); |
| 1028 | if (ruleno < 0) { | 1050 | if (ruleno < 0) { |
| 1029 | pr_err("no crush rule pool %d type %d size %d\n", | 1051 | pr_err("no crush rule pool %d ruleset %d type %d size %d\n", |
| 1030 | poolid, pool->v.type, pool->v.size); | 1052 | poolid, pool->v.crush_ruleset, pool->v.type, |
| 1053 | pool->v.size); | ||
| 1031 | return NULL; | 1054 | return NULL; |
| 1032 | } | 1055 | } |
| 1033 | 1056 | ||
