Skip to content

Commit d2bac08

Browse files
committed
Merge tag 'for-6.9/dm-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm
Pull device mapper updates from Mike Snitzer: - Fix DM core's IO submission (which include dm-io and dm-bufio) such that a bio's IO priority is propagated. Work focused on enabling both DM crypt and verity targets to retain the appropriate IO priority - Fix DM raid reshape logic to not allow an empty flush bio to be requeued due to false concern about the bio, which doesn't have a data payload, accessing beyond the end of the device - Fix DM core's internal resume so that it properly calls both presume and resume methods, which fixes the potential for a postsuspend and resume imbalance - Update DM verity target to set DM_TARGET_SINGLETON flag because it doesn't make sense to have a DM table with a mix of targets that include dm-verity - Small cleanups in DM crypt, thin, and integrity targets - Fix references to dm-devel mailing list to use latest list address * tag 'for-6.9/dm-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm: dm: call the resume method on internal suspend dm raid: fix false positive for requeue needed during reshape dm-integrity: set max_integrity_segments in dm_integrity_io_hints dm: update relevant MODULE_AUTHOR entries to latest dm-devel mailing list dm ioctl: update DM_DRIVER_EMAIL to new dm-devel mailing list dm verity: set DM_TARGET_SINGLETON feature flag dm crypt: Fix IO priority lost when queuing write bios dm verity: Fix IO priority lost when reading FEC and hash dm bufio: Support IO priority dm io: Support IO priority dm crypt: remove redundant state settings after waking up dm thin: add braces around conditional code that spans lines
2 parents 57aaf91 + 65e8fbd commit d2bac08

27 files changed

+173
-104
lines changed

drivers/md/dm-bio-prison-v1.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -489,5 +489,5 @@ module_init(dm_bio_prison_init);
489489
module_exit(dm_bio_prison_exit);
490490

491491
MODULE_DESCRIPTION(DM_NAME " bio prison");
492-
MODULE_AUTHOR("Joe Thornber <dm-devel@redhat.com>");
492+
MODULE_AUTHOR("Joe Thornber <dm-devel@lists.linux.dev>");
493493
MODULE_LICENSE("GPL");

drivers/md/dm-bufio.c

Lines changed: 52 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1292,7 +1292,8 @@ static void dmio_complete(unsigned long error, void *context)
12921292
}
12931293

12941294
static void use_dmio(struct dm_buffer *b, enum req_op op, sector_t sector,
1295-
unsigned int n_sectors, unsigned int offset)
1295+
unsigned int n_sectors, unsigned int offset,
1296+
unsigned short ioprio)
12961297
{
12971298
int r;
12981299
struct dm_io_request io_req = {
@@ -1315,7 +1316,7 @@ static void use_dmio(struct dm_buffer *b, enum req_op op, sector_t sector,
13151316
io_req.mem.ptr.vma = (char *)b->data + offset;
13161317
}
13171318

1318-
r = dm_io(&io_req, 1, &region, NULL);
1319+
r = dm_io(&io_req, 1, &region, NULL, ioprio);
13191320
if (unlikely(r))
13201321
b->end_io(b, errno_to_blk_status(r));
13211322
}
@@ -1331,21 +1332,23 @@ static void bio_complete(struct bio *bio)
13311332
}
13321333

13331334
static void use_bio(struct dm_buffer *b, enum req_op op, sector_t sector,
1334-
unsigned int n_sectors, unsigned int offset)
1335+
unsigned int n_sectors, unsigned int offset,
1336+
unsigned short ioprio)
13351337
{
13361338
struct bio *bio;
13371339
char *ptr;
13381340
unsigned int len;
13391341

13401342
bio = bio_kmalloc(1, GFP_NOWAIT | __GFP_NORETRY | __GFP_NOWARN);
13411343
if (!bio) {
1342-
use_dmio(b, op, sector, n_sectors, offset);
1344+
use_dmio(b, op, sector, n_sectors, offset, ioprio);
13431345
return;
13441346
}
13451347
bio_init(bio, b->c->bdev, bio->bi_inline_vecs, 1, op);
13461348
bio->bi_iter.bi_sector = sector;
13471349
bio->bi_end_io = bio_complete;
13481350
bio->bi_private = b;
1351+
bio->bi_ioprio = ioprio;
13491352

13501353
ptr = (char *)b->data + offset;
13511354
len = n_sectors << SECTOR_SHIFT;
@@ -1368,7 +1371,7 @@ static inline sector_t block_to_sector(struct dm_bufio_client *c, sector_t block
13681371
return sector;
13691372
}
13701373

1371-
static void submit_io(struct dm_buffer *b, enum req_op op,
1374+
static void submit_io(struct dm_buffer *b, enum req_op op, unsigned short ioprio,
13721375
void (*end_io)(struct dm_buffer *, blk_status_t))
13731376
{
13741377
unsigned int n_sectors;
@@ -1398,9 +1401,9 @@ static void submit_io(struct dm_buffer *b, enum req_op op,
13981401
}
13991402

14001403
if (b->data_mode != DATA_MODE_VMALLOC)
1401-
use_bio(b, op, sector, n_sectors, offset);
1404+
use_bio(b, op, sector, n_sectors, offset, ioprio);
14021405
else
1403-
use_dmio(b, op, sector, n_sectors, offset);
1406+
use_dmio(b, op, sector, n_sectors, offset, ioprio);
14041407
}
14051408

14061409
/*
@@ -1456,7 +1459,7 @@ static void __write_dirty_buffer(struct dm_buffer *b,
14561459
b->write_end = b->dirty_end;
14571460

14581461
if (!write_list)
1459-
submit_io(b, REQ_OP_WRITE, write_endio);
1462+
submit_io(b, REQ_OP_WRITE, IOPRIO_DEFAULT, write_endio);
14601463
else
14611464
list_add_tail(&b->write_list, write_list);
14621465
}
@@ -1470,7 +1473,7 @@ static void __flush_write_list(struct list_head *write_list)
14701473
struct dm_buffer *b =
14711474
list_entry(write_list->next, struct dm_buffer, write_list);
14721475
list_del(&b->write_list);
1473-
submit_io(b, REQ_OP_WRITE, write_endio);
1476+
submit_io(b, REQ_OP_WRITE, IOPRIO_DEFAULT, write_endio);
14741477
cond_resched();
14751478
}
14761479
blk_finish_plug(&plug);
@@ -1852,7 +1855,8 @@ static void read_endio(struct dm_buffer *b, blk_status_t status)
18521855
* and uses dm_bufio_mark_buffer_dirty to write new data back).
18531856
*/
18541857
static void *new_read(struct dm_bufio_client *c, sector_t block,
1855-
enum new_flag nf, struct dm_buffer **bp)
1858+
enum new_flag nf, struct dm_buffer **bp,
1859+
unsigned short ioprio)
18561860
{
18571861
int need_submit = 0;
18581862
struct dm_buffer *b;
@@ -1905,7 +1909,7 @@ static void *new_read(struct dm_bufio_client *c, sector_t block,
19051909
return NULL;
19061910

19071911
if (need_submit)
1908-
submit_io(b, REQ_OP_READ, read_endio);
1912+
submit_io(b, REQ_OP_READ, ioprio, read_endio);
19091913

19101914
if (nf != NF_GET) /* we already tested this condition above */
19111915
wait_on_bit_io(&b->state, B_READING, TASK_UNINTERRUPTIBLE);
@@ -1926,32 +1930,46 @@ static void *new_read(struct dm_bufio_client *c, sector_t block,
19261930
void *dm_bufio_get(struct dm_bufio_client *c, sector_t block,
19271931
struct dm_buffer **bp)
19281932
{
1929-
return new_read(c, block, NF_GET, bp);
1933+
return new_read(c, block, NF_GET, bp, IOPRIO_DEFAULT);
19301934
}
19311935
EXPORT_SYMBOL_GPL(dm_bufio_get);
19321936

1933-
void *dm_bufio_read(struct dm_bufio_client *c, sector_t block,
1934-
struct dm_buffer **bp)
1937+
static void *__dm_bufio_read(struct dm_bufio_client *c, sector_t block,
1938+
struct dm_buffer **bp, unsigned short ioprio)
19351939
{
19361940
if (WARN_ON_ONCE(dm_bufio_in_request()))
19371941
return ERR_PTR(-EINVAL);
19381942

1939-
return new_read(c, block, NF_READ, bp);
1943+
return new_read(c, block, NF_READ, bp, ioprio);
1944+
}
1945+
1946+
void *dm_bufio_read(struct dm_bufio_client *c, sector_t block,
1947+
struct dm_buffer **bp)
1948+
{
1949+
return __dm_bufio_read(c, block, bp, IOPRIO_DEFAULT);
19401950
}
19411951
EXPORT_SYMBOL_GPL(dm_bufio_read);
19421952

1953+
void *dm_bufio_read_with_ioprio(struct dm_bufio_client *c, sector_t block,
1954+
struct dm_buffer **bp, unsigned short ioprio)
1955+
{
1956+
return __dm_bufio_read(c, block, bp, ioprio);
1957+
}
1958+
EXPORT_SYMBOL_GPL(dm_bufio_read_with_ioprio);
1959+
19431960
void *dm_bufio_new(struct dm_bufio_client *c, sector_t block,
19441961
struct dm_buffer **bp)
19451962
{
19461963
if (WARN_ON_ONCE(dm_bufio_in_request()))
19471964
return ERR_PTR(-EINVAL);
19481965

1949-
return new_read(c, block, NF_FRESH, bp);
1966+
return new_read(c, block, NF_FRESH, bp, IOPRIO_DEFAULT);
19501967
}
19511968
EXPORT_SYMBOL_GPL(dm_bufio_new);
19521969

1953-
void dm_bufio_prefetch(struct dm_bufio_client *c,
1954-
sector_t block, unsigned int n_blocks)
1970+
static void __dm_bufio_prefetch(struct dm_bufio_client *c,
1971+
sector_t block, unsigned int n_blocks,
1972+
unsigned short ioprio)
19551973
{
19561974
struct blk_plug plug;
19571975

@@ -1987,7 +2005,7 @@ void dm_bufio_prefetch(struct dm_bufio_client *c,
19872005
dm_bufio_unlock(c);
19882006

19892007
if (need_submit)
1990-
submit_io(b, REQ_OP_READ, read_endio);
2008+
submit_io(b, REQ_OP_READ, ioprio, read_endio);
19912009
dm_bufio_release(b);
19922010

19932011
cond_resched();
@@ -2002,8 +2020,20 @@ void dm_bufio_prefetch(struct dm_bufio_client *c,
20022020
flush_plug:
20032021
blk_finish_plug(&plug);
20042022
}
2023+
2024+
void dm_bufio_prefetch(struct dm_bufio_client *c, sector_t block, unsigned int n_blocks)
2025+
{
2026+
return __dm_bufio_prefetch(c, block, n_blocks, IOPRIO_DEFAULT);
2027+
}
20052028
EXPORT_SYMBOL_GPL(dm_bufio_prefetch);
20062029

2030+
void dm_bufio_prefetch_with_ioprio(struct dm_bufio_client *c, sector_t block,
2031+
unsigned int n_blocks, unsigned short ioprio)
2032+
{
2033+
return __dm_bufio_prefetch(c, block, n_blocks, ioprio);
2034+
}
2035+
EXPORT_SYMBOL_GPL(dm_bufio_prefetch_with_ioprio);
2036+
20072037
void dm_bufio_release(struct dm_buffer *b)
20082038
{
20092039
struct dm_bufio_client *c = b->c;
@@ -2167,7 +2197,7 @@ int dm_bufio_issue_flush(struct dm_bufio_client *c)
21672197
if (WARN_ON_ONCE(dm_bufio_in_request()))
21682198
return -EINVAL;
21692199

2170-
return dm_io(&io_req, 1, &io_reg, NULL);
2200+
return dm_io(&io_req, 1, &io_reg, NULL, IOPRIO_DEFAULT);
21712201
}
21722202
EXPORT_SYMBOL_GPL(dm_bufio_issue_flush);
21732203

@@ -2191,7 +2221,7 @@ int dm_bufio_issue_discard(struct dm_bufio_client *c, sector_t block, sector_t c
21912221
if (WARN_ON_ONCE(dm_bufio_in_request()))
21922222
return -EINVAL; /* discards are optional */
21932223

2194-
return dm_io(&io_req, 1, &io_reg, NULL);
2224+
return dm_io(&io_req, 1, &io_reg, NULL, IOPRIO_DEFAULT);
21952225
}
21962226
EXPORT_SYMBOL_GPL(dm_bufio_issue_discard);
21972227

@@ -2968,6 +2998,6 @@ MODULE_PARM_DESC(allocated_vmalloc_bytes, "Memory allocated with vmalloc");
29682998
module_param_named(current_allocated_bytes, dm_bufio_current_allocated, ulong, 0444);
29692999
MODULE_PARM_DESC(current_allocated_bytes, "Memory currently used by the cache");
29703000

2971-
MODULE_AUTHOR("Mikulas Patocka <dm-devel@redhat.com>");
3001+
MODULE_AUTHOR("Mikulas Patocka <dm-devel@lists.linux.dev>");
29723002
MODULE_DESCRIPTION(DM_NAME " buffered I/O library");
29733003
MODULE_LICENSE("GPL");

drivers/md/dm-cache-policy-smq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1947,7 +1947,7 @@ static void __exit smq_exit(void)
19471947
module_init(smq_init);
19481948
module_exit(smq_exit);
19491949

1950-
MODULE_AUTHOR("Joe Thornber <dm-devel@redhat.com>");
1950+
MODULE_AUTHOR("Joe Thornber <dm-devel@lists.linux.dev>");
19511951
MODULE_LICENSE("GPL");
19521952
MODULE_DESCRIPTION("smq cache policy");
19531953

drivers/md/dm-crypt.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1688,6 +1688,7 @@ static struct bio *crypt_alloc_buffer(struct dm_crypt_io *io, unsigned int size)
16881688
GFP_NOIO, &cc->bs);
16891689
clone->bi_private = io;
16901690
clone->bi_end_io = crypt_endio;
1691+
clone->bi_ioprio = io->base_bio->bi_ioprio;
16911692

16921693
remaining_size = size;
16931694

@@ -1964,7 +1965,6 @@ static int dmcrypt_write(void *data)
19641965

19651966
schedule();
19661967

1967-
set_current_state(TASK_RUNNING);
19681968
spin_lock_irq(&cc->write_thread_lock);
19691969
goto continue_locked;
19701970

drivers/md/dm-dust.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -573,5 +573,5 @@ static struct target_type dust_target = {
573573
module_dm(dust);
574574

575575
MODULE_DESCRIPTION(DM_NAME " dust test target");
576-
MODULE_AUTHOR("Bryan Gurney <dm-devel@redhat.com>");
576+
MODULE_AUTHOR("Bryan Gurney <dm-devel@lists.linux.dev>");
577577
MODULE_LICENSE("GPL");

drivers/md/dm-ebs-target.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,6 @@ static struct target_type ebs_target = {
454454
};
455455
module_dm(ebs);
456456

457-
MODULE_AUTHOR("Heinz Mauelshagen <dm-devel@redhat.com>");
457+
MODULE_AUTHOR("Heinz Mauelshagen <dm-devel@lists.linux.dev>");
458458
MODULE_DESCRIPTION(DM_NAME " emulated block size target");
459459
MODULE_LICENSE("GPL");

drivers/md/dm-flakey.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -690,5 +690,5 @@ static struct target_type flakey_target = {
690690
module_dm(flakey);
691691

692692
MODULE_DESCRIPTION(DM_NAME " flakey target");
693-
MODULE_AUTHOR("Joe Thornber <dm-devel@redhat.com>");
693+
MODULE_AUTHOR("Joe Thornber <dm-devel@lists.linux.dev>");
694694
MODULE_LICENSE("GPL");

drivers/md/dm-integrity.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,7 @@ static int sync_rw_sb(struct dm_integrity_c *ic, blk_opf_t opf)
555555
}
556556
}
557557

558-
r = dm_io(&io_req, 1, &io_loc, NULL);
558+
r = dm_io(&io_req, 1, &io_loc, NULL, IOPRIO_DEFAULT);
559559
if (unlikely(r))
560560
return r;
561561

@@ -1073,7 +1073,7 @@ static void rw_journal_sectors(struct dm_integrity_c *ic, blk_opf_t opf,
10731073
io_loc.sector = ic->start + SB_SECTORS + sector;
10741074
io_loc.count = n_sectors;
10751075

1076-
r = dm_io(&io_req, 1, &io_loc, NULL);
1076+
r = dm_io(&io_req, 1, &io_loc, NULL, IOPRIO_DEFAULT);
10771077
if (unlikely(r)) {
10781078
dm_integrity_io_error(ic, (opf & REQ_OP_MASK) == REQ_OP_READ ?
10791079
"reading journal" : "writing journal", r);
@@ -1190,7 +1190,7 @@ static void copy_from_journal(struct dm_integrity_c *ic, unsigned int section, u
11901190
io_loc.sector = target;
11911191
io_loc.count = n_sectors;
11921192

1193-
r = dm_io(&io_req, 1, &io_loc, NULL);
1193+
r = dm_io(&io_req, 1, &io_loc, NULL, IOPRIO_DEFAULT);
11941194
if (unlikely(r)) {
11951195
WARN_ONCE(1, "asynchronous dm_io failed: %d", r);
11961196
fn(-1UL, data);
@@ -1519,7 +1519,7 @@ static void dm_integrity_flush_buffers(struct dm_integrity_c *ic, bool flush_dat
15191519
fr.io_reg.count = 0,
15201520
fr.ic = ic;
15211521
init_completion(&fr.comp);
1522-
r = dm_io(&fr.io_req, 1, &fr.io_reg, NULL);
1522+
r = dm_io(&fr.io_req, 1, &fr.io_reg, NULL, IOPRIO_DEFAULT);
15231523
BUG_ON(r);
15241524
}
15251525

@@ -1727,7 +1727,7 @@ static noinline void integrity_recheck(struct dm_integrity_io *dio, char *checks
17271727
io_loc.sector = sector;
17281728
io_loc.count = ic->sectors_per_block;
17291729

1730-
r = dm_io(&io_req, 1, &io_loc, NULL);
1730+
r = dm_io(&io_req, 1, &io_loc, NULL, IOPRIO_DEFAULT);
17311731
if (unlikely(r)) {
17321732
dio->bi_status = errno_to_blk_status(r);
17331733
goto free_ret;
@@ -2806,7 +2806,7 @@ static void integrity_recalc(struct work_struct *w)
28062806
io_loc.sector = get_data_sector(ic, area, offset);
28072807
io_loc.count = n_sectors;
28082808

2809-
r = dm_io(&io_req, 1, &io_loc, NULL);
2809+
r = dm_io(&io_req, 1, &io_loc, NULL, IOPRIO_DEFAULT);
28102810
if (unlikely(r)) {
28112811
dm_integrity_io_error(ic, "reading data", r);
28122812
goto err;
@@ -3485,6 +3485,7 @@ static void dm_integrity_io_hints(struct dm_target *ti, struct queue_limits *lim
34853485
blk_limits_io_min(limits, ic->sectors_per_block << SECTOR_SHIFT);
34863486
limits->dma_alignment = limits->logical_block_size - 1;
34873487
}
3488+
limits->max_integrity_segments = USHRT_MAX;
34883489
}
34893490

34903491
static void calculate_journal_section_size(struct dm_integrity_c *ic)
@@ -3652,7 +3653,6 @@ static void dm_integrity_set(struct dm_target *ti, struct dm_integrity_c *ic)
36523653
bi.interval_exp = ic->sb->log2_sectors_per_block + SECTOR_SHIFT;
36533654

36543655
blk_integrity_register(disk, &bi);
3655-
blk_queue_max_integrity_segments(disk->queue, UINT_MAX);
36563656
}
36573657

36583658
static void dm_integrity_free_page_list(struct page_list *pl)

0 commit comments

Comments
 (0)