xref: /openbmc/linux/fs/ocfs2/dlmglue.h (revision 8be98d2f2a0a262f8bf8a0bc1fdf522b3c7aab17)
1  /* SPDX-License-Identifier: GPL-2.0-or-later */
2  /*
3   * dlmglue.h
4   *
5   * description here
6   *
7   * Copyright (C) 2002, 2004 Oracle.  All rights reserved.
8   */
9  
10  
11  #ifndef DLMGLUE_H
12  #define DLMGLUE_H
13  
14  #include "dcache.h"
15  
16  #define OCFS2_LVB_VERSION 5
17  
18  struct ocfs2_meta_lvb {
19  	__u8         lvb_version;
20  	__u8         lvb_reserved0;
21  	__be16       lvb_idynfeatures;
22  	__be32       lvb_iclusters;
23  	__be32       lvb_iuid;
24  	__be32       lvb_igid;
25  	__be64       lvb_iatime_packed;
26  	__be64       lvb_ictime_packed;
27  	__be64       lvb_imtime_packed;
28  	__be64       lvb_isize;
29  	__be16       lvb_imode;
30  	__be16       lvb_inlink;
31  	__be32       lvb_iattr;
32  	__be32       lvb_igeneration;
33  	__be32       lvb_reserved2;
34  };
35  
36  #define OCFS2_QINFO_LVB_VERSION 1
37  
38  struct ocfs2_qinfo_lvb {
39  	__u8	lvb_version;
40  	__u8	lvb_reserved[3];
41  	__be32	lvb_bgrace;
42  	__be32	lvb_igrace;
43  	__be32	lvb_syncms;
44  	__be32	lvb_blocks;
45  	__be32	lvb_free_blk;
46  	__be32	lvb_free_entry;
47  };
48  
49  #define OCFS2_ORPHAN_LVB_VERSION 1
50  
51  struct ocfs2_orphan_scan_lvb {
52  	__u8	lvb_version;
53  	__u8	lvb_reserved[3];
54  	__be32	lvb_os_seqno;
55  };
56  
57  #define OCFS2_TRIMFS_LVB_VERSION 1
58  
59  struct ocfs2_trim_fs_lvb {
60  	__u8	lvb_version;
61  	__u8	lvb_success;
62  	__u8	lvb_reserved[2];
63  	__be32	lvb_nodenum;
64  	__be64	lvb_start;
65  	__be64	lvb_len;
66  	__be64	lvb_minlen;
67  	__be64	lvb_trimlen;
68  };
69  
70  struct ocfs2_trim_fs_info {
71  	u8	tf_valid;	/* lvb is valid, or not */
72  	u8	tf_success;	/* trim is successful, or not */
73  	u32	tf_nodenum;	/* osb node number */
74  	u64	tf_start;	/* trim start offset in clusters */
75  	u64	tf_len;		/* trim end offset in clusters */
76  	u64	tf_minlen;	/* trim minimum contiguous free clusters */
77  	u64	tf_trimlen;	/* trimmed length in bytes */
78  };
79  
80  struct ocfs2_lock_holder {
81  	struct list_head oh_list;
82  	struct pid *oh_owner_pid;
83  	int oh_ex;
84  };
85  
86  /* ocfs2_inode_lock_full() 'arg_flags' flags */
87  /* don't wait on recovery. */
88  #define OCFS2_META_LOCK_RECOVERY	(0x01)
89  /* Instruct the dlm not to queue ourselves on the other node. */
90  #define OCFS2_META_LOCK_NOQUEUE		(0x02)
91  /* don't block waiting for the downconvert thread, instead return -EAGAIN */
92  #define OCFS2_LOCK_NONBLOCK		(0x04)
93  /* just get back disk inode bh if we've got cluster lock. */
94  #define OCFS2_META_LOCK_GETBH		(0x08)
95  
96  /* Locking subclasses of inode cluster lock */
97  enum {
98  	OI_LS_NORMAL = 0,
99  	OI_LS_PARENT,
100  	OI_LS_RENAME1,
101  	OI_LS_RENAME2,
102  	OI_LS_REFLINK_TARGET,
103  };
104  
105  int ocfs2_dlm_init(struct ocfs2_super *osb);
106  void ocfs2_dlm_shutdown(struct ocfs2_super *osb, int hangup_pending);
107  void ocfs2_lock_res_init_once(struct ocfs2_lock_res *res);
108  void ocfs2_inode_lock_res_init(struct ocfs2_lock_res *res,
109  			       enum ocfs2_lock_type type,
110  			       unsigned int generation,
111  			       struct inode *inode);
112  void ocfs2_dentry_lock_res_init(struct ocfs2_dentry_lock *dl,
113  				u64 parent, struct inode *inode);
114  struct ocfs2_file_private;
115  void ocfs2_file_lock_res_init(struct ocfs2_lock_res *lockres,
116  			      struct ocfs2_file_private *fp);
117  struct ocfs2_mem_dqinfo;
118  void ocfs2_qinfo_lock_res_init(struct ocfs2_lock_res *lockres,
119                                 struct ocfs2_mem_dqinfo *info);
120  void ocfs2_refcount_lock_res_init(struct ocfs2_lock_res *lockres,
121  				  struct ocfs2_super *osb, u64 ref_blkno,
122  				  unsigned int generation);
123  void ocfs2_lock_res_free(struct ocfs2_lock_res *res);
124  int ocfs2_create_new_inode_locks(struct inode *inode);
125  int ocfs2_drop_inode_locks(struct inode *inode);
126  int ocfs2_rw_lock(struct inode *inode, int write);
127  int ocfs2_try_rw_lock(struct inode *inode, int write);
128  void ocfs2_rw_unlock(struct inode *inode, int write);
129  int ocfs2_open_lock(struct inode *inode);
130  int ocfs2_try_open_lock(struct inode *inode, int write);
131  void ocfs2_open_unlock(struct inode *inode);
132  int ocfs2_inode_lock_atime(struct inode *inode,
133  			  struct vfsmount *vfsmnt,
134  			  int *level, int wait);
135  int ocfs2_inode_lock_full_nested(struct inode *inode,
136  			 struct buffer_head **ret_bh,
137  			 int ex,
138  			 int arg_flags,
139  			 int subclass);
140  int ocfs2_inode_lock_with_page(struct inode *inode,
141  			      struct buffer_head **ret_bh,
142  			      int ex,
143  			      struct page *page);
144  /* Variants without special locking class or flags */
145  #define ocfs2_inode_lock_full(i, r, e, f)\
146  		ocfs2_inode_lock_full_nested(i, r, e, f, OI_LS_NORMAL)
147  #define ocfs2_inode_lock_nested(i, b, e, s)\
148  		ocfs2_inode_lock_full_nested(i, b, e, 0, s)
149  /* 99% of the time we don't want to supply any additional flags --
150   * those are for very specific cases only. */
151  #define ocfs2_inode_lock(i, b, e) ocfs2_inode_lock_full_nested(i, b, e, 0, OI_LS_NORMAL)
152  #define ocfs2_try_inode_lock(i, b, e)\
153  		ocfs2_inode_lock_full_nested(i, b, e, OCFS2_META_LOCK_NOQUEUE,\
154  		OI_LS_NORMAL)
155  void ocfs2_inode_unlock(struct inode *inode,
156  		       int ex);
157  int ocfs2_super_lock(struct ocfs2_super *osb,
158  		     int ex);
159  void ocfs2_super_unlock(struct ocfs2_super *osb,
160  			int ex);
161  int ocfs2_orphan_scan_lock(struct ocfs2_super *osb, u32 *seqno);
162  void ocfs2_orphan_scan_unlock(struct ocfs2_super *osb, u32 seqno);
163  
164  int ocfs2_rename_lock(struct ocfs2_super *osb);
165  void ocfs2_rename_unlock(struct ocfs2_super *osb);
166  int ocfs2_nfs_sync_lock(struct ocfs2_super *osb, int ex);
167  void ocfs2_nfs_sync_unlock(struct ocfs2_super *osb, int ex);
168  void ocfs2_trim_fs_lock_res_init(struct ocfs2_super *osb);
169  void ocfs2_trim_fs_lock_res_uninit(struct ocfs2_super *osb);
170  int ocfs2_trim_fs_lock(struct ocfs2_super *osb,
171  		       struct ocfs2_trim_fs_info *info, int trylock);
172  void ocfs2_trim_fs_unlock(struct ocfs2_super *osb,
173  			  struct ocfs2_trim_fs_info *info);
174  int ocfs2_dentry_lock(struct dentry *dentry, int ex);
175  void ocfs2_dentry_unlock(struct dentry *dentry, int ex);
176  int ocfs2_file_lock(struct file *file, int ex, int trylock);
177  void ocfs2_file_unlock(struct file *file);
178  int ocfs2_qinfo_lock(struct ocfs2_mem_dqinfo *oinfo, int ex);
179  void ocfs2_qinfo_unlock(struct ocfs2_mem_dqinfo *oinfo, int ex);
180  struct ocfs2_refcount_tree;
181  int ocfs2_refcount_lock(struct ocfs2_refcount_tree *ref_tree, int ex);
182  void ocfs2_refcount_unlock(struct ocfs2_refcount_tree *ref_tree, int ex);
183  
184  
185  void ocfs2_mark_lockres_freeing(struct ocfs2_super *osb,
186  				struct ocfs2_lock_res *lockres);
187  void ocfs2_simple_drop_lockres(struct ocfs2_super *osb,
188  			       struct ocfs2_lock_res *lockres);
189  
190  /* for the downconvert thread */
191  void ocfs2_wake_downconvert_thread(struct ocfs2_super *osb);
192  
193  struct ocfs2_dlm_debug *ocfs2_new_dlm_debug(void);
194  void ocfs2_put_dlm_debug(struct ocfs2_dlm_debug *dlm_debug);
195  
196  /* To set the locking protocol on module initialization */
197  void ocfs2_set_locking_protocol(void);
198  
199  /* The _tracker pair is used to avoid cluster recursive locking */
200  int ocfs2_inode_lock_tracker(struct inode *inode,
201  			     struct buffer_head **ret_bh,
202  			     int ex,
203  			     struct ocfs2_lock_holder *oh);
204  void ocfs2_inode_unlock_tracker(struct inode *inode,
205  				int ex,
206  				struct ocfs2_lock_holder *oh,
207  				int had_lock);
208  
209  #endif	/* DLMGLUE_H */
210