1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * fs-verity module initialization and logging 4 * 5 * Copyright 2019 Google LLC 6 */ 7 8 #include "fsverity_private.h" 9 10 #include <linux/ratelimit.h> 11 12 #ifdef CONFIG_SYSCTL 13 static struct ctl_table fsverity_sysctl_table[] = { 14 #ifdef CONFIG_FS_VERITY_BUILTIN_SIGNATURES 15 { 16 .procname = "require_signatures", 17 .data = &fsverity_require_signatures, 18 .maxlen = sizeof(int), 19 .mode = 0644, 20 .proc_handler = proc_dointvec_minmax, 21 .extra1 = SYSCTL_ZERO, 22 .extra2 = SYSCTL_ONE, 23 }, 24 #endif 25 { } 26 }; 27 28 static void __init fsverity_init_sysctl(void) 29 { 30 register_sysctl_init("fs/verity", fsverity_sysctl_table); 31 } 32 #else /* CONFIG_SYSCTL */ 33 static inline void fsverity_init_sysctl(void) 34 { 35 } 36 #endif /* !CONFIG_SYSCTL */ 37 38 void fsverity_msg(const struct inode *inode, const char *level, 39 const char *fmt, ...) 40 { 41 static DEFINE_RATELIMIT_STATE(rs, DEFAULT_RATELIMIT_INTERVAL, 42 DEFAULT_RATELIMIT_BURST); 43 struct va_format vaf; 44 va_list args; 45 46 if (!__ratelimit(&rs)) 47 return; 48 49 va_start(args, fmt); 50 vaf.fmt = fmt; 51 vaf.va = &args; 52 if (inode) 53 printk("%sfs-verity (%s, inode %lu): %pV\n", 54 level, inode->i_sb->s_id, inode->i_ino, &vaf); 55 else 56 printk("%sfs-verity: %pV\n", level, &vaf); 57 va_end(args); 58 } 59 60 static int __init fsverity_init(void) 61 { 62 fsverity_check_hash_algs(); 63 fsverity_init_info_cache(); 64 fsverity_init_workqueue(); 65 fsverity_init_sysctl(); 66 fsverity_init_signature(); 67 return 0; 68 } 69 late_initcall(fsverity_init) 70