| xj | b04a402 | 2021-11-25 15:01:52 +0800 | [diff] [blame] | 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); |