1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | /* |
3 | * Creating audit records for mapped devices. |
4 | * |
5 | * Copyright (C) 2021 Fraunhofer AISEC. All rights reserved. |
6 | * |
7 | * Authors: Michael Weiß <michael.weiss@aisec.fraunhofer.de> |
8 | */ |
9 | |
10 | #include <linux/audit.h> |
11 | #include <linux/module.h> |
12 | #include <linux/device-mapper.h> |
13 | #include <linux/bio.h> |
14 | #include <linux/blkdev.h> |
15 | |
16 | #include "dm-audit.h" |
17 | #include "dm-core.h" |
18 | |
19 | static struct audit_buffer *dm_audit_log_start(int audit_type, |
20 | const char *dm_msg_prefix, |
21 | const char *op) |
22 | { |
23 | struct audit_buffer *ab; |
24 | |
25 | if (audit_enabled == AUDIT_OFF) |
26 | return NULL; |
27 | |
28 | ab = audit_log_start(ctx: audit_context(), GFP_KERNEL, type: audit_type); |
29 | if (unlikely(!ab)) |
30 | return NULL; |
31 | |
32 | audit_log_format(ab, fmt: "module=%s op=%s" , dm_msg_prefix, op); |
33 | return ab; |
34 | } |
35 | |
36 | void dm_audit_log_ti(int audit_type, const char *dm_msg_prefix, const char *op, |
37 | struct dm_target *ti, int result) |
38 | { |
39 | struct audit_buffer *ab = NULL; |
40 | struct mapped_device *md = dm_table_get_md(t: ti->table); |
41 | int dev_major = dm_disk(md)->major; |
42 | int dev_minor = dm_disk(md)->first_minor; |
43 | |
44 | switch (audit_type) { |
45 | case AUDIT_DM_CTRL: |
46 | ab = dm_audit_log_start(audit_type, dm_msg_prefix, op); |
47 | if (unlikely(!ab)) |
48 | return; |
49 | audit_log_task_info(ab); |
50 | audit_log_format(ab, fmt: " dev=%d:%d error_msg='%s'" , dev_major, |
51 | dev_minor, !result ? ti->error : "success" ); |
52 | break; |
53 | case AUDIT_DM_EVENT: |
54 | ab = dm_audit_log_start(audit_type, dm_msg_prefix, op); |
55 | if (unlikely(!ab)) |
56 | return; |
57 | audit_log_format(ab, fmt: " dev=%d:%d sector=?" , dev_major, |
58 | dev_minor); |
59 | break; |
60 | default: /* unintended use */ |
61 | return; |
62 | } |
63 | |
64 | audit_log_format(ab, fmt: " res=%d" , result); |
65 | audit_log_end(ab); |
66 | } |
67 | EXPORT_SYMBOL_GPL(dm_audit_log_ti); |
68 | |
69 | void dm_audit_log_bio(const char *dm_msg_prefix, const char *op, |
70 | struct bio *bio, sector_t sector, int result) |
71 | { |
72 | struct audit_buffer *ab; |
73 | int dev_major = MAJOR(bio->bi_bdev->bd_dev); |
74 | int dev_minor = MINOR(bio->bi_bdev->bd_dev); |
75 | |
76 | ab = dm_audit_log_start(AUDIT_DM_EVENT, dm_msg_prefix, op); |
77 | if (unlikely(!ab)) |
78 | return; |
79 | |
80 | audit_log_format(ab, fmt: " dev=%d:%d sector=%llu res=%d" , |
81 | dev_major, dev_minor, sector, result); |
82 | audit_log_end(ab); |
83 | } |
84 | EXPORT_SYMBOL_GPL(dm_audit_log_bio); |
85 | |