134a9dd7eSJoel Becker /* -*- mode: c; c-basic-offset: 8; -*- 234a9dd7eSJoel Becker * vim: noexpandtab sw=8 ts=8 sts=0: 334a9dd7eSJoel Becker * 434a9dd7eSJoel Becker * userdlm.h 534a9dd7eSJoel Becker * 634a9dd7eSJoel Becker * Userspace dlm defines 734a9dd7eSJoel Becker * 834a9dd7eSJoel Becker * Copyright (C) 2002, 2004 Oracle. All rights reserved. 934a9dd7eSJoel Becker * 1034a9dd7eSJoel Becker * This program is free software; you can redistribute it and/or 1134a9dd7eSJoel Becker * modify it under the terms of the GNU General Public 1234a9dd7eSJoel Becker * License as published by the Free Software Foundation; either 1334a9dd7eSJoel Becker * version 2 of the License, or (at your option) any later version. 1434a9dd7eSJoel Becker * 1534a9dd7eSJoel Becker * This program is distributed in the hope that it will be useful, 1634a9dd7eSJoel Becker * but WITHOUT ANY WARRANTY; without even the implied warranty of 1734a9dd7eSJoel Becker * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1834a9dd7eSJoel Becker * General Public License for more details. 1934a9dd7eSJoel Becker * 2034a9dd7eSJoel Becker * You should have received a copy of the GNU General Public 2134a9dd7eSJoel Becker * License along with this program; if not, write to the 2234a9dd7eSJoel Becker * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 2334a9dd7eSJoel Becker * Boston, MA 021110-1307, USA. 2434a9dd7eSJoel Becker */ 2534a9dd7eSJoel Becker 2634a9dd7eSJoel Becker 2734a9dd7eSJoel Becker #ifndef USERDLM_H 2834a9dd7eSJoel Becker #define USERDLM_H 2934a9dd7eSJoel Becker 3034a9dd7eSJoel Becker #include <linux/module.h> 3134a9dd7eSJoel Becker #include <linux/fs.h> 3234a9dd7eSJoel Becker #include <linux/types.h> 3334a9dd7eSJoel Becker #include <linux/workqueue.h> 3434a9dd7eSJoel Becker 3534a9dd7eSJoel Becker /* user_lock_res->l_flags flags. */ 3634a9dd7eSJoel Becker #define USER_LOCK_ATTACHED (0x00000001) /* we have initialized 3734a9dd7eSJoel Becker * the lvb */ 3834a9dd7eSJoel Becker #define USER_LOCK_BUSY (0x00000002) /* we are currently in 3934a9dd7eSJoel Becker * dlm_lock */ 4034a9dd7eSJoel Becker #define USER_LOCK_BLOCKED (0x00000004) /* blocked waiting to 4134a9dd7eSJoel Becker * downconvert*/ 4234a9dd7eSJoel Becker #define USER_LOCK_IN_TEARDOWN (0x00000008) /* we're currently 4334a9dd7eSJoel Becker * destroying this 4434a9dd7eSJoel Becker * lock. */ 4534a9dd7eSJoel Becker #define USER_LOCK_QUEUED (0x00000010) /* lock is on the 4634a9dd7eSJoel Becker * workqueue */ 4734a9dd7eSJoel Becker #define USER_LOCK_IN_CANCEL (0x00000020) 4834a9dd7eSJoel Becker 4934a9dd7eSJoel Becker struct user_lock_res { 5034a9dd7eSJoel Becker spinlock_t l_lock; 5134a9dd7eSJoel Becker 5234a9dd7eSJoel Becker int l_flags; 5334a9dd7eSJoel Becker 5434a9dd7eSJoel Becker #define USER_DLM_LOCK_ID_MAX_LEN 32 5534a9dd7eSJoel Becker char l_name[USER_DLM_LOCK_ID_MAX_LEN]; 5634a9dd7eSJoel Becker int l_namelen; 5734a9dd7eSJoel Becker int l_level; 5834a9dd7eSJoel Becker unsigned int l_ro_holders; 5934a9dd7eSJoel Becker unsigned int l_ex_holders; 600016eedcSJoel Becker struct ocfs2_dlm_lksb l_lksb; 6134a9dd7eSJoel Becker 6234a9dd7eSJoel Becker int l_requested; 6334a9dd7eSJoel Becker int l_blocking; 6434a9dd7eSJoel Becker 6534a9dd7eSJoel Becker wait_queue_head_t l_event; 6634a9dd7eSJoel Becker 6734a9dd7eSJoel Becker struct work_struct l_work; 6834a9dd7eSJoel Becker }; 6934a9dd7eSJoel Becker 7034a9dd7eSJoel Becker extern struct workqueue_struct *user_dlm_worker; 7134a9dd7eSJoel Becker 7234a9dd7eSJoel Becker void user_dlm_lock_res_init(struct user_lock_res *lockres, 7334a9dd7eSJoel Becker struct dentry *dentry); 7434a9dd7eSJoel Becker int user_dlm_destroy_lock(struct user_lock_res *lockres); 7534a9dd7eSJoel Becker int user_dlm_cluster_lock(struct user_lock_res *lockres, 7634a9dd7eSJoel Becker int level, 7734a9dd7eSJoel Becker int lkm_flags); 7834a9dd7eSJoel Becker void user_dlm_cluster_unlock(struct user_lock_res *lockres, 7934a9dd7eSJoel Becker int level); 8034a9dd7eSJoel Becker void user_dlm_write_lvb(struct inode *inode, 8134a9dd7eSJoel Becker const char *val, 8234a9dd7eSJoel Becker unsigned int len); 830016eedcSJoel Becker ssize_t user_dlm_read_lvb(struct inode *inode, 8434a9dd7eSJoel Becker char *val, 8534a9dd7eSJoel Becker unsigned int len); 86*612645f7SAl Viro struct ocfs2_cluster_connection *user_dlm_register(const struct qstr *name); 870016eedcSJoel Becker void user_dlm_unregister(struct ocfs2_cluster_connection *conn); 880016eedcSJoel Becker void user_dlm_set_locking_protocol(void); 8934a9dd7eSJoel Becker 9034a9dd7eSJoel Becker struct dlmfs_inode_private { 910016eedcSJoel Becker struct ocfs2_cluster_connection *ip_conn; 9234a9dd7eSJoel Becker 9334a9dd7eSJoel Becker struct user_lock_res ip_lockres; /* unused for directories. */ 9434a9dd7eSJoel Becker struct inode *ip_parent; 9534a9dd7eSJoel Becker 9634a9dd7eSJoel Becker struct inode ip_vfs_inode; 9734a9dd7eSJoel Becker }; 9834a9dd7eSJoel Becker 9934a9dd7eSJoel Becker static inline struct dlmfs_inode_private * 10034a9dd7eSJoel Becker DLMFS_I(struct inode *inode) 10134a9dd7eSJoel Becker { 10234a9dd7eSJoel Becker return container_of(inode, 10334a9dd7eSJoel Becker struct dlmfs_inode_private, 10434a9dd7eSJoel Becker ip_vfs_inode); 10534a9dd7eSJoel Becker } 10634a9dd7eSJoel Becker 10734a9dd7eSJoel Becker struct dlmfs_filp_private { 10834a9dd7eSJoel Becker int fp_lock_level; 10934a9dd7eSJoel Becker }; 11034a9dd7eSJoel Becker 11134a9dd7eSJoel Becker #define DLMFS_MAGIC 0x76a9f425 11234a9dd7eSJoel Becker 11334a9dd7eSJoel Becker #endif /* USERDLM_H */ 114