public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] dm: verity support data device offset
@ 2012-08-08  0:43 Wesley Miaw
  2012-08-08  3:36 ` Greg KH
  0 siblings, 1 reply; 2+ messages in thread
From: Wesley Miaw @ 2012-08-08  0:43 UTC (permalink / raw)
  To: linux-kernel@vger.kernel.org; +Cc: Will Drewry™, msb@google.com

[-- Attachment #1: Type: text/plain, Size: 3790 bytes --]

I needed to add support for dm-verity with data that is offset into a block device. As part of this I found that the existing code did not compute the correct hash block index if the data_start might be non-zero. Here's a patch to add support for a data offset target parameter as well as a fix to the hash block index computation.

Patch and (hopefully proper) commit message below. Thanks.
--
Wesley Miaw

============================================================

Add data device start block index to dm-verity target parameters to support verity targets where the data does not begin at sector 0 of the block device. Also fix the hash block index computation so it takes into account data offsets.

---

--- a/drivers/md/dm-verity.c	2012-08-07 16:03:03.778759000 -0700
+++ b/drivers/md/dm-verity.c	2012-08-07 17:30:56.914569414 -0700
@@ -491,7 +491,7 @@
 	io->bio = bio;
 	io->orig_bi_end_io = bio->bi_end_io;
 	io->orig_bi_private = bio->bi_private;
-	io->block = bio->bi_sector >> (v->data_dev_block_bits - SECTOR_SHIFT);
+	io->block = (bio->bi_sector - v->data_start)  >> (v->data_dev_block_bits - SECTOR_SHIFT);
 	io->n_blocks = bio->bi_size >> v->data_dev_block_bits;
 
 	bio->bi_end_io = verity_end_io;
@@ -641,6 +641,7 @@
  *	<hash device>
  *	<data block size>
  *	<hash block size>
+ *	<data start block>
  *	<the number of data blocks>
  *	<hash start block>
  *	<algorithm>
@@ -671,8 +672,8 @@
 		goto bad;
 	}
 
-	if (argc != 10) {
-		ti->error = "Invalid argument count: exactly 10 arguments required";
+	if (argc != 11) {
+		ti->error = "Invalid argument count: exactly 11 arguments required";
 		r = -EINVAL;
 		goto bad;
 	}
@@ -718,6 +719,15 @@
 	v->hash_dev_block_bits = ffs(num) - 1;
 
 	if (sscanf(argv[5], "%llu%c", &num_ll, &dummy) != 1 ||
+		num_ll << (v->data_dev_block_bits - SECTOR_SHIFT) !=
+		(sector_t)num_ll << (v->data_dev_block_bits - SECTOR_SHIFT)) {
+		ti->error = "Invalid data start";
+		r = -EINVAL;
+		goto bad;
+	}
+	v->data_start = num_ll << (v->data_dev_block_bits - SECTOR_SHIFT);
+
+	if (sscanf(argv[6], "%llu%c", &num_ll, &dummy) != 1 ||
 	    num_ll << (v->data_dev_block_bits - SECTOR_SHIFT) !=
 	    (sector_t)num_ll << (v->data_dev_block_bits - SECTOR_SHIFT)) {
 		ti->error = "Invalid data blocks";
@@ -732,7 +742,7 @@
 		goto bad;
 	}
 
-	if (sscanf(argv[6], "%llu%c", &num_ll, &dummy) != 1 ||
+	if (sscanf(argv[7], "%llu%c", &num_ll, &dummy) != 1 ||
 	    num_ll << (v->hash_dev_block_bits - SECTOR_SHIFT) !=
 	    (sector_t)num_ll << (v->hash_dev_block_bits - SECTOR_SHIFT)) {
 		ti->error = "Invalid hash start";
@@ -741,7 +751,7 @@
 	}
 	v->hash_start = num_ll;
 
-	v->alg_name = kstrdup(argv[7], GFP_KERNEL);
+	v->alg_name = kstrdup(argv[8], GFP_KERNEL);
 	if (!v->alg_name) {
 		ti->error = "Cannot allocate algorithm name";
 		r = -ENOMEM;
@@ -770,23 +780,23 @@
 		r = -ENOMEM;
 		goto bad;
 	}
-	if (strlen(argv[8]) != v->digest_size * 2 ||
-	    hex2bin(v->root_digest, argv[8], v->digest_size)) {
+	if (strlen(argv[9]) != v->digest_size * 2 ||
+	    hex2bin(v->root_digest, argv[9], v->digest_size)) {
 		ti->error = "Invalid root digest";
 		r = -EINVAL;
 		goto bad;
 	}
 
-	if (strcmp(argv[9], "-")) {
-		v->salt_size = strlen(argv[9]) / 2;
+	if (strcmp(argv[10], "-")) {
+		v->salt_size = strlen(argv[10]) / 2;
 		v->salt = kmalloc(v->salt_size, GFP_KERNEL);
 		if (!v->salt) {
 			ti->error = "Cannot allocate salt";
 			r = -ENOMEM;
 			goto bad;
 		}
-		if (strlen(argv[9]) != v->salt_size * 2 ||
-		    hex2bin(v->salt, argv[9], v->salt_size)) {
+		if (strlen(argv[10]) != v->salt_size * 2 ||
+		    hex2bin(v->salt, argv[10], v->salt_size)) {
 			ti->error = "Invalid salt";
 			r = -EINVAL;
 			goto bad;


[-- Attachment #2: Message signed with OpenPGP using GPGMail --]
[-- Type: application/pgp-signature, Size: 495 bytes --]

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2012-08-08  3:36 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-08-08  0:43 [PATCH] dm: verity support data device offset Wesley Miaw
2012-08-08  3:36 ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox