85 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*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 19static 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(audit_context(), GFP_KERNEL, audit_type);29 if (unlikely(!ab))30 return NULL;31 32 audit_log_format(ab, "module=%s op=%s", dm_msg_prefix, op);33 return ab;34}35 36void 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(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, " 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, " dev=%d:%d sector=?", dev_major,58 dev_minor);59 break;60 default: /* unintended use */61 return;62 }63 64 audit_log_format(ab, " res=%d", result);65 audit_log_end(ab);66}67EXPORT_SYMBOL_GPL(dm_audit_log_ti);68 69void 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, " dev=%d:%d sector=%llu res=%d",81 dev_major, dev_minor, sector, result);82 audit_log_end(ab);83}84EXPORT_SYMBOL_GPL(dm_audit_log_bio);85