xref: /openbmc/linux/fs/ocfs2/dlmfs/userdlm.h (revision 612645f7cfe1221f8066b87d62089719bcf43f68)
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