dm log: avoid reinitialising io_req on every operation

rw_header function updates three members of io_req data every time
when I/O is processed. bi_rw and notify.fn are never modified once
they get initialized, and so they can be set in advance.

header_to_disk() can also be pulled out of write_header() since only one
caller needs it and write_header() can be replaced by rw_header()
directly.

Signed-off-by: Takahiro Yasui <tyasui@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>

authored by

Takahiro Yasui and committed by
Alasdair G Kergon
6f3af01c 10d3bd09

+7 -10
+7 -10
drivers/md/dm-log.c
··· 326 static int rw_header(struct log_c *lc, int rw) 327 { 328 lc->io_req.bi_rw = rw; 329 - lc->io_req.mem.ptr.vma = lc->disk_header; 330 - lc->io_req.notify.fn = NULL; 331 332 return dm_io(&lc->io_req, 1, &lc->header_location, NULL); 333 } ··· 358 } 359 360 return 0; 361 - } 362 - 363 - static inline int write_header(struct log_c *log) 364 - { 365 - header_to_disk(&log->header, log->disk_header); 366 - return rw_header(log, WRITE); 367 } 368 369 /*---------------------------------------------------------------- ··· 446 buf_size = dm_round_up((LOG_OFFSET << SECTOR_SHIFT) + 447 bitset_size, ti->limits.hardsect_size); 448 lc->header_location.count = buf_size >> SECTOR_SHIFT; 449 lc->io_req.mem.type = DM_IO_VMA; 450 lc->io_req.client = dm_io_client_create(dm_div_up(buf_size, 451 PAGE_SIZE)); 452 if (IS_ERR(lc->io_req.client)) { ··· 466 return -ENOMEM; 467 } 468 469 lc->clean_bits = (void *)lc->disk_header + 470 (LOG_OFFSET << SECTOR_SHIFT); 471 } ··· 631 /* set the correct number of regions in the header */ 632 lc->header.nr_regions = lc->region_count; 633 634 /* write the new header */ 635 - r = write_header(lc); 636 if (r) { 637 DMWARN("%s: Failed to write header on dirty region log device", 638 lc->log_dev->name); ··· 684 if (!lc->touched) 685 return 0; 686 687 - r = write_header(lc); 688 if (r) 689 fail_log_device(lc); 690 else
··· 326 static int rw_header(struct log_c *lc, int rw) 327 { 328 lc->io_req.bi_rw = rw; 329 330 return dm_io(&lc->io_req, 1, &lc->header_location, NULL); 331 } ··· 360 } 361 362 return 0; 363 } 364 365 /*---------------------------------------------------------------- ··· 454 buf_size = dm_round_up((LOG_OFFSET << SECTOR_SHIFT) + 455 bitset_size, ti->limits.hardsect_size); 456 lc->header_location.count = buf_size >> SECTOR_SHIFT; 457 + 458 lc->io_req.mem.type = DM_IO_VMA; 459 + lc->io_req.notify.fn = NULL; 460 lc->io_req.client = dm_io_client_create(dm_div_up(buf_size, 461 PAGE_SIZE)); 462 if (IS_ERR(lc->io_req.client)) { ··· 472 return -ENOMEM; 473 } 474 475 + lc->io_req.mem.ptr.vma = lc->disk_header; 476 lc->clean_bits = (void *)lc->disk_header + 477 (LOG_OFFSET << SECTOR_SHIFT); 478 } ··· 636 /* set the correct number of regions in the header */ 637 lc->header.nr_regions = lc->region_count; 638 639 + header_to_disk(&lc->header, lc->disk_header); 640 + 641 /* write the new header */ 642 + r = rw_header(lc, WRITE); 643 if (r) { 644 DMWARN("%s: Failed to write header on dirty region log device", 645 lc->log_dev->name); ··· 687 if (!lc->touched) 688 return 0; 689 690 + r = rw_header(lc, WRITE); 691 if (r) 692 fail_log_device(lc); 693 else