Commit e77000cc authored by Eric Biggers's avatar Eric Biggers

fsverity: simplify handling of errors during initcall

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.orgSigned-off-by: default avatarEric Biggers <ebiggers@google.com>
parent 5d37a119
...@@ -118,8 +118,7 @@ void fsverity_free_info(struct fsverity_info *vi); ...@@ -118,8 +118,7 @@ void fsverity_free_info(struct fsverity_info *vi);
int fsverity_get_descriptor(struct inode *inode, int fsverity_get_descriptor(struct inode *inode,
struct fsverity_descriptor **desc_ret); struct fsverity_descriptor **desc_ret);
int __init fsverity_init_info_cache(void); void __init fsverity_init_info_cache(void);
void __init fsverity_exit_info_cache(void);
/* signature.c */ /* signature.c */
...@@ -127,7 +126,7 @@ void __init fsverity_exit_info_cache(void); ...@@ -127,7 +126,7 @@ void __init fsverity_exit_info_cache(void);
int fsverity_verify_signature(const struct fsverity_info *vi, int fsverity_verify_signature(const struct fsverity_info *vi,
const u8 *signature, size_t sig_size); 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 */ #else /* !CONFIG_FS_VERITY_BUILTIN_SIGNATURES */
static inline int static inline int
fsverity_verify_signature(const struct fsverity_info *vi, fsverity_verify_signature(const struct fsverity_info *vi,
...@@ -136,15 +135,13 @@ fsverity_verify_signature(const struct fsverity_info *vi, ...@@ -136,15 +135,13 @@ fsverity_verify_signature(const struct fsverity_info *vi,
return 0; return 0;
} }
static inline int fsverity_init_signature(void) static inline void fsverity_init_signature(void)
{ {
return 0;
} }
#endif /* !CONFIG_FS_VERITY_BUILTIN_SIGNATURES */ #endif /* !CONFIG_FS_VERITY_BUILTIN_SIGNATURES */
/* verify.c */ /* verify.c */
int __init fsverity_init_workqueue(void); void __init fsverity_init_workqueue(void);
void __init fsverity_exit_workqueue(void);
#endif /* _FSVERITY_PRIVATE_H */ #endif /* _FSVERITY_PRIVATE_H */
...@@ -33,28 +33,10 @@ void fsverity_msg(const struct inode *inode, const char *level, ...@@ -33,28 +33,10 @@ void fsverity_msg(const struct inode *inode, const char *level,
static int __init fsverity_init(void) static int __init fsverity_init(void)
{ {
int err;
fsverity_check_hash_algs(); fsverity_check_hash_algs();
fsverity_init_info_cache();
err = fsverity_init_info_cache(); fsverity_init_workqueue();
if (err) fsverity_init_signature();
return err;
err = fsverity_init_workqueue();
if (err)
goto err_exit_info_cache;
err = fsverity_init_signature();
if (err)
goto err_exit_workqueue;
return 0; return 0;
err_exit_workqueue:
fsverity_exit_workqueue();
err_exit_info_cache:
fsverity_exit_info_cache();
return err;
} }
late_initcall(fsverity_init) late_initcall(fsverity_init)
...@@ -408,18 +408,10 @@ void __fsverity_cleanup_inode(struct inode *inode) ...@@ -408,18 +408,10 @@ void __fsverity_cleanup_inode(struct inode *inode)
} }
EXPORT_SYMBOL_GPL(__fsverity_cleanup_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, fsverity_info_cachep = KMEM_CACHE_USERCOPY(
SLAB_RECLAIM_ACCOUNT, fsverity_info,
file_digest); SLAB_RECLAIM_ACCOUNT | SLAB_PANIC,
if (!fsverity_info_cachep) file_digest);
return -ENOMEM;
return 0;
}
void __init fsverity_exit_info_cache(void)
{
kmem_cache_destroy(fsverity_info_cachep);
fsverity_info_cachep = NULL;
} }
...@@ -109,43 +109,29 @@ static struct ctl_table fsverity_sysctl_table[] = { ...@@ -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); fsverity_sysctl_header = register_sysctl("fs/verity",
if (!fsverity_sysctl_header) { fsverity_sysctl_table);
pr_err("sysctl registration failed!\n"); if (!fsverity_sysctl_header)
return -ENOMEM; panic("fsverity sysctl registration failed");
}
return 0;
} }
#else /* !CONFIG_SYSCTL */ #else /* !CONFIG_SYSCTL */
static inline int __init fsverity_sysctl_init(void) static inline void fsverity_sysctl_init(void)
{ {
return 0;
} }
#endif /* !CONFIG_SYSCTL */ #endif /* !CONFIG_SYSCTL */
int __init fsverity_init_signature(void) void __init fsverity_init_signature(void)
{ {
struct key *ring; fsverity_keyring =
int err; keyring_alloc(".fs-verity", KUIDT_INIT(0), KGIDT_INIT(0),
current_cred(), KEY_POS_SEARCH |
ring = 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_VIEW | KEY_USR_READ | KEY_USR_WRITE |
KEY_USR_SEARCH | KEY_USR_SETATTR, KEY_USR_SEARCH | KEY_USR_SETATTR,
KEY_ALLOC_NOT_IN_QUOTA, NULL, NULL); KEY_ALLOC_NOT_IN_QUOTA, NULL, NULL);
if (IS_ERR(ring)) if (IS_ERR(fsverity_keyring))
return PTR_ERR(ring); panic("failed to allocate \".fs-verity\" keyring");
err = fsverity_sysctl_init();
if (err)
goto err_put_ring;
fsverity_keyring = ring;
return 0;
err_put_ring: fsverity_sysctl_init();
key_put(ring);
return err;
} }
...@@ -346,7 +346,7 @@ void fsverity_enqueue_verify_work(struct work_struct *work) ...@@ -346,7 +346,7 @@ void fsverity_enqueue_verify_work(struct work_struct *work)
} }
EXPORT_SYMBOL_GPL(fsverity_enqueue_verify_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 * Use a high-priority workqueue to prioritize verification work, which
...@@ -360,12 +360,5 @@ int __init fsverity_init_workqueue(void) ...@@ -360,12 +360,5 @@ int __init fsverity_init_workqueue(void)
WQ_HIGHPRI, WQ_HIGHPRI,
num_online_cpus()); num_online_cpus());
if (!fsverity_read_workqueue) if (!fsverity_read_workqueue)
return -ENOMEM; panic("failed to allocate fsverity_read_queue");
return 0;
}
void __init fsverity_exit_workqueue(void)
{
destroy_workqueue(fsverity_read_workqueue);
fsverity_read_workqueue = NULL;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment