Merge tag 'for-6.9/dm-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/devic...
[sfrench/cifs-2.6.git] / drivers / md / dm-verity-target.c
index 1b591bfa90d5d6463016e22183dbb5f071e94a75..34f58630d7ea6a53b7e7522b61e13bb7efcc405e 100644 (file)
@@ -51,6 +51,7 @@ static DEFINE_STATIC_KEY_FALSE(use_tasklet_enabled);
 struct dm_verity_prefetch_work {
        struct work_struct work;
        struct dm_verity *v;
+       unsigned short ioprio;
        sector_t block;
        unsigned int n_blocks;
 };
@@ -294,6 +295,7 @@ static int verity_verify_level(struct dm_verity *v, struct dm_verity_io *io,
        int r;
        sector_t hash_block;
        unsigned int offset;
+       struct bio *bio = dm_bio_from_per_bio_data(io, v->ti->per_io_data_size);
 
        verity_hash_at_level(v, block, level, &hash_block, &offset);
 
@@ -307,8 +309,10 @@ static int verity_verify_level(struct dm_verity *v, struct dm_verity_io *io,
                         */
                        return -EAGAIN;
                }
-       } else
-               data = dm_bufio_read(v->bufio, hash_block, &buf);
+       } else {
+               data = dm_bufio_read_with_ioprio(v->bufio, hash_block,
+                                               &buf, bio_prio(bio));
+       }
 
        if (IS_ERR(data))
                return PTR_ERR(data);
@@ -511,7 +515,7 @@ static noinline int verity_recheck(struct dm_verity *v, struct dm_verity_io *io,
        io_loc.bdev = v->data_dev->bdev;
        io_loc.sector = cur_block << (v->data_dev_block_bits - SECTOR_SHIFT);
        io_loc.count = 1 << (v->data_dev_block_bits - SECTOR_SHIFT);
-       r = dm_io(&io_req, 1, &io_loc, NULL);
+       r = dm_io(&io_req, 1, &io_loc, NULL, IOPRIO_DEFAULT);
        if (unlikely(r))
                goto free_ret;
 
@@ -752,14 +756,16 @@ static void verity_prefetch_io(struct work_struct *work)
                                hash_block_end = v->hash_blocks - 1;
                }
 no_prefetch_cluster:
-               dm_bufio_prefetch(v->bufio, hash_block_start,
-                                 hash_block_end - hash_block_start + 1);
+               dm_bufio_prefetch_with_ioprio(v->bufio, hash_block_start,
+                                       hash_block_end - hash_block_start + 1,
+                                       pw->ioprio);
        }
 
        kfree(pw);
 }
 
-static void verity_submit_prefetch(struct dm_verity *v, struct dm_verity_io *io)
+static void verity_submit_prefetch(struct dm_verity *v, struct dm_verity_io *io,
+                                  unsigned short ioprio)
 {
        sector_t block = io->block;
        unsigned int n_blocks = io->n_blocks;
@@ -787,6 +793,7 @@ static void verity_submit_prefetch(struct dm_verity *v, struct dm_verity_io *io)
        pw->v = v;
        pw->block = block;
        pw->n_blocks = n_blocks;
+       pw->ioprio = ioprio;
        queue_work(v->verify_wq, &pw->work);
 }
 
@@ -829,7 +836,7 @@ static int verity_map(struct dm_target *ti, struct bio *bio)
 
        verity_fec_init_io(io);
 
-       verity_submit_prefetch(v, io);
+       verity_submit_prefetch(v, io, bio_prio(bio));
 
        submit_bio_noacct(bio);
 
@@ -1559,7 +1566,7 @@ int dm_verity_get_root_digest(struct dm_target *ti, u8 **root_digest, unsigned i
 
 static struct target_type verity_target = {
        .name           = "verity",
-       .features       = DM_TARGET_IMMUTABLE,
+       .features       = DM_TARGET_SINGLETON | DM_TARGET_IMMUTABLE,
        .version        = {1, 10, 0},
        .module         = THIS_MODULE,
        .ctr            = verity_ctr,