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