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 static void __init fsverity_init_sysctl(void) 28 { 29 register_sysctl_init("fs/verity", fsverity_sysctl_table); 30 } 31 #else /* CONFIG_SYSCTL */ 32 static inline void fsverity_init_sysctl(void) 33 { 34 } 35 #endif /* !CONFIG_SYSCTL */ 36 37 void fsverity_msg(const struct inode *inode, const char *level, 38 const char *fmt, ...) 39 { 40 static DEFINE_RATELIMIT_STATE(rs, DEFAULT_RATELIMIT_INTERVAL, 41 DEFAULT_RATELIMIT_BURST); 42 struct va_format vaf; 43 va_list args; 44 45 if (!__ratelimit(&rs)) 46 return; 47 48 va_start(args, fmt); 49 vaf.fmt = fmt; 50 vaf.va = &args; 51 if (inode) 52 printk("%sfs-verity (%s, inode %lu): %pV\n", 53 level, inode->i_sb->s_id, inode->i_ino, &vaf); 54 else 55 printk("%sfs-verity: %pV\n", level, &vaf); 56 va_end(args); 57 } 58 59 static int __init fsverity_init(void) 60 { 61 fsverity_check_hash_algs(); 62 fsverity_init_info_cache(); 63 fsverity_init_workqueue(); 64 fsverity_init_sysctl(); 65 fsverity_init_signature(); 66 fsverity_init_bpf(); 67 return 0; 68 } 69 late_initcall(fsverity_init) 70