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