| // 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) |