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