Merge tag 'm68knommu-for-v6.4' of git://git.kernel.org/pub/scm/linux/kernel/git/gerg...
[linux-block.git] / drivers / md / dm-verity-target.c
index ade83ef3b4392406d26d05da4cb2d0b1e890bc07..e35c16e06d0658a3632ff8ebbf40774027ab0a94 100644 (file)
@@ -16,6 +16,7 @@
 #include "dm-verity.h"
 #include "dm-verity-fec.h"
 #include "dm-verity-verify-sig.h"
+#include "dm-audit.h"
 #include <linux/module.h>
 #include <linux/reboot.h>
 #include <linux/scatterlist.h>
@@ -248,8 +249,10 @@ static int verity_handle_err(struct dm_verity *v, enum verity_block_type type,
        DMERR_LIMIT("%s: %s block %llu is corrupted", v->data_dev->name,
                    type_str, block);
 
-       if (v->corrupted_errs == DM_VERITY_MAX_CORRUPTED_ERRS)
+       if (v->corrupted_errs == DM_VERITY_MAX_CORRUPTED_ERRS) {
                DMERR("%s: reached maximum errors", v->data_dev->name);
+               dm_audit_log_target(DM_MSG_PREFIX, "max-corrupted-errors", v->ti, 0);
+       }
 
        snprintf(verity_env, DM_VERITY_ENV_LENGTH, "%s=%d,%llu",
                DM_VERITY_ENV_VAR_NAME, type, block);
@@ -340,6 +343,11 @@ static int verity_verify_level(struct dm_verity *v, struct dm_verity_io *io,
                else if (verity_handle_err(v,
                                           DM_VERITY_BLOCK_TYPE_METADATA,
                                           hash_block)) {
+                       struct bio *bio =
+                               dm_bio_from_per_bio_data(io,
+                                                        v->ti->per_io_data_size);
+                       dm_audit_log_bio(DM_MSG_PREFIX, "verify-metadata", bio,
+                                        block, 0);
                        r = -EIO;
                        goto release_ret_r;
                }
@@ -523,7 +531,7 @@ static int verity_verify_io(struct dm_verity_io *io)
                sector_t cur_block = io->block + b;
                struct ahash_request *req = verity_io_hash_req(v, io);
 
-               if (v->validated_blocks &&
+               if (v->validated_blocks && bio->bi_status == BLK_STS_OK &&
                    likely(test_bit(cur_block, v->validated_blocks))) {
                        verity_bv_skip_block(v, io, iter);
                        continue;
@@ -590,8 +598,11 @@ static int verity_verify_io(struct dm_verity_io *io)
                                return -EIO;
                        }
                        if (verity_handle_err(v, DM_VERITY_BLOCK_TYPE_DATA,
-                                             cur_block))
+                                             cur_block)) {
+                               dm_audit_log_bio(DM_MSG_PREFIX, "verify-data",
+                                                bio, cur_block, 0);
                                return -EIO;
+                       }
                }
        }
 
@@ -975,6 +986,8 @@ static void verity_dtr(struct dm_target *ti)
                static_branch_dec(&use_tasklet_enabled);
 
        kfree(v);
+
+       dm_audit_log_dtr(DM_MSG_PREFIX, ti, 1);
 }
 
 static int verity_alloc_most_once(struct dm_verity *v)
@@ -1429,11 +1442,14 @@ static int verity_ctr(struct dm_target *ti, unsigned int argc, char **argv)
 
        verity_verify_sig_opts_cleanup(&verify_args);
 
+       dm_audit_log_ctr(DM_MSG_PREFIX, ti, 1);
+
        return 0;
 
 bad:
 
        verity_verify_sig_opts_cleanup(&verify_args);
+       dm_audit_log_ctr(DM_MSG_PREFIX, ti, 0);
        verity_dtr(ti);
 
        return r;
@@ -1498,25 +1514,7 @@ static struct target_type verity_target = {
        .iterate_devices = verity_iterate_devices,
        .io_hints       = verity_io_hints,
 };
-
-static int __init dm_verity_init(void)
-{
-       int r;
-
-       r = dm_register_target(&verity_target);
-       if (r < 0)
-               DMERR("register failed %d", r);
-
-       return r;
-}
-
-static void __exit dm_verity_exit(void)
-{
-       dm_unregister_target(&verity_target);
-}
-
-module_init(dm_verity_init);
-module_exit(dm_verity_exit);
+module_dm(verity);
 
 MODULE_AUTHOR("Mikulas Patocka <mpatocka@redhat.com>");
 MODULE_AUTHOR("Mandeep Baines <msb@chromium.org>");