From: Josh Durgin <josh.durgin@dreamhost.com>
Date: Tue, 15 Nov 2011 22:49:53 +0000 (-0800)
Subject: rbd: return an error when an invalid header is read
X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=81e759fbf7715514c32e563789db1d9d47fd55fb;p=GitHub%2Fexynos8895%2Fandroid_kernel_samsung_universal8895.git

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>
---

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,
 	u32 snap_count = le32_to_cpu(ondisk->snap_count);
 	int ret = -ENOMEM;
 
+	if (memcmp(ondisk, RBD_HEADER_TEXT, sizeof(RBD_HEADER_TEXT))) {
+		return -ENXIO;
+	}
+
 	init_rwsem(&header->snap_rwsem);
 	header->snap_names_len = le64_to_cpu(ondisk->snap_names_len);
 	header->snapc = kmalloc(sizeof(struct ceph_snap_context) +
@@ -1610,8 +1614,13 @@ static int rbd_read_header(struct rbd_device *rbd_dev,
 			goto out_dh;
 
 		rc = rbd_header_from_disk(header, dh, snap_count, GFP_KERNEL);
-		if (rc < 0)
+		if (rc < 0) {
+			if (rc == -ENXIO) {
+				pr_warning("unrecognized header format"
+					   " for image %s", rbd_dev->obj);
+			}
 			goto out_dh;
+		}
 
 		if (snap_count != header->total_snaps) {
 			snap_count = header->total_snaps;