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