All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dmitry Monakhov <dmonakhov@openvz.org>
To: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org,
	martin.petersen@oracle.com
Cc: Dmitry Monakhov <dmonakhov@openvz.org>
Subject: [PATCH 9/9] bio-integrity: Restore original iterator on verify stage
Date: Tue,  4 Apr 2017 22:56:41 +0400	[thread overview]
Message-ID: <1491332201-26926-10-git-send-email-dmonakhov@openvz.org> (raw)
In-Reply-To: <1491332201-26926-1-git-send-email-dmonakhov@openvz.org>

Currently ->verify_fn not woks at all because at the moment it is called
bio->bi_iter.bi_size == 0, so we do not iterate integrity bvecs at all.

In order to perform verification we need to know original data vector,
with new bvec rewind API this is trivial.

testcase: https://github.com/dmonakhov/xfstests/commit/3c6509eaa83b9c17cd0bc95d73fcdd76e1c54a85
Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
---
 block/bio-integrity.c | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/block/bio-integrity.c b/block/bio-integrity.c
index f2b9f09..f08096d 100644
--- a/block/bio-integrity.c
+++ b/block/bio-integrity.c
@@ -184,9 +184,10 @@ static inline unsigned int bio_integrity_bytes(struct blk_integrity *bi,
 /**
  * bio_integrity_process - Process integrity metadata for a bio
  * @bio:	bio to generate/verify integrity metadata for
+ * @proc_iter:  iterator to process
  * @proc_fn:	Pointer to the relevant processing function
  */
-static int bio_integrity_process(struct bio *bio,
+static int bio_integrity_process(struct bio *bio, struct bvec_iter *proc_iter,
 				 integrity_processing_fn *proc_fn)
 {
 	struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
@@ -200,10 +201,10 @@ static int bio_integrity_process(struct bio *bio,
 
 	iter.disk_name = bio->bi_bdev->bd_disk->disk_name;
 	iter.interval = 1 << bi->interval_exp;
-	iter.seed = bip_get_seed(bip);
+	iter.seed = proc_iter->bi_sector;
 	iter.prot_buf = prot_buf;
 
-	bio_for_each_segment(bv, bio, bviter) {
+	__bio_for_each_segment(bv, bio, bviter, *proc_iter) {
 		void *kaddr = kmap_atomic(bv.bv_page);
 
 		iter.data_buf = kaddr + bv.bv_offset;
@@ -310,7 +311,8 @@ static int bio_integrity_setup(struct bio *bio)
 
 	/* Auto-generate integrity metadata if this is a write */
 	if (bio_data_dir(bio) == WRITE)
-		bio_integrity_process(bio, bi->profile->generate_fn);
+		bio_integrity_process(bio, &bio->bi_iter,
+				      bi->profile->generate_fn);
 
 	return 0;
 }
@@ -376,9 +378,15 @@ static void bio_integrity_verify_fn(struct work_struct *work)
 		container_of(work, struct bio_integrity_payload, bip_work);
 	struct bio *bio = bip->bip_bio;
 	struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
-
-	bio->bi_error = bio_integrity_process(bio, bi->profile->verify_fn);
-
+	struct bvec_iter iter = bio->bi_iter;
+
+	/* At the moment verify is called bio's iterator was advanced
+	 * during split and completion, we need to rewind iterator to
+	 * it's original position */
+	bio_rewind_iter(bio, &iter, iter.bi_done);
+	if (!bio->bi_error)
+		bio->bi_error = bio_integrity_process(bio, &iter,
+						      bi->profile->verify_fn);
 	/* Restore original bio completion handler */
 	bio->bi_end_io = bip->bip_end_io;
 	bio_endio(bio);
-- 
2.9.3

  parent reply	other threads:[~2017-04-04 18:56 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-04 18:56 [PATCH 0/9] block: T10/DIF Fixes and cleanups v3 Dmitry Monakhov
2017-04-04 18:56 ` [PATCH 1/9] bio-integrity: Do not allocate integrity context for bio w/o data Dmitry Monakhov
2017-04-05  6:32   ` Hannes Reinecke
2017-04-05  6:32     ` Hannes Reinecke
2017-04-20  2:34   ` Martin K. Petersen
2017-04-04 18:56 ` [PATCH 2/9] bio-integrity: bio_trim should truncate integrity vector accordingly Dmitry Monakhov
2017-04-05  6:32   ` Hannes Reinecke
2017-04-05  6:32     ` Hannes Reinecke
2017-04-20  2:34   ` Martin K. Petersen
2017-04-04 18:56 ` [PATCH 3/9] bio-integrity: bio_integrity_advance must update integrity seed Dmitry Monakhov
2017-04-05  6:34   ` Hannes Reinecke
2017-04-05  6:34     ` Hannes Reinecke
2017-04-06 11:35   ` Christoph Hellwig
2017-04-20  2:36   ` Martin K. Petersen
2017-05-03 16:06     ` Dmitry Monakhov
2017-05-03 16:10       ` Martin K. Petersen
2017-04-04 18:56 ` [PATCH 4/9] bio-integrity: fix interface for bio_integrity_trim v2 Dmitry Monakhov
2017-04-05  6:36   ` Hannes Reinecke
2017-04-05  6:36     ` Hannes Reinecke
2017-04-06 11:36   ` Christoph Hellwig
2017-04-20  2:38   ` Martin K. Petersen
2017-04-04 18:56 ` [PATCH 5/9] bio-integrity: fold bio_integrity_enabled to bio_integrity_prep Dmitry Monakhov
2017-04-05  6:37   ` Hannes Reinecke
2017-04-05  6:37     ` Hannes Reinecke
2017-04-06 11:43   ` Christoph Hellwig
2017-04-20  2:40   ` Martin K. Petersen
2017-04-04 18:56 ` [PATCH 6/9] T10: Move opencoded contants to common header Dmitry Monakhov
2017-04-05  6:37   ` Hannes Reinecke
2017-04-05  6:37     ` Hannes Reinecke
2017-04-06 11:44   ` Christoph Hellwig
2017-04-20  2:44   ` Martin K. Petersen
2017-04-04 18:56 ` [PATCH 7/9] Guard bvec iteration logic v3 Dmitry Monakhov
2017-04-05  6:39   ` Hannes Reinecke
2017-04-05  6:39     ` Hannes Reinecke
2017-04-06 11:46   ` Christoph Hellwig
2017-04-04 18:56 ` [PATCH 8/9] bio: add bvec_iter rewind API Dmitry Monakhov
2017-04-05  6:39   ` Hannes Reinecke
2017-04-05  6:39     ` Hannes Reinecke
2017-04-06 11:49   ` Christoph Hellwig
2017-04-20  2:51   ` Martin K. Petersen
2017-04-04 18:56 ` Dmitry Monakhov [this message]
2017-04-05  6:41   ` [PATCH 9/9] bio-integrity: Restore original iterator on verify stage Hannes Reinecke
2017-04-05  6:41     ` Hannes Reinecke
2017-04-06 11:49   ` Christoph Hellwig
2017-05-02  7:31 ` [PATCH 0/9] block: T10/DIF Fixes and cleanups v3 Christoph Hellwig
2017-05-10 15:28   ` Dmitry Monakhov
2017-05-10 15:20 [PATCH 0/9] block: T10/DIF Fixes and cleanups v4 Dmitry Monakhov
2017-05-10 15:20 ` [PATCH 9/9] bio-integrity: Restore original iterator on verify stage Dmitry Monakhov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1491332201-26926-10-git-send-email-dmonakhov@openvz.org \
    --to=dmonakhov@openvz.org \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.