]>
git.proxmox.com Git - ceph.git/blob - ceph/src/mds/locks.c
1 // there must be a better way?
6 #include "include/int_types.h"
11 #include "include/ceph_fs.h"
14 static const struct sm_state_t simplelock
[LOCK_MAX
] = {
15 // stable loner rep state r rp rd wr fwr l x caps,other
16 [LOCK_SYNC
] = { 0, false, LOCK_SYNC
, ANY
, 0, ANY
, 0, 0, ANY
, 0, CEPH_CAP_GSHARED
,0,0,CEPH_CAP_GSHARED
},
17 [LOCK_LOCK_SYNC
] = { LOCK_SYNC
, false, LOCK_LOCK
, ANY
, XCL
, XCL
, 0, 0, XCL
, 0, 0,0,0,0 },
18 [LOCK_EXCL_SYNC
] = { LOCK_SYNC
, true, LOCK_LOCK
, 0, 0, 0, 0, XCL
, 0, 0, 0,CEPH_CAP_GSHARED
,0,0 },
19 [LOCK_SNAP_SYNC
] = { LOCK_SYNC
, false, LOCK_LOCK
, 0, 0, 0, 0, AUTH
,0, 0, 0,0,0,0 },
21 [LOCK_LOCK
] = { 0, false, LOCK_LOCK
, AUTH
, 0, REQ
, 0, 0, 0, 0, 0,0,0,0 },
22 [LOCK_SYNC_LOCK
] = { LOCK_LOCK
, false, LOCK_LOCK
, ANY
, 0, 0, 0, 0, 0, 0, 0,0,0,0 },
23 [LOCK_EXCL_LOCK
] = { LOCK_LOCK
, false, LOCK_LOCK
, 0, 0, 0, 0, XCL
, 0, 0, 0,0,0,0 },
25 [LOCK_PREXLOCK
] = { LOCK_LOCK
, false, LOCK_LOCK
, 0, XCL
, 0, 0, 0, 0, ANY
, 0,0,0,0 },
26 [LOCK_XLOCK
] = { LOCK_SYNC
, false, LOCK_LOCK
, 0, XCL
, 0, 0, 0, 0, 0, 0,0,0,0 },
27 [LOCK_XLOCKDONE
] = { LOCK_SYNC
, false, LOCK_LOCK
, XCL
, XCL
, XCL
, 0, 0, XCL
, 0, 0,0,CEPH_CAP_GSHARED
,0 },
28 [LOCK_LOCK_XLOCK
]= { LOCK_PREXLOCK
,false,LOCK_LOCK
,0, XCL
, 0, 0, 0, 0, XCL
, 0,0,0,0 },
30 [LOCK_EXCL
] = { 0, true, LOCK_LOCK
, 0, 0, REQ
, XCL
, 0, 0, 0, 0,CEPH_CAP_GEXCL
|CEPH_CAP_GSHARED
,0,0 },
31 [LOCK_SYNC_EXCL
] = { LOCK_EXCL
, true, LOCK_LOCK
, ANY
, 0, 0, 0, 0, 0, 0, 0,CEPH_CAP_GSHARED
,0,0 },
32 [LOCK_LOCK_EXCL
] = { LOCK_EXCL
, false, LOCK_LOCK
, ANY
, 0, 0, 0, 0, 0, 0, CEPH_CAP_GSHARED
,0,0,0 },
34 [LOCK_REMOTEXLOCK
]={ LOCK_LOCK
, false, LOCK_LOCK
, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0 },
38 const struct sm_t sm_simplelock
= {
40 .allowed_ever_auth
= CEPH_CAP_GSHARED
| CEPH_CAP_GEXCL
,
41 .allowed_ever_replica
= CEPH_CAP_GSHARED
,
42 .careful
= CEPH_CAP_GSHARED
| CEPH_CAP_GEXCL
,
43 .can_remote_xlock
= 1,
47 // lock state machine states:
48 // Sync -- Lock -- sCatter
52 static const struct sm_state_t scatterlock
[LOCK_MAX
] = {
53 // stable loner rep state r rp rd wr fwr l x caps,other
54 [LOCK_SYNC
] = { 0, false, LOCK_SYNC
, ANY
, 0, ANY
, 0, 0, ANY
, 0, CEPH_CAP_GSHARED
,0,0,CEPH_CAP_GSHARED
},
55 [LOCK_LOCK_SYNC
] = { LOCK_SYNC
, false, LOCK_LOCK
, AUTH
, 0, 0, 0, 0, 0, 0, 0,0,0,0 },
56 [LOCK_MIX_SYNC
] = { LOCK_SYNC
, false, LOCK_LOCK
, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0 },
57 [LOCK_SNAP_SYNC
] = { LOCK_SYNC
, false, LOCK_LOCK
, 0, 0, 0, 0, AUTH
,0, 0, 0,0,0,0 },
59 [LOCK_LOCK
] = { 0, false, LOCK_LOCK
, AUTH
, 0, REQ
, AUTH
,0, 0, ANY
, 0,0,0,0 },
60 [LOCK_SYNC_LOCK
] = { LOCK_LOCK
, false, LOCK_LOCK
, AUTH
, 0, 0, 0, 0, 0, 0, 0,0,0,0 },
61 [LOCK_MIX_LOCK
] = { LOCK_LOCK
, false, LOCK_MIX
, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0 },
62 [LOCK_MIX_LOCK2
] = { LOCK_LOCK
, false, LOCK_LOCK
, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0 },
63 [LOCK_TSYN_LOCK
] = { LOCK_LOCK
, false, LOCK_LOCK
, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0 },
65 [LOCK_TSYN
] = { 0, false, LOCK_LOCK
, AUTH
, 0, AUTH
,0, 0, 0, 0, 0,0,0,0 },
66 [LOCK_LOCK_TSYN
] = { LOCK_TSYN
, false, LOCK_LOCK
, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0 },
67 [LOCK_MIX_TSYN
] = { LOCK_TSYN
, false, LOCK_LOCK
, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0 },
69 [LOCK_MIX
] = { 0, false, LOCK_MIX
, 0, 0, REQ
, ANY
, 0, 0, 0, 0,0,0,0 },
70 [LOCK_TSYN_MIX
] = { LOCK_MIX
, false, LOCK_LOCK
, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0 },
71 [LOCK_SYNC_MIX
] = { LOCK_MIX
, false, LOCK_SYNC_MIX2
,0,0, 0, 0, 0, 0, 0, 0,0,0,0 },
72 [LOCK_SYNC_MIX2
] = { LOCK_MIX
, false, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0 },
75 const struct sm_t sm_scatterlock
= {
76 .states
= scatterlock
,
77 .allowed_ever_auth
= CEPH_CAP_GSHARED
| CEPH_CAP_GEXCL
,
78 .allowed_ever_replica
= CEPH_CAP_GSHARED
,
79 .careful
= CEPH_CAP_GSHARED
| CEPH_CAP_GEXCL
,
80 .can_remote_xlock
= 0,
83 const struct sm_state_t filelock
[LOCK_MAX
] = {
84 // stable loner rep state r rp rd wr fwr l x caps(any,loner,xlocker,replica)
85 [LOCK_SYNC
] = { 0, false, LOCK_SYNC
, ANY
, 0, ANY
, 0, 0, ANY
, 0, CEPH_CAP_GSHARED
|CEPH_CAP_GCACHE
|CEPH_CAP_GRD
,0,0,CEPH_CAP_GSHARED
|CEPH_CAP_GCACHE
|CEPH_CAP_GRD
},
86 [LOCK_LOCK_SYNC
] = { LOCK_SYNC
, false, LOCK_LOCK
, AUTH
, 0, 0, 0, 0, 0, 0, CEPH_CAP_GCACHE
,0,0,0 },
87 [LOCK_EXCL_SYNC
] = { LOCK_SYNC
, true, LOCK_LOCK
, 0, 0, 0, 0, XCL
, 0, 0, 0,CEPH_CAP_GSHARED
|CEPH_CAP_GCACHE
|CEPH_CAP_GRD
,0,0 },
88 [LOCK_MIX_SYNC
] = { LOCK_SYNC
, false, LOCK_MIX_SYNC2
,0,0, 0, 0, 0, 0, 0, CEPH_CAP_GRD
|CEPH_CAP_GLAZYIO
,0,0,CEPH_CAP_GRD
},
89 [LOCK_MIX_SYNC2
] = { LOCK_SYNC
, false, 0, 0, 0, 0, 0, 0, 0, 0, CEPH_CAP_GRD
|CEPH_CAP_GLAZYIO
,0,0,CEPH_CAP_GRD
},
90 [LOCK_SNAP_SYNC
] = { LOCK_SYNC
, false, LOCK_LOCK
, 0, 0, 0, 0, AUTH
,0, 0, 0,0,0,0 },
91 [LOCK_XSYN_SYNC
] = { LOCK_SYNC
, true, LOCK_LOCK
, AUTH
, 0, AUTH
,0, 0, 0, 0, 0,CEPH_CAP_GCACHE
,0,0 },
93 [LOCK_LOCK
] = { 0, false, LOCK_LOCK
, AUTH
, 0, REQ
, AUTH
,0, 0, 0, CEPH_CAP_GCACHE
|CEPH_CAP_GBUFFER
,0,0,0 },
94 [LOCK_SYNC_LOCK
] = { LOCK_LOCK
, false, LOCK_LOCK
, AUTH
, 0, REQ
, 0, 0, 0, 0, CEPH_CAP_GCACHE
,0,0,0 },
95 [LOCK_EXCL_LOCK
] = { LOCK_LOCK
, false, LOCK_LOCK
, 0, 0, 0, 0, XCL
, 0, 0, CEPH_CAP_GCACHE
|CEPH_CAP_GBUFFER
,0,0,0 },
96 [LOCK_MIX_LOCK
] = { LOCK_LOCK
, false, LOCK_MIX
, AUTH
, 0, REQ
, 0, 0, 0, 0, 0,0,0,0 },
97 [LOCK_MIX_LOCK2
] = { LOCK_LOCK
, false, LOCK_LOCK
, AUTH
, 0, REQ
, 0, 0, 0, 0, 0,0,0,0 },
98 [LOCK_XSYN_LOCK
] = { LOCK_LOCK
, true, LOCK_LOCK
, AUTH
, 0, 0, XCL
, 0, 0, 0, 0,CEPH_CAP_GCACHE
|CEPH_CAP_GBUFFER
,0,0 },
100 [LOCK_PREXLOCK
] = { LOCK_LOCK
, false, LOCK_LOCK
, 0, XCL
, 0, 0, 0, 0, ANY
, CEPH_CAP_GCACHE
|CEPH_CAP_GBUFFER
,0,0,0 },
101 [LOCK_XLOCK
] = { LOCK_LOCK
, false, LOCK_LOCK
, 0, XCL
, 0, 0, 0, 0, 0, CEPH_CAP_GCACHE
|CEPH_CAP_GBUFFER
,0,0,0 },
102 [LOCK_XLOCKDONE
] = { LOCK_LOCK
, false, LOCK_LOCK
, XCL
, XCL
, XCL
, 0, 0, XCL
, 0, CEPH_CAP_GCACHE
|CEPH_CAP_GBUFFER
,0,CEPH_CAP_GSHARED
,0 },
103 [LOCK_XLOCKSNAP
] = { LOCK_LOCK
, false, LOCK_LOCK
, 0, XCL
, 0, 0, 0, 0, 0, CEPH_CAP_GCACHE
,0,0,0 },
104 [LOCK_LOCK_XLOCK
]= { LOCK_PREXLOCK
,false,LOCK_LOCK
,0, XCL
, 0, 0, 0, 0, XCL
, CEPH_CAP_GCACHE
|CEPH_CAP_GBUFFER
,0,0,0 },
106 [LOCK_MIX
] = { 0, false, LOCK_MIX
, 0, 0, REQ
, ANY
, 0, 0, 0, CEPH_CAP_GRD
|CEPH_CAP_GWR
|CEPH_CAP_GLAZYIO
,0,0,CEPH_CAP_GRD
},
107 [LOCK_SYNC_MIX
] = { LOCK_MIX
, false, LOCK_SYNC_MIX2
,ANY
,0, 0, 0, 0, 0, 0, CEPH_CAP_GRD
|CEPH_CAP_GLAZYIO
,0,0,CEPH_CAP_GRD
},
108 [LOCK_SYNC_MIX2
] = { LOCK_MIX
, false, 0, 0, 0, 0, 0, 0, 0, 0, CEPH_CAP_GRD
|CEPH_CAP_GLAZYIO
,0,0,CEPH_CAP_GRD
},
109 [LOCK_EXCL_MIX
] = { LOCK_MIX
, true, LOCK_LOCK
, 0, 0, 0, XCL
, 0, 0, 0, 0,CEPH_CAP_GRD
|CEPH_CAP_GWR
|CEPH_CAP_GLAZYIO
,0,0 },
110 [LOCK_XSYN_MIX
] = { LOCK_MIX
, true, LOCK_LOCK
, 0, 0, 0, XCL
, 0, 0, 0, 0,0,0,0 },
112 [LOCK_EXCL
] = { 0, true, LOCK_LOCK
, 0, 0, XCL
, XCL
, 0, 0, 0, 0,CEPH_CAP_GSHARED
|CEPH_CAP_GEXCL
|CEPH_CAP_GCACHE
|CEPH_CAP_GRD
|CEPH_CAP_GWR
|CEPH_CAP_GBUFFER
|CEPH_CAP_GLAZYIO
,0,0 },
113 [LOCK_SYNC_EXCL
] = { LOCK_EXCL
, true, LOCK_LOCK
, AUTH
, 0, 0, 0, 0, 0, 0, 0,CEPH_CAP_GSHARED
|CEPH_CAP_GCACHE
|CEPH_CAP_GRD
,0,0 },
114 [LOCK_MIX_EXCL
] = { LOCK_EXCL
, true, LOCK_LOCK
, 0, 0, 0, XCL
, 0, 0, 0, 0,CEPH_CAP_GRD
|CEPH_CAP_GWR
|CEPH_CAP_GLAZYIO
,0,0 },
115 [LOCK_LOCK_EXCL
] = { LOCK_EXCL
, true, LOCK_LOCK
, AUTH
, 0, 0, 0, 0, 0, 0, 0,CEPH_CAP_GCACHE
|CEPH_CAP_GBUFFER
,0,0 },
116 [LOCK_XSYN_EXCL
] = { LOCK_EXCL
, true, LOCK_LOCK
, AUTH
, 0, XCL
, 0, 0, 0, 0, 0,CEPH_CAP_GCACHE
|CEPH_CAP_GBUFFER
,0,0 },
118 [LOCK_XSYN
] = { 0, true, LOCK_LOCK
, AUTH
, AUTH
,AUTH
,XCL
, 0, 0, 0, 0,CEPH_CAP_GCACHE
|CEPH_CAP_GBUFFER
,0,0 },
119 [LOCK_EXCL_XSYN
] = { LOCK_XSYN
, false, LOCK_LOCK
, 0, 0, XCL
, 0, 0, 0, 0, 0,CEPH_CAP_GCACHE
|CEPH_CAP_GBUFFER
,0,0 },
121 [LOCK_PRE_SCAN
] = { LOCK_SCAN
, false, LOCK_LOCK
, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0 },
122 [LOCK_SCAN
] = { LOCK_LOCK
, false, LOCK_LOCK
, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0 },
125 const struct sm_t sm_filelock
= {
127 .allowed_ever_auth
= (CEPH_CAP_GSHARED
|
135 .allowed_ever_replica
= (CEPH_CAP_GSHARED
|
139 .careful
= (CEPH_CAP_GSHARED
|
143 .can_remote_xlock
= 0,
147 const struct sm_state_t locallock
[LOCK_MAX
] = {
148 // stable loner rep state r rp rd wr fwr l x caps(any,loner,xlocker,replica)
149 [LOCK_LOCK
] = { 0, false, LOCK_LOCK
, ANY
, 0, ANY
, 0, 0, ANY
, AUTH
,0,0,0,0 },
152 const struct sm_t sm_locallock
= {
154 .allowed_ever_auth
= 0,
155 .allowed_ever_replica
= 0,
157 .can_remote_xlock
= 0,