Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0-or-later 2 : : /* Network filesystem caching backend to use cache files on a premounted 3 : : * filesystem 4 : : * 5 : : * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. 6 : : * Written by David Howells (dhowells@redhat.com) 7 : : */ 8 : : 9 : : #include <linux/module.h> 10 : : #include <linux/init.h> 11 : : #include <linux/sched.h> 12 : : #include <linux/completion.h> 13 : : #include <linux/slab.h> 14 : : #include <linux/fs.h> 15 : : #include <linux/file.h> 16 : : #include <linux/namei.h> 17 : : #include <linux/mount.h> 18 : : #include <linux/statfs.h> 19 : : #include <linux/sysctl.h> 20 : : #include <linux/miscdevice.h> 21 : : #define CREATE_TRACE_POINTS 22 : : #include "internal.h" 23 : : 24 : : unsigned cachefiles_debug; 25 : : module_param_named(debug, cachefiles_debug, uint, S_IWUSR | S_IRUGO); 26 : : MODULE_PARM_DESC(cachefiles_debug, "CacheFiles debugging mask"); 27 : : 28 : : MODULE_DESCRIPTION("Mounted-filesystem based cache"); 29 : : MODULE_AUTHOR("Red Hat, Inc."); 30 : : MODULE_LICENSE("GPL"); 31 : : 32 : : struct kmem_cache *cachefiles_object_jar; 33 : : 34 : : static struct miscdevice cachefiles_dev = { 35 : : .minor = MISC_DYNAMIC_MINOR, 36 : : .name = "cachefiles", 37 : : .fops = &cachefiles_daemon_fops, 38 : : }; 39 : : 40 : 0 : static void cachefiles_object_init_once(void *_object) 41 : : { 42 : : struct cachefiles_object *object = _object; 43 : : 44 : 0 : memset(object, 0, sizeof(*object)); 45 : 0 : spin_lock_init(&object->work_lock); 46 : 0 : } 47 : : 48 : : /* 49 : : * initialise the fs caching module 50 : : */ 51 : 207 : static int __init cachefiles_init(void) 52 : : { 53 : : int ret; 54 : : 55 : 207 : ret = misc_register(&cachefiles_dev); 56 [ + - ]: 207 : if (ret < 0) 57 : : goto error_dev; 58 : : 59 : : /* create an object jar */ 60 : : ret = -ENOMEM; 61 : 207 : cachefiles_object_jar = 62 : 207 : kmem_cache_create("cachefiles_object_jar", 63 : : sizeof(struct cachefiles_object), 64 : : 0, 65 : : SLAB_HWCACHE_ALIGN, 66 : : cachefiles_object_init_once); 67 [ - + ]: 207 : if (!cachefiles_object_jar) { 68 : 0 : pr_notice("Failed to allocate an object jar\n"); 69 : : goto error_object_jar; 70 : : } 71 : : 72 : : ret = cachefiles_proc_init(); 73 : : if (ret < 0) 74 : : goto error_proc; 75 : : 76 : 207 : pr_info("Loaded\n"); 77 : 207 : return 0; 78 : : 79 : : error_proc: 80 : : kmem_cache_destroy(cachefiles_object_jar); 81 : : error_object_jar: 82 : 0 : misc_deregister(&cachefiles_dev); 83 : : error_dev: 84 : 0 : pr_err("failed to register: %d\n", ret); 85 : 0 : return ret; 86 : : } 87 : : 88 : : fs_initcall(cachefiles_init); 89 : : 90 : : /* 91 : : * clean up on module removal 92 : : */ 93 : 0 : static void __exit cachefiles_exit(void) 94 : : { 95 : 0 : pr_info("Unloading\n"); 96 : : 97 : : cachefiles_proc_cleanup(); 98 : 0 : kmem_cache_destroy(cachefiles_object_jar); 99 : 0 : misc_deregister(&cachefiles_dev); 100 : 0 : } 101 : : 102 : : module_exit(cachefiles_exit);