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 * ocfs2_lockid.h
6 *
7 * Defines OCFS2 lockid bits.
8 *
9 * Copyright (C) 2002, 2005 Oracle.  All rights reserved.
10 */
11
12#ifndef OCFS2_LOCKID_H
13#define OCFS2_LOCKID_H
14
15/* lock ids are made up in the following manner:
16 * name[0]     --> type
17 * name[1-6]   --> 6 pad characters, reserved for now
18 * name[7-22]  --> block number, expressed in hex as 16 chars
19 * name[23-30] --> i_generation, expressed in hex 8 chars
20 * name[31]    --> '\0' */
21#define OCFS2_LOCK_ID_MAX_LEN  32
22#define OCFS2_LOCK_ID_PAD "000000"
23
24#define OCFS2_DENTRY_LOCK_INO_START 18
25
26enum ocfs2_lock_type {
27	OCFS2_LOCK_TYPE_META = 0,
28	OCFS2_LOCK_TYPE_DATA,
29	OCFS2_LOCK_TYPE_SUPER,
30	OCFS2_LOCK_TYPE_RENAME,
31	OCFS2_LOCK_TYPE_RW,
32	OCFS2_LOCK_TYPE_DENTRY,
33	OCFS2_LOCK_TYPE_OPEN,
34	OCFS2_LOCK_TYPE_FLOCK,
35	OCFS2_LOCK_TYPE_QINFO,
36	OCFS2_LOCK_TYPE_NFS_SYNC,
37	OCFS2_LOCK_TYPE_ORPHAN_SCAN,
38	OCFS2_LOCK_TYPE_REFCOUNT,
39	OCFS2_LOCK_TYPE_TRIM_FS,
40	OCFS2_NUM_LOCK_TYPES
41};
42
43static inline char ocfs2_lock_type_char(enum ocfs2_lock_type type)
44{
45	char c;
46	switch (type) {
47		case OCFS2_LOCK_TYPE_META:
48			c = 'M';
49			break;
50		case OCFS2_LOCK_TYPE_DATA:
51			c = 'D';
52			break;
53		case OCFS2_LOCK_TYPE_SUPER:
54			c = 'S';
55			break;
56		case OCFS2_LOCK_TYPE_RENAME:
57			c = 'R';
58			break;
59		case OCFS2_LOCK_TYPE_RW:
60			c = 'W';
61			break;
62		case OCFS2_LOCK_TYPE_DENTRY:
63			c = 'N';
64			break;
65		case OCFS2_LOCK_TYPE_OPEN:
66			c = 'O';
67			break;
68		case OCFS2_LOCK_TYPE_FLOCK:
69			c = 'F';
70			break;
71		case OCFS2_LOCK_TYPE_QINFO:
72			c = 'Q';
73			break;
74		case OCFS2_LOCK_TYPE_NFS_SYNC:
75			c = 'Y';
76			break;
77		case OCFS2_LOCK_TYPE_ORPHAN_SCAN:
78			c = 'P';
79			break;
80		case OCFS2_LOCK_TYPE_REFCOUNT:
81			c = 'T';
82			break;
83		case OCFS2_LOCK_TYPE_TRIM_FS:
84			c = 'I';
85			break;
86		default:
87			c = '\0';
88	}
89
90	return c;
91}
92
93static char *ocfs2_lock_type_strings[] = {
94	[OCFS2_LOCK_TYPE_META] = "Meta",
95	[OCFS2_LOCK_TYPE_DATA] = "Data",
96	[OCFS2_LOCK_TYPE_SUPER] = "Super",
97	[OCFS2_LOCK_TYPE_RENAME] = "Rename",
98	/* Need to differntiate from [R]ename.. serializing writes is the
99	 * important job it does, anyway. */
100	[OCFS2_LOCK_TYPE_RW] = "Write/Read",
101	[OCFS2_LOCK_TYPE_DENTRY] = "Dentry",
102	[OCFS2_LOCK_TYPE_OPEN] = "Open",
103	[OCFS2_LOCK_TYPE_FLOCK] = "Flock",
104	[OCFS2_LOCK_TYPE_QINFO] = "Quota",
105	[OCFS2_LOCK_TYPE_NFS_SYNC] = "NFSSync",
106	[OCFS2_LOCK_TYPE_ORPHAN_SCAN] = "OrphanScan",
107	[OCFS2_LOCK_TYPE_REFCOUNT] = "Refcount",
108	[OCFS2_LOCK_TYPE_TRIM_FS] = "TrimFs",
109};
110
111static inline const char *ocfs2_lock_type_string(enum ocfs2_lock_type type)
112{
113#ifdef __KERNEL__
114	BUG_ON(type >= OCFS2_NUM_LOCK_TYPES);
115#endif
116	return ocfs2_lock_type_strings[type];
117}
118
119#endif  /* OCFS2_LOCKID_H */
120