Thread (6 messages) 6 messages, 4 authors, 2015-04-27

Re: [PATCH] md/raid10: make sync_request_write() call bio_copy_data()

From: Ming Lin <mlin@kernel.org>
Date: 2015-04-27 07:29:50

On Sun, Apr 26, 2015 at 4:49 PM, NeilBrown [off-list ref] wrote:
On Fri, 24 Apr 2015 15:52:10 -0700 Ming Lin [off-list ref] wrote:
quoted
From: Kent Overstreet <redacted>

Refactor sync_request_write() of md/raid10 to use bio_copy_data()
instead of open coding bio_vec iterations.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Kent Overstreet <redacted>
[dpark: add more description in commit message]
Signed-off-by: Dongsu Park <redacted>
Signed-off-by: Ming Lin <mlin@kernel.org>
---
 drivers/md/raid10.c | 20 +++++---------------
 1 file changed, 5 insertions(+), 15 deletions(-)
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index a7196c4..02e33f1 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -2097,18 +2097,11 @@ static void sync_request_write(struct mddev *mddev, struct r10bio *r10_bio)
              tbio->bi_vcnt = vcnt;
              tbio->bi_iter.bi_size = r10_bio->sectors << 9;
              tbio->bi_rw = WRITE;
-             tbio->bi_private = r10_bio;
              tbio->bi_iter.bi_sector = r10_bio->devs[i].addr;
-
-             for (j=0; j < vcnt ; j++) {
-                     tbio->bi_io_vec[j].bv_offset = 0;
-                     tbio->bi_io_vec[j].bv_len = PAGE_SIZE;
-
-                     memcpy(page_address(tbio->bi_io_vec[j].bv_page),
-                            page_address(fbio->bi_io_vec[j].bv_page),
-                            PAGE_SIZE);
-             }
You removed the resetting of bv_offset and bv_len.
So I assume this is being applied in a context where these things are now
immutable - is that correct?
Correct. The full patchset is here:
https://git.kernel.org/cgit/linux/kernel/git/mlin/linux.git/log/?h=block-generic-req

I'll rebase it on top of 4.1-rc1, then post it.
quoted
              tbio->bi_end_io = end_sync_write;
+             tbio->bi_private = r10_bio;
Any reason you are moving this assignment to bi_private?
It doesn't hurt, but it doesn't seem to be necessary.
I'll update it to where it was.
quoted
+
+             bio_copy_data(tbio, fbio);

              d = r10_bio->devs[i].devnum;
              atomic_inc(&conf->mirrors[d].rdev->nr_pending);
@@ -2124,17 +2117,14 @@ static void sync_request_write(struct mddev *mddev, struct r10bio *r10_bio)
       * that are active
       */
      for (i = 0; i < conf->copies; i++) {
-             int j, d;
+             int d;

              tbio = r10_bio->devs[i].repl_bio;
              if (!tbio || !tbio->bi_end_io)
                      continue;
              if (r10_bio->devs[i].bio->bi_end_io != end_sync_write
                  && r10_bio->devs[i].bio != fbio)
-                     for (j = 0; j < vcnt; j++)
-                             memcpy(page_address(tbio->bi_io_vec[j].bv_page),
-                                    page_address(fbio->bi_io_vec[j].bv_page),
-                                    PAGE_SIZE);
+                     bio_copy_data(tbio, fbio);
              d = r10_bio->devs[i].devnum;
              atomic_inc(&r10_bio->remaining);
              md_sync_acct(conf->mirrors[d].replacement->bdev,
Providing you are confident that bv_offset and bv_len don't need to be
updated:

 Acked-by: NeilBrown [off-list ref]

though I'd prefer the bi_private assignment was left where it was.
Will update it.

Thanks.
Thanks,
NeilBrown
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help