|  | // SPDX-License-Identifier: GPL-2.0 | 
|  | /* | 
|  | * fs/verity/init.c: fs-verity module initialization and logging | 
|  | * | 
|  | * Copyright 2019 Google LLC | 
|  | */ | 
|  |  | 
|  | #include "fsverity_private.h" | 
|  |  | 
|  | #include <linux/ratelimit.h> | 
|  |  | 
|  | void fsverity_msg(const struct inode *inode, const char *level, | 
|  | const char *fmt, ...) | 
|  | { | 
|  | static DEFINE_RATELIMIT_STATE(rs, DEFAULT_RATELIMIT_INTERVAL, | 
|  | DEFAULT_RATELIMIT_BURST); | 
|  | struct va_format vaf; | 
|  | va_list args; | 
|  |  | 
|  | if (!__ratelimit(&rs)) | 
|  | return; | 
|  |  | 
|  | va_start(args, fmt); | 
|  | vaf.fmt = fmt; | 
|  | vaf.va = &args; | 
|  | if (inode) | 
|  | printk("%sfs-verity (%s, inode %lu): %pV\n", | 
|  | level, inode->i_sb->s_id, inode->i_ino, &vaf); | 
|  | else | 
|  | printk("%sfs-verity: %pV\n", level, &vaf); | 
|  | va_end(args); | 
|  | } | 
|  |  | 
|  | static int __init fsverity_init(void) | 
|  | { | 
|  | int err; | 
|  |  | 
|  | fsverity_check_hash_algs(); | 
|  |  | 
|  | err = fsverity_init_info_cache(); | 
|  | if (err) | 
|  | return err; | 
|  |  | 
|  | err = fsverity_init_workqueue(); | 
|  | if (err) | 
|  | goto err_exit_info_cache; | 
|  |  | 
|  | err = fsverity_init_signature(); | 
|  | if (err) | 
|  | goto err_exit_workqueue; | 
|  |  | 
|  | pr_debug("Initialized fs-verity\n"); | 
|  | return 0; | 
|  |  | 
|  | err_exit_workqueue: | 
|  | fsverity_exit_workqueue(); | 
|  | err_exit_info_cache: | 
|  | fsverity_exit_info_cache(); | 
|  | return err; | 
|  | } | 
|  | late_initcall(fsverity_init) |