aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block
diff options
context:
space:
mode:
authorJosh Durgin <josh.durgin@dreamhost.com>2011-11-15 17:49:53 -0500
committerSage Weil <sage@newdream.net>2011-12-07 13:46:10 -0500
commit81e759fbf7715514c32e563789db1d9d47fd55fb (patch)
tree076296ce4a9c12c400e0a0de39d80844ced3aa14 /drivers/block
parent2151937d7ce491bfbe269a1ae742c6686904474c (diff)
rbd: return an error when an invalid header is read
This protects against opening future rbd images that have incompatible format changes. Signed-off-by: Josh Durgin <josh.durgin@dreamhost.com>
Diffstat (limited to 'drivers/block')
-rw-r--r--drivers/block/rbd.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 65cc424359b0..a828c6a276a8 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -461,6 +461,10 @@ static int rbd_header_from_disk(struct rbd_image_header *header,
461 u32 snap_count = le32_to_cpu(ondisk->snap_count); 461 u32 snap_count = le32_to_cpu(ondisk->snap_count);
462 int ret = -ENOMEM; 462 int ret = -ENOMEM;
463 463
464 if (memcmp(ondisk, RBD_HEADER_TEXT, sizeof(RBD_HEADER_TEXT))) {
465 return -ENXIO;
466 }
467
464 init_rwsem(&header->snap_rwsem); 468 init_rwsem(&header->snap_rwsem);
465 header->snap_names_len = le64_to_cpu(ondisk->snap_names_len); 469 header->snap_names_len = le64_to_cpu(ondisk->snap_names_len);
466 header->snapc = kmalloc(sizeof(struct ceph_snap_context) + 470 header->snapc = kmalloc(sizeof(struct ceph_snap_context) +
@@ -1610,8 +1614,13 @@ static int rbd_read_header(struct rbd_device *rbd_dev,
1610 goto out_dh; 1614 goto out_dh;
1611 1615
1612 rc = rbd_header_from_disk(header, dh, snap_count, GFP_KERNEL); 1616 rc = rbd_header_from_disk(header, dh, snap_count, GFP_KERNEL);
1613 if (rc < 0) 1617 if (rc < 0) {
1618 if (rc == -ENXIO) {
1619 pr_warning("unrecognized header format"
1620 " for image %s", rbd_dev->obj);
1621 }
1614 goto out_dh; 1622 goto out_dh;
1623 }
1615 1624
1616 if (snap_count != header->total_snaps) { 1625 if (snap_count != header->total_snaps) {
1617 snap_count = header->total_snaps; 1626 snap_count = header->total_snaps;