Skip to content

Commit 400a0be

Browse files
Mikulas Patockasnitm
authored andcommitted
dm bufio: add sector start offset to dm-bufio interface
Introduce dm_bufio_set_sector_offset() interface to allow setting a sector offset for a dm-bufio client. This is a prereq for the DM integrity target. Signed-off-by: Mikulas Patocka <[email protected]> Signed-off-by: Milan Broz <[email protected]> Signed-off-by: Mike Snitzer <[email protected]>
1 parent 9b4b5a7 commit 400a0be

File tree

2 files changed

+39
-19
lines changed

2 files changed

+39
-19
lines changed

drivers/md/dm-bufio.c

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ struct dm_bufio_client {
110110
struct rb_root buffer_tree;
111111
wait_queue_head_t free_buffer_wait;
112112

113+
sector_t start;
114+
113115
int async_write_error;
114116

115117
struct list_head client_list;
@@ -557,8 +559,8 @@ static void dmio_complete(unsigned long error, void *context)
557559
b->bio.bi_end_io(&b->bio);
558560
}
559561

560-
static void use_dmio(struct dm_buffer *b, int rw, sector_t block,
561-
bio_end_io_t *end_io)
562+
static void use_dmio(struct dm_buffer *b, int rw, sector_t sector,
563+
unsigned n_sectors, bio_end_io_t *end_io)
562564
{
563565
int r;
564566
struct dm_io_request io_req = {
@@ -570,8 +572,8 @@ static void use_dmio(struct dm_buffer *b, int rw, sector_t block,
570572
};
571573
struct dm_io_region region = {
572574
.bdev = b->c->bdev,
573-
.sector = block << b->c->sectors_per_block_bits,
574-
.count = b->c->block_size >> SECTOR_SHIFT,
575+
.sector = sector,
576+
.count = n_sectors,
575577
};
576578

577579
if (b->data_mode != DATA_MODE_VMALLOC) {
@@ -606,14 +608,14 @@ static void inline_endio(struct bio *bio)
606608
end_fn(bio);
607609
}
608610

609-
static void use_inline_bio(struct dm_buffer *b, int rw, sector_t block,
610-
bio_end_io_t *end_io)
611+
static void use_inline_bio(struct dm_buffer *b, int rw, sector_t sector,
612+
unsigned n_sectors, bio_end_io_t *end_io)
611613
{
612614
char *ptr;
613615
int len;
614616

615617
bio_init(&b->bio, b->bio_vec, DM_BUFIO_INLINE_VECS);
616-
b->bio.bi_iter.bi_sector = block << b->c->sectors_per_block_bits;
618+
b->bio.bi_iter.bi_sector = sector;
617619
b->bio.bi_bdev = b->c->bdev;
618620
b->bio.bi_end_io = inline_endio;
619621
/*
@@ -628,7 +630,7 @@ static void use_inline_bio(struct dm_buffer *b, int rw, sector_t block,
628630
* If len < PAGE_SIZE the buffer doesn't cross page boundary.
629631
*/
630632
ptr = b->data;
631-
len = b->c->block_size;
633+
len = n_sectors << SECTOR_SHIFT;
632634

633635
if (len >= PAGE_SIZE)
634636
BUG_ON((unsigned long)ptr & (PAGE_SIZE - 1));
@@ -640,7 +642,7 @@ static void use_inline_bio(struct dm_buffer *b, int rw, sector_t block,
640642
len < PAGE_SIZE ? len : PAGE_SIZE,
641643
offset_in_page(ptr))) {
642644
BUG_ON(b->c->block_size <= PAGE_SIZE);
643-
use_dmio(b, rw, block, end_io);
645+
use_dmio(b, rw, sector, n_sectors, end_io);
644646
return;
645647
}
646648

@@ -651,17 +653,22 @@ static void use_inline_bio(struct dm_buffer *b, int rw, sector_t block,
651653
submit_bio(&b->bio);
652654
}
653655

654-
static void submit_io(struct dm_buffer *b, int rw, sector_t block,
655-
bio_end_io_t *end_io)
656+
static void submit_io(struct dm_buffer *b, int rw, bio_end_io_t *end_io)
656657
{
658+
unsigned n_sectors;
659+
sector_t sector;
660+
657661
if (rw == WRITE && b->c->write_callback)
658662
b->c->write_callback(b);
659663

660-
if (b->c->block_size <= DM_BUFIO_INLINE_VECS * PAGE_SIZE &&
664+
sector = (b->block << b->c->sectors_per_block_bits) + b->c->start;
665+
n_sectors = 1 << b->c->sectors_per_block_bits;
666+
667+
if (n_sectors <= ((DM_BUFIO_INLINE_VECS * PAGE_SIZE) >> SECTOR_SHIFT) &&
661668
b->data_mode != DATA_MODE_VMALLOC)
662-
use_inline_bio(b, rw, block, end_io);
669+
use_inline_bio(b, rw, sector, n_sectors, end_io);
663670
else
664-
use_dmio(b, rw, block, end_io);
671+
use_dmio(b, rw, sector, n_sectors, end_io);
665672
}
666673

667674
/*----------------------------------------------------------------
@@ -713,7 +720,7 @@ static void __write_dirty_buffer(struct dm_buffer *b,
713720
wait_on_bit_lock_io(&b->state, B_WRITING, TASK_UNINTERRUPTIBLE);
714721

715722
if (!write_list)
716-
submit_io(b, WRITE, b->block, write_endio);
723+
submit_io(b, WRITE, write_endio);
717724
else
718725
list_add_tail(&b->write_list, write_list);
719726
}
@@ -726,7 +733,7 @@ static void __flush_write_list(struct list_head *write_list)
726733
struct dm_buffer *b =
727734
list_entry(write_list->next, struct dm_buffer, write_list);
728735
list_del(&b->write_list);
729-
submit_io(b, WRITE, b->block, write_endio);
736+
submit_io(b, WRITE, write_endio);
730737
cond_resched();
731738
}
732739
blk_finish_plug(&plug);
@@ -1094,7 +1101,7 @@ static void *new_read(struct dm_bufio_client *c, sector_t block,
10941101
return NULL;
10951102

10961103
if (need_submit)
1097-
submit_io(b, READ, b->block, read_endio);
1104+
submit_io(b, READ, read_endio);
10981105

10991106
wait_on_bit_io(&b->state, B_READING, TASK_UNINTERRUPTIBLE);
11001107

@@ -1164,7 +1171,7 @@ void dm_bufio_prefetch(struct dm_bufio_client *c,
11641171
dm_bufio_unlock(c);
11651172

11661173
if (need_submit)
1167-
submit_io(b, READ, b->block, read_endio);
1174+
submit_io(b, READ, read_endio);
11681175
dm_bufio_release(b);
11691176

11701177
cond_resched();
@@ -1405,7 +1412,7 @@ void dm_bufio_release_move(struct dm_buffer *b, sector_t new_block)
14051412
old_block = b->block;
14061413
__unlink_buffer(b);
14071414
__link_buffer(b, new_block, b->list_mode);
1408-
submit_io(b, WRITE, new_block, write_endio);
1415+
submit_io(b, WRITE, write_endio);
14091416
wait_on_bit_io(&b->state, B_WRITING,
14101417
TASK_UNINTERRUPTIBLE);
14111418
__unlink_buffer(b);
@@ -1762,6 +1769,12 @@ void dm_bufio_client_destroy(struct dm_bufio_client *c)
17621769
}
17631770
EXPORT_SYMBOL_GPL(dm_bufio_client_destroy);
17641771

1772+
void dm_bufio_set_sector_offset(struct dm_bufio_client *c, sector_t start)
1773+
{
1774+
c->start = start;
1775+
}
1776+
EXPORT_SYMBOL_GPL(dm_bufio_set_sector_offset);
1777+
17651778
static unsigned get_max_age_hz(void)
17661779
{
17671780
unsigned max_age = ACCESS_ONCE(dm_bufio_max_age);

drivers/md/dm-bufio.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ dm_bufio_client_create(struct block_device *bdev, unsigned block_size,
3131
*/
3232
void dm_bufio_client_destroy(struct dm_bufio_client *c);
3333

34+
/*
35+
* Set the sector range.
36+
* When this function is called, there must be no I/O in progress on the bufio
37+
* client.
38+
*/
39+
void dm_bufio_set_sector_offset(struct dm_bufio_client *c, sector_t start);
40+
3441
/*
3542
* WARNING: to avoid deadlocks, these conditions are observed:
3643
*

0 commit comments

Comments
 (0)