summaryrefslogtreecommitdiffstats
path: root/fs/ceph/osdmap.c
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2009-10-08 22:22:37 -0700
committerSage Weil <sage@newdream.net>2009-10-09 11:58:11 -0700
commit991abb6ecfc8edf9863aa6a3f43249e63f9d4d4e (patch)
tree19484fb1965b1ee2cc61a5e7256d3a5aaba4c5fe /fs/ceph/osdmap.c
parent0ba6478df7c6bef0f4b2625554545f941f89fb97 (diff)
downloadlinux-991abb6ecfc8edf9863aa6a3f43249e63f9d4d4e.tar.bz2
ceph: fail gracefully on corrupt osdmap (bad pg_temp mapping)
Return an error and report a corrupt map instead of crying BUG(). Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'fs/ceph/osdmap.c')
-rw-r--r--fs/ceph/osdmap.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/fs/ceph/osdmap.c b/fs/ceph/osdmap.c
index e38fe6309b1c..342e5f80996b 100644
--- a/fs/ceph/osdmap.c
+++ b/fs/ceph/osdmap.c
@@ -366,8 +366,8 @@ static int osdmap_set_max_osd(struct ceph_osdmap *map, int max)
/*
* Insert a new pg_temp mapping
*/
-static void __insert_pg_mapping(struct ceph_pg_mapping *new,
- struct rb_root *root)
+static int __insert_pg_mapping(struct ceph_pg_mapping *new,
+ struct rb_root *root)
{
struct rb_node **p = &root->rb_node;
struct rb_node *parent = NULL;
@@ -381,11 +381,12 @@ static void __insert_pg_mapping(struct ceph_pg_mapping *new,
else if (new->pgid > pg->pgid)
p = &(*p)->rb_right;
else
- BUG();
+ return -EEXIST;
}
rb_link_node(&new->node, parent, p);
rb_insert_color(&new->node, root);
+ return 0;
}
/*
@@ -481,7 +482,9 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end)
for (j = 0; j < n; j++)
ceph_decode_32(p, pg->osds[j]);
- __insert_pg_mapping(pg, &map->pg_temp);
+ err = __insert_pg_mapping(pg, &map->pg_temp);
+ if (err)
+ goto bad;
dout(" added pg_temp %llx len %d\n", pgid, len);
}
@@ -681,7 +684,9 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
pg->len = pglen;
for (j = 0; j < len; j++)
ceph_decode_32(p, pg->osds[j]);
- __insert_pg_mapping(pg, &map->pg_temp);
+ err = __insert_pg_mapping(pg, &map->pg_temp);
+ if (err)
+ goto bad;
dout(" added pg_temp %llx len %d\n", pgid, pglen);
}
}