cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

dm-audit.c (2187B)


      1// SPDX-License-Identifier: GPL-2.0
      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
     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);