1 /* 2 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. 3 * Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved. 4 * 5 * This copyrighted material is made available to anyone wishing to use, 6 * modify, copy, or redistribute it subject to the terms and conditions 7 * of the GNU General Public License version 2. 8 */ 9 10 #ifndef LOCK_DLM_DOT_H 11 #define LOCK_DLM_DOT_H 12 13 #include <linux/module.h> 14 #include <linux/slab.h> 15 #include <linux/spinlock.h> 16 #include <linux/types.h> 17 #include <linux/string.h> 18 #include <linux/list.h> 19 #include <linux/socket.h> 20 #include <linux/delay.h> 21 #include <linux/kthread.h> 22 #include <linux/kobject.h> 23 #include <linux/fcntl.h> 24 #include <linux/wait.h> 25 #include <net/sock.h> 26 27 #include <linux/dlm.h> 28 #include <linux/dlm_plock.h> 29 #include <linux/lm_interface.h> 30 31 /* 32 * Internally, we prefix things with gdlm_ and GDLM_ (for gfs-dlm) since a 33 * prefix of lock_dlm_ gets awkward. Externally, GFS refers to this module 34 * as "lock_dlm". 35 */ 36 37 #define GDLM_STRNAME_BYTES 24 38 #define GDLM_LVB_SIZE 32 39 #define GDLM_DROP_COUNT 0 40 #define GDLM_DROP_PERIOD 60 41 #define GDLM_NAME_LEN 128 42 43 /* GFS uses 12 bytes to identify a resource (32 bit type + 64 bit number). 44 We sprintf these numbers into a 24 byte string of hex values to make them 45 human-readable (to make debugging simpler.) */ 46 47 struct gdlm_strname { 48 unsigned char name[GDLM_STRNAME_BYTES]; 49 unsigned short namelen; 50 }; 51 52 enum { 53 DFL_BLOCK_LOCKS = 0, 54 DFL_SPECTATOR = 1, 55 DFL_WITHDRAW = 2, 56 }; 57 58 struct gdlm_ls { 59 u32 id; 60 int jid; 61 int first; 62 int first_done; 63 unsigned long flags; 64 struct kobject kobj; 65 char clustername[GDLM_NAME_LEN]; 66 char fsname[GDLM_NAME_LEN]; 67 int fsflags; 68 dlm_lockspace_t *dlm_lockspace; 69 lm_callback_t fscb; 70 struct gfs2_sbd *sdp; 71 int recover_jid; 72 int recover_jid_done; 73 int recover_jid_status; 74 spinlock_t async_lock; 75 struct list_head delayed; 76 struct list_head submit; 77 u32 all_locks_count; 78 wait_queue_head_t wait_control; 79 struct task_struct *thread; 80 wait_queue_head_t thread_wait; 81 }; 82 83 enum { 84 LFL_NOBLOCK = 0, 85 LFL_NOCACHE = 1, 86 LFL_DLM_UNLOCK = 2, 87 LFL_DLM_CANCEL = 3, 88 LFL_SYNC_LVB = 4, 89 LFL_FORCE_PROMOTE = 5, 90 LFL_REREQUEST = 6, 91 LFL_ACTIVE = 7, 92 LFL_INLOCK = 8, 93 LFL_CANCEL = 9, 94 LFL_NOBAST = 10, 95 LFL_HEADQUE = 11, 96 LFL_UNLOCK_DELETE = 12, 97 LFL_AST_WAIT = 13, 98 }; 99 100 struct gdlm_lock { 101 struct gdlm_ls *ls; 102 struct lm_lockname lockname; 103 struct gdlm_strname strname; 104 char *lvb; 105 struct dlm_lksb lksb; 106 107 s16 cur; 108 s16 req; 109 s16 prev_req; 110 u32 lkf; /* dlm flags DLM_LKF_ */ 111 unsigned long flags; /* lock_dlm flags LFL_ */ 112 113 struct list_head delay_list; /* delayed */ 114 struct gdlm_lock *hold_null; /* NL lock for hold_lvb */ 115 }; 116 117 #define gdlm_assert(assertion, fmt, args...) \ 118 do { \ 119 if (unlikely(!(assertion))) { \ 120 printk(KERN_EMERG "lock_dlm: fatal assertion failed \"%s\"\n" \ 121 "lock_dlm: " fmt "\n", \ 122 #assertion, ##args); \ 123 BUG(); \ 124 } \ 125 } while (0) 126 127 #define log_print(lev, fmt, arg...) printk(lev "lock_dlm: " fmt "\n" , ## arg) 128 #define log_info(fmt, arg...) log_print(KERN_INFO , fmt , ## arg) 129 #define log_error(fmt, arg...) log_print(KERN_ERR , fmt , ## arg) 130 #ifdef LOCK_DLM_LOG_DEBUG 131 #define log_debug(fmt, arg...) log_print(KERN_DEBUG , fmt , ## arg) 132 #else 133 #define log_debug(fmt, arg...) 134 #endif 135 136 /* sysfs.c */ 137 138 int gdlm_sysfs_init(void); 139 void gdlm_sysfs_exit(void); 140 int gdlm_kobject_setup(struct gdlm_ls *, struct kobject *); 141 void gdlm_kobject_release(struct gdlm_ls *); 142 143 /* thread.c */ 144 145 int gdlm_init_threads(struct gdlm_ls *); 146 void gdlm_release_threads(struct gdlm_ls *); 147 148 /* lock.c */ 149 150 void gdlm_submit_delayed(struct gdlm_ls *); 151 unsigned int gdlm_do_lock(struct gdlm_lock *); 152 153 int gdlm_get_lock(void *, struct lm_lockname *, void **); 154 void gdlm_put_lock(void *); 155 unsigned int gdlm_lock(void *, unsigned int, unsigned int, unsigned int); 156 unsigned int gdlm_unlock(void *, unsigned int); 157 void gdlm_cancel(void *); 158 int gdlm_hold_lvb(void *, char **); 159 void gdlm_unhold_lvb(void *, char *); 160 161 /* mount.c */ 162 163 extern const struct lm_lockops gdlm_ops; 164 165 #endif 166 167