]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/md/dm-verity-target.c
Merge tag 'random_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso...
[linux.git] / drivers / md / dm-verity-target.c
index 4fb33e7562c5244724edd24a6898ee421b0b2908..0d61e9c6798650bc46bc34aa98b29564fe21d9c9 100644 (file)
@@ -611,8 +611,22 @@ static void verity_prefetch_io(struct work_struct *work)
 
 static void verity_submit_prefetch(struct dm_verity *v, struct dm_verity_io *io)
 {
+       sector_t block = io->block;
+       unsigned int n_blocks = io->n_blocks;
        struct dm_verity_prefetch_work *pw;
 
+       if (v->validated_blocks) {
+               while (n_blocks && test_bit(block, v->validated_blocks)) {
+                       block++;
+                       n_blocks--;
+               }
+               while (n_blocks && test_bit(block + n_blocks - 1,
+                                           v->validated_blocks))
+                       n_blocks--;
+               if (!n_blocks)
+                       return;
+       }
+
        pw = kmalloc(sizeof(struct dm_verity_prefetch_work),
                GFP_NOIO | __GFP_NORETRY | __GFP_NOMEMALLOC | __GFP_NOWARN);
 
@@ -621,8 +635,8 @@ static void verity_submit_prefetch(struct dm_verity *v, struct dm_verity_io *io)
 
        INIT_WORK(&pw->work, verity_prefetch_io);
        pw->v = v;
-       pw->block = io->block;
-       pw->n_blocks = io->n_blocks;
+       pw->block = block;
+       pw->n_blocks = n_blocks;
        queue_work(v->verify_wq, &pw->work);
 }