fsverity: simplify handling of errors during initcall
authorEric Biggers <ebiggers@google.com>
Wed, 5 Jul 2023 21:27:42 +0000 (14:27 -0700)
committerEric Biggers <ebiggers@google.com>
Wed, 12 Jul 2023 05:49:18 +0000 (22:49 -0700)
Since CONFIG_FS_VERITY is a bool, not a tristate, fs/verity/ can only be
builtin or absent entirely; it can't be a loadable module.  Therefore,
the error code that gets returned from the fsverity_init() initcall is
never used.  If any part of the initcall does fail, which should never
happen, the kernel will be left in a bad state.

Following the usual convention for builtin code, just panic the kernel
if any of part of the initcall fails.

Link: https://lore.kernel.org/r/20230705212743.42180-2-ebiggers@kernel.org
Signed-off-by: Eric Biggers <ebiggers@google.com>
fs/verity/fsverity_private.h
fs/verity/init.c
fs/verity/open.c
fs/verity/signature.c
fs/verity/verify.c

index 49bf3a1eb2a021ff6a8431a3cf5729fefad72804..c5ab9023dd2d339f0e2a0ac08a2a90e7063180fc 100644 (file)
@@ -118,8 +118,7 @@ void fsverity_free_info(struct fsverity_info *vi);
 int fsverity_get_descriptor(struct inode *inode,
                            struct fsverity_descriptor **desc_ret);
 
-int __init fsverity_init_info_cache(void);
-void __init fsverity_exit_info_cache(void);
+void __init fsverity_init_info_cache(void);
 
 /* signature.c */
 
@@ -127,7 +126,7 @@ void __init fsverity_exit_info_cache(void);
 int fsverity_verify_signature(const struct fsverity_info *vi,
                              const u8 *signature, size_t sig_size);
 
-int __init fsverity_init_signature(void);
+void __init fsverity_init_signature(void);
 #else /* !CONFIG_FS_VERITY_BUILTIN_SIGNATURES */
 static inline int
 fsverity_verify_signature(const struct fsverity_info *vi,
@@ -136,15 +135,13 @@ fsverity_verify_signature(const struct fsverity_info *vi,
        return 0;
 }
 
-static inline int fsverity_init_signature(void)
+static inline void fsverity_init_signature(void)
 {
-       return 0;
 }
 #endif /* !CONFIG_FS_VERITY_BUILTIN_SIGNATURES */
 
 /* verify.c */
 
-int __init fsverity_init_workqueue(void);
-void __init fsverity_exit_workqueue(void);
+void __init fsverity_init_workqueue(void);
 
 #endif /* _FSVERITY_PRIVATE_H */
index 0239051510355471a1f235287b68de634b568ad4..bcd11d63eb1cace392f58b632f64e541c0daf01c 100644 (file)
@@ -33,28 +33,10 @@ void fsverity_msg(const struct inode *inode, const char *level,
 
 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;
-
+       fsverity_init_info_cache();
+       fsverity_init_workqueue();
+       fsverity_init_signature();
        return 0;
-
-err_exit_workqueue:
-       fsverity_exit_workqueue();
-err_exit_info_cache:
-       fsverity_exit_info_cache();
-       return err;
 }
 late_initcall(fsverity_init)
index 1db5106a9c3856e2593b35c4aa74b12a99b7808a..6c31a871b84bccb472b5008fe304c0dab0ca725f 100644 (file)
@@ -408,18 +408,10 @@ void __fsverity_cleanup_inode(struct inode *inode)
 }
 EXPORT_SYMBOL_GPL(__fsverity_cleanup_inode);
 
-int __init fsverity_init_info_cache(void)
+void __init fsverity_init_info_cache(void)
 {
-       fsverity_info_cachep = KMEM_CACHE_USERCOPY(fsverity_info,
-                                                  SLAB_RECLAIM_ACCOUNT,
-                                                  file_digest);
-       if (!fsverity_info_cachep)
-               return -ENOMEM;
-       return 0;
-}
-
-void __init fsverity_exit_info_cache(void)
-{
-       kmem_cache_destroy(fsverity_info_cachep);
-       fsverity_info_cachep = NULL;
+       fsverity_info_cachep = KMEM_CACHE_USERCOPY(
+                                       fsverity_info,
+                                       SLAB_RECLAIM_ACCOUNT | SLAB_PANIC,
+                                       file_digest);
 }
index 72034bc71c9d9b2346b66d884863b968dee28886..ec75ffec069edf03960b0a56d858a26c5568387f 100644 (file)
@@ -109,43 +109,29 @@ static struct ctl_table fsverity_sysctl_table[] = {
        { }
 };
 
-static int __init fsverity_sysctl_init(void)
+static void __init fsverity_sysctl_init(void)
 {
-       fsverity_sysctl_header = register_sysctl("fs/verity", fsverity_sysctl_table);
-       if (!fsverity_sysctl_header) {
-               pr_err("sysctl registration failed!\n");
-               return -ENOMEM;
-       }
-       return 0;
+       fsverity_sysctl_header = register_sysctl("fs/verity",
+                                                fsverity_sysctl_table);
+       if (!fsverity_sysctl_header)
+               panic("fsverity sysctl registration failed");
 }
 #else /* !CONFIG_SYSCTL */
-static inline int __init fsverity_sysctl_init(void)
+static inline void fsverity_sysctl_init(void)
 {
-       return 0;
 }
 #endif /* !CONFIG_SYSCTL */
 
-int __init fsverity_init_signature(void)
+void __init fsverity_init_signature(void)
 {
-       struct key *ring;
-       int err;
-
-       ring = keyring_alloc(".fs-verity", KUIDT_INIT(0), KGIDT_INIT(0),
-                            current_cred(), KEY_POS_SEARCH |
+       fsverity_keyring =
+               keyring_alloc(".fs-verity", KUIDT_INIT(0), KGIDT_INIT(0),
+                             current_cred(), KEY_POS_SEARCH |
                                KEY_USR_VIEW | KEY_USR_READ | KEY_USR_WRITE |
                                KEY_USR_SEARCH | KEY_USR_SETATTR,
-                            KEY_ALLOC_NOT_IN_QUOTA, NULL, NULL);
-       if (IS_ERR(ring))
-               return PTR_ERR(ring);
-
-       err = fsverity_sysctl_init();
-       if (err)
-               goto err_put_ring;
-
-       fsverity_keyring = ring;
-       return 0;
+                             KEY_ALLOC_NOT_IN_QUOTA, NULL, NULL);
+       if (IS_ERR(fsverity_keyring))
+               panic("failed to allocate \".fs-verity\" keyring");
 
-err_put_ring:
-       key_put(ring);
-       return err;
+       fsverity_sysctl_init();
 }
index 433cef51f5f6b1cfd63f6d5a16738266a3e0790a..904ccd7e8e16299adbc19a40e8fbe50008570910 100644 (file)
@@ -346,7 +346,7 @@ void fsverity_enqueue_verify_work(struct work_struct *work)
 }
 EXPORT_SYMBOL_GPL(fsverity_enqueue_verify_work);
 
-int __init fsverity_init_workqueue(void)
+void __init fsverity_init_workqueue(void)
 {
        /*
         * Use a high-priority workqueue to prioritize verification work, which
@@ -360,12 +360,5 @@ int __init fsverity_init_workqueue(void)
                                                  WQ_HIGHPRI,
                                                  num_online_cpus());
        if (!fsverity_read_workqueue)
-               return -ENOMEM;
-       return 0;
-}
-
-void __init fsverity_exit_workqueue(void)
-{
-       destroy_workqueue(fsverity_read_workqueue);
-       fsverity_read_workqueue = NULL;
+               panic("failed to allocate fsverity_read_queue");
 }