1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* -*- mode: c; c-basic-offset: 8; -*- 3 * vim: noexpandtab sw=8 ts=8 sts=0: 4 * 5 * userdlm.h 6 * 7 * Userspace dlm defines 8 * 9 * Copyright (C) 2002, 2004 Oracle. All rights reserved. 10 */ 11 12 13 #ifndef USERDLM_H 14 #define USERDLM_H 15 16 #include <linux/module.h> 17 #include <linux/fs.h> 18 #include <linux/types.h> 19 #include <linux/workqueue.h> 20 21 /* user_lock_res->l_flags flags. */ 22 #define USER_LOCK_ATTACHED (0x00000001) /* we have initialized 23 * the lvb */ 24 #define USER_LOCK_BUSY (0x00000002) /* we are currently in 25 * dlm_lock */ 26 #define USER_LOCK_BLOCKED (0x00000004) /* blocked waiting to 27 * downconvert*/ 28 #define USER_LOCK_IN_TEARDOWN (0x00000008) /* we're currently 29 * destroying this 30 * lock. */ 31 #define USER_LOCK_QUEUED (0x00000010) /* lock is on the 32 * workqueue */ 33 #define USER_LOCK_IN_CANCEL (0x00000020) 34 35 struct user_lock_res { 36 spinlock_t l_lock; 37 38 int l_flags; 39 40 #define USER_DLM_LOCK_ID_MAX_LEN 32 41 char l_name[USER_DLM_LOCK_ID_MAX_LEN]; 42 int l_namelen; 43 int l_level; 44 unsigned int l_ro_holders; 45 unsigned int l_ex_holders; 46 struct ocfs2_dlm_lksb l_lksb; 47 48 int l_requested; 49 int l_blocking; 50 51 wait_queue_head_t l_event; 52 53 struct work_struct l_work; 54 }; 55 56 extern struct workqueue_struct *user_dlm_worker; 57 58 void user_dlm_lock_res_init(struct user_lock_res *lockres, 59 struct dentry *dentry); 60 int user_dlm_destroy_lock(struct user_lock_res *lockres); 61 int user_dlm_cluster_lock(struct user_lock_res *lockres, 62 int level, 63 int lkm_flags); 64 void user_dlm_cluster_unlock(struct user_lock_res *lockres, 65 int level); 66 void user_dlm_write_lvb(struct inode *inode, 67 const char *val, 68 unsigned int len); 69 bool user_dlm_read_lvb(struct inode *inode, char *val); 70 struct ocfs2_cluster_connection *user_dlm_register(const struct qstr *name); 71 void user_dlm_unregister(struct ocfs2_cluster_connection *conn); 72 void user_dlm_set_locking_protocol(void); 73 74 struct dlmfs_inode_private { 75 struct ocfs2_cluster_connection *ip_conn; 76 77 struct user_lock_res ip_lockres; /* unused for directories. */ 78 struct inode *ip_parent; 79 80 struct inode ip_vfs_inode; 81 }; 82 83 static inline struct dlmfs_inode_private * 84 DLMFS_I(struct inode *inode) 85 { 86 return container_of(inode, 87 struct dlmfs_inode_private, 88 ip_vfs_inode); 89 } 90 91 struct dlmfs_filp_private { 92 int fp_lock_level; 93 }; 94 95 #define DLMFS_MAGIC 0x76a9f425 96 97 #endif /* USERDLM_H */ 98