1/* -*- mode: c; c-basic-offset: 8; -*-
2 * vim: noexpandtab sw=8 ts=8 sts=0:
3 *
4 * ocfs2_lockid.h
5 *
6 * Defines OCFS2 lockid bits.
7 *
8 * Copyright (C) 2002, 2005 Oracle.  All rights reserved.
9 *
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public
12 * License as published by the Free Software Foundation; either
13 * version 2 of the License, or (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18 * General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public
21 * License along with this program; if not, write to the
22 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 * Boston, MA 021110-1307, USA.
24 */
25
26#ifndef OCFS2_LOCKID_H
27#define OCFS2_LOCKID_H
28
29/* lock ids are made up in the following manner:
30 * name[0]     --> type
31 * name[1-6]   --> 6 pad characters, reserved for now
32 * name[7-22]  --> block number, expressed in hex as 16 chars
33 * name[23-30] --> i_generation, expressed in hex 8 chars
34 * name[31]    --> '\0' */
35#define OCFS2_LOCK_ID_MAX_LEN  32
36#define OCFS2_LOCK_ID_PAD "000000"
37
38#define OCFS2_DENTRY_LOCK_INO_START 18
39
40enum ocfs2_lock_type {
41	OCFS2_LOCK_TYPE_META = 0,
42	OCFS2_LOCK_TYPE_DATA,
43	OCFS2_LOCK_TYPE_SUPER,
44	OCFS2_LOCK_TYPE_RENAME,
45	OCFS2_LOCK_TYPE_RW,
46	OCFS2_LOCK_TYPE_DENTRY,
47	OCFS2_LOCK_TYPE_OPEN,
48	OCFS2_LOCK_TYPE_FLOCK,
49	OCFS2_LOCK_TYPE_QINFO,
50	OCFS2_LOCK_TYPE_NFS_SYNC,
51	OCFS2_LOCK_TYPE_ORPHAN_SCAN,
52	OCFS2_LOCK_TYPE_REFCOUNT,
53	OCFS2_NUM_LOCK_TYPES
54};
55
56static inline char ocfs2_lock_type_char(enum ocfs2_lock_type type)
57{
58	char c;
59	switch (type) {
60		case OCFS2_LOCK_TYPE_META:
61			c = 'M';
62			break;
63		case OCFS2_LOCK_TYPE_DATA:
64			c = 'D';
65			break;
66		case OCFS2_LOCK_TYPE_SUPER:
67			c = 'S';
68			break;
69		case OCFS2_LOCK_TYPE_RENAME:
70			c = 'R';
71			break;
72		case OCFS2_LOCK_TYPE_RW:
73			c = 'W';
74			break;
75		case OCFS2_LOCK_TYPE_DENTRY:
76			c = 'N';
77			break;
78		case OCFS2_LOCK_TYPE_OPEN:
79			c = 'O';
80			break;
81		case OCFS2_LOCK_TYPE_FLOCK:
82			c = 'F';
83			break;
84		case OCFS2_LOCK_TYPE_QINFO:
85			c = 'Q';
86			break;
87		case OCFS2_LOCK_TYPE_NFS_SYNC:
88			c = 'Y';
89			break;
90		case OCFS2_LOCK_TYPE_ORPHAN_SCAN:
91			c = 'P';
92			break;
93		case OCFS2_LOCK_TYPE_REFCOUNT:
94			c = 'T';
95			break;
96		default:
97			c = '\0';
98	}
99
100	return c;
101}
102
103static char *ocfs2_lock_type_strings[] = {
104	[OCFS2_LOCK_TYPE_META] = "Meta",
105	[OCFS2_LOCK_TYPE_DATA] = "Data",
106	[OCFS2_LOCK_TYPE_SUPER] = "Super",
107	[OCFS2_LOCK_TYPE_RENAME] = "Rename",
108	/* Need to differntiate from [R]ename.. serializing writes is the
109	 * important job it does, anyway. */
110	[OCFS2_LOCK_TYPE_RW] = "Write/Read",
111	[OCFS2_LOCK_TYPE_DENTRY] = "Dentry",
112	[OCFS2_LOCK_TYPE_OPEN] = "Open",
113	[OCFS2_LOCK_TYPE_FLOCK] = "Flock",
114	[OCFS2_LOCK_TYPE_QINFO] = "Quota",
115	[OCFS2_LOCK_TYPE_NFS_SYNC] = "NFSSync",
116	[OCFS2_LOCK_TYPE_ORPHAN_SCAN] = "OrphanScan",
117	[OCFS2_LOCK_TYPE_REFCOUNT] = "Refcount",
118};
119
120static inline const char *ocfs2_lock_type_string(enum ocfs2_lock_type type)
121{
122#ifdef __KERNEL__
123	BUG_ON(type >= OCFS2_NUM_LOCK_TYPES);
124#endif
125	return ocfs2_lock_type_strings[type];
126}
127
128#endif  /* OCFS2_LOCKID_H */
129