Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.15 234 lines 6.0 kB view raw
1/* 2 * (C) 2001 Clemson University and The University of Chicago 3 * 4 * Changes by Acxiom Corporation to add proc file handler for pvfs2 client 5 * parameters, Copyright Acxiom Corporation, 2005. 6 * 7 * See COPYING in top-level directory. 8 */ 9 10#include "protocol.h" 11#include "orangefs-kernel.h" 12#include "orangefs-debugfs.h" 13#include "orangefs-sysfs.h" 14 15/* ORANGEFS_VERSION is a ./configure define */ 16#ifndef ORANGEFS_VERSION 17#define ORANGEFS_VERSION "upstream" 18#endif 19 20/* 21 * global variables declared here 22 */ 23 24struct orangefs_stats orangefs_stats; 25 26/* the size of the hash tables for ops in progress */ 27int hash_table_size = 509; 28 29static ulong module_parm_debug_mask; 30__u64 orangefs_gossip_debug_mask; 31int op_timeout_secs = ORANGEFS_DEFAULT_OP_TIMEOUT_SECS; 32int slot_timeout_secs = ORANGEFS_DEFAULT_SLOT_TIMEOUT_SECS; 33int orangefs_dcache_timeout_msecs = 50; 34int orangefs_getattr_timeout_msecs = 50; 35 36MODULE_LICENSE("GPL"); 37MODULE_AUTHOR("ORANGEFS Development Team"); 38MODULE_DESCRIPTION("The Linux Kernel VFS interface to ORANGEFS"); 39MODULE_PARM_DESC(module_parm_debug_mask, "debugging level (see orangefs-debug.h for values)"); 40MODULE_PARM_DESC(op_timeout_secs, "Operation timeout in seconds"); 41MODULE_PARM_DESC(slot_timeout_secs, "Slot timeout in seconds"); 42MODULE_PARM_DESC(hash_table_size, 43 "size of hash table for operations in progress"); 44 45static struct file_system_type orangefs_fs_type = { 46 .name = "pvfs2", 47 .mount = orangefs_mount, 48 .kill_sb = orangefs_kill_sb, 49 .owner = THIS_MODULE, 50}; 51 52module_param(hash_table_size, int, 0); 53module_param(module_parm_debug_mask, ulong, 0644); 54module_param(op_timeout_secs, int, 0); 55module_param(slot_timeout_secs, int, 0); 56 57/* 58 * Blocks non-priority requests from being queued for servicing. This 59 * could be used for protecting the request list data structure, but 60 * for now it's only being used to stall the op addition to the request 61 * list 62 */ 63DEFINE_MUTEX(orangefs_request_mutex); 64 65/* hash table for storing operations waiting for matching downcall */ 66struct list_head *orangefs_htable_ops_in_progress; 67DEFINE_SPINLOCK(orangefs_htable_ops_in_progress_lock); 68 69/* list for queueing upcall operations */ 70LIST_HEAD(orangefs_request_list); 71 72/* used to protect the above orangefs_request_list */ 73DEFINE_SPINLOCK(orangefs_request_list_lock); 74 75/* used for incoming request notification */ 76DECLARE_WAIT_QUEUE_HEAD(orangefs_request_list_waitq); 77 78static int __init orangefs_init(void) 79{ 80 int ret = -1; 81 __u32 i = 0; 82 83 if (op_timeout_secs < 0) 84 op_timeout_secs = 0; 85 86 if (slot_timeout_secs < 0) 87 slot_timeout_secs = 0; 88 89 /* initialize global book keeping data structures */ 90 ret = op_cache_initialize(); 91 if (ret < 0) 92 goto out; 93 94 ret = orangefs_inode_cache_initialize(); 95 if (ret < 0) 96 goto cleanup_op; 97 98 orangefs_htable_ops_in_progress = 99 kcalloc(hash_table_size, sizeof(struct list_head), GFP_KERNEL); 100 if (!orangefs_htable_ops_in_progress) { 101 ret = -ENOMEM; 102 goto cleanup_inode; 103 } 104 105 /* initialize a doubly linked at each hash table index */ 106 for (i = 0; i < hash_table_size; i++) 107 INIT_LIST_HEAD(&orangefs_htable_ops_in_progress[i]); 108 109 ret = fsid_key_table_initialize(); 110 if (ret < 0) 111 goto cleanup_progress_table; 112 113 /* 114 * Build the contents of /sys/kernel/debug/orangefs/debug-help 115 * from the keywords in the kernel keyword/mask array. 116 * 117 * The keywords in the client keyword/mask array are 118 * unknown at boot time. 119 * 120 * orangefs_prepare_debugfs_help_string will be used again 121 * later to rebuild the debug-help-string after the client starts 122 * and passes along the needed info. The argument signifies 123 * which time orangefs_prepare_debugfs_help_string is being 124 * called. 125 */ 126 ret = orangefs_prepare_debugfs_help_string(1); 127 if (ret) 128 goto cleanup_key_table; 129 130 ret = orangefs_debugfs_init(module_parm_debug_mask); 131 if (ret) 132 goto debugfs_init_failed; 133 134 ret = orangefs_sysfs_init(); 135 if (ret) 136 goto sysfs_init_failed; 137 138 /* Initialize the orangefsdev subsystem. */ 139 ret = orangefs_dev_init(); 140 if (ret < 0) { 141 gossip_err("%s: could not initialize device subsystem %d!\n", 142 __func__, 143 ret); 144 goto cleanup_device; 145 } 146 147 ret = register_filesystem(&orangefs_fs_type); 148 if (ret == 0) { 149 pr_info("%s: module version %s loaded\n", 150 __func__, 151 ORANGEFS_VERSION); 152 ret = 0; 153 goto out; 154 } 155 156 orangefs_sysfs_exit(); 157 158cleanup_device: 159 orangefs_dev_cleanup(); 160 161sysfs_init_failed: 162 163debugfs_init_failed: 164 orangefs_debugfs_cleanup(); 165 166cleanup_key_table: 167 fsid_key_table_finalize(); 168 169cleanup_progress_table: 170 kfree(orangefs_htable_ops_in_progress); 171 172cleanup_inode: 173 orangefs_inode_cache_finalize(); 174 175cleanup_op: 176 op_cache_finalize(); 177 178out: 179 return ret; 180} 181 182static void __exit orangefs_exit(void) 183{ 184 int i = 0; 185 gossip_debug(GOSSIP_INIT_DEBUG, "orangefs: orangefs_exit called\n"); 186 187 unregister_filesystem(&orangefs_fs_type); 188 orangefs_debugfs_cleanup(); 189 orangefs_sysfs_exit(); 190 fsid_key_table_finalize(); 191 orangefs_dev_cleanup(); 192 BUG_ON(!list_empty(&orangefs_request_list)); 193 for (i = 0; i < hash_table_size; i++) 194 BUG_ON(!list_empty(&orangefs_htable_ops_in_progress[i])); 195 196 orangefs_inode_cache_finalize(); 197 op_cache_finalize(); 198 199 kfree(orangefs_htable_ops_in_progress); 200 201 pr_info("orangefs: module version %s unloaded\n", ORANGEFS_VERSION); 202} 203 204/* 205 * What we do in this function is to walk the list of operations 206 * that are in progress in the hash table and mark them as purged as well. 207 */ 208void purge_inprogress_ops(void) 209{ 210 int i; 211 212 for (i = 0; i < hash_table_size; i++) { 213 struct orangefs_kernel_op_s *op; 214 struct orangefs_kernel_op_s *next; 215 216 spin_lock(&orangefs_htable_ops_in_progress_lock); 217 list_for_each_entry_safe(op, 218 next, 219 &orangefs_htable_ops_in_progress[i], 220 list) { 221 set_op_state_purged(op); 222 gossip_debug(GOSSIP_DEV_DEBUG, 223 "%s: op:%s: op_state:%d: process:%s:\n", 224 __func__, 225 get_opname_string(op), 226 op->op_state, 227 current->comm); 228 } 229 spin_unlock(&orangefs_htable_ops_in_progress_lock); 230 } 231} 232 233module_init(orangefs_init); 234module_exit(orangefs_exit);