]>
git.proxmox.com Git - ceph.git/blob - ceph/src/mds/Capability.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 * Ceph - scalable distributed file system
6 * Copyright (C) 2004-2006 Sage Weil <sage@newdream.net>
8 * This is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License version 2.1, as published by the Free Software
11 * Foundation. See file COPYING.
15 #include "Capability.h"
16 #include "SessionMap.h"
18 #include "common/Formatter.h"
25 void Capability::Export::encode(bufferlist
&bl
) const
27 ENCODE_START(2, 2, bl
);
31 ::encode(pending
, bl
);
32 ::encode(client_follows
, bl
);
35 ::encode(last_issue_stamp
, bl
);
39 void Capability::Export::decode(bufferlist::iterator
&p
)
41 DECODE_START_LEGACY_COMPAT_LEN(2, 2, 2, p
);
46 ::decode(client_follows
, p
);
49 ::decode(last_issue_stamp
, p
);
53 void Capability::Export::dump(Formatter
*f
) const
55 f
->dump_unsigned("cap_id", cap_id
);
56 f
->dump_unsigned("wanted", wanted
);
57 f
->dump_unsigned("issued", issued
);
58 f
->dump_unsigned("pending", pending
);
59 f
->dump_unsigned("client_follows", client_follows
);
60 f
->dump_unsigned("seq", seq
);
61 f
->dump_unsigned("migrate_seq", mseq
);
62 f
->dump_stream("last_issue_stamp") << last_issue_stamp
;
65 void Capability::Export::generate_test_instances(list
<Capability::Export
*>& ls
)
67 ls
.push_back(new Export
);
68 ls
.push_back(new Export
);
69 ls
.back()->wanted
= 1;
70 ls
.back()->issued
= 2;
71 ls
.back()->pending
= 3;
72 ls
.back()->client_follows
= 4;
74 ls
.back()->last_issue_stamp
= utime_t(6, 7);
77 void Capability::Import::encode(bufferlist
&bl
) const
79 ENCODE_START(1, 1, bl
);
81 ::encode(issue_seq
, bl
);
86 void Capability::Import::decode(bufferlist::iterator
&bl
)
90 ::decode(issue_seq
, bl
);
95 void Capability::Import::dump(Formatter
*f
) const
97 f
->dump_unsigned("cap_id", cap_id
);
98 f
->dump_unsigned("issue_seq", issue_seq
);
99 f
->dump_unsigned("migrate_seq", mseq
);
103 * Capability::revoke_info
106 void Capability::revoke_info::encode(bufferlist
& bl
) const
108 ENCODE_START(2, 2, bl
)
109 ::encode(before
, bl
);
111 ::encode(last_issue
, bl
);
115 void Capability::revoke_info::decode(bufferlist::iterator
& bl
)
117 DECODE_START_LEGACY_COMPAT_LEN(2, 2, 2, bl
);
118 ::decode(before
, bl
);
120 ::decode(last_issue
, bl
);
124 void Capability::revoke_info::dump(Formatter
*f
) const
126 f
->dump_unsigned("before", before
);
127 f
->dump_unsigned("seq", seq
);
128 f
->dump_unsigned("last_issue", last_issue
);
131 void Capability::revoke_info::generate_test_instances(list
<Capability::revoke_info
*>& ls
)
133 ls
.push_back(new revoke_info
);
134 ls
.push_back(new revoke_info
);
135 ls
.back()->before
= 1;
137 ls
.back()->last_issue
= 3;
144 Capability::Capability(CInode
*i
, Session
*s
, uint64_t id
) :
146 client_xattr_version(0), client_inline_version(0),
147 last_rbytes(0), last_rsize(0),
148 item_session_caps(this), item_snaprealm_caps(this),
149 item_revoking_caps(this), item_client_revoking_caps(this),
150 inode(i
), session(s
),
151 cap_id(id
), _wanted(0), num_revoke_warnings(0),
152 _pending(0), _issued(0), last_sent(0), last_issue(0), mseq(0),
153 suppress(0), state(0)
156 session
->touch_cap_bottom(this);
157 cap_gen
= session
->get_cap_gen();
161 client_t
Capability::get_client() const
163 return session
? session
->get_client() : client_t(-1);
166 bool Capability::is_stale() const
168 return session
? session
->is_stale() : false;
171 bool Capability::is_valid() const
173 return !session
|| session
->get_cap_gen() == cap_gen
;
176 void Capability::revalidate()
181 if (_pending
& ~CEPH_CAP_PIN
)
184 bool was_revoking
= _issued
& ~_pending
;
185 _pending
= _issued
= CEPH_CAP_PIN
;
188 cap_gen
= session
->get_cap_gen();
191 maybe_clear_notable();
194 void Capability::mark_notable()
196 state
|= STATE_NOTABLE
;
197 session
->touch_cap(this);
200 void Capability::maybe_clear_notable()
202 if ((_issued
== _pending
) &&
203 !is_clientwriteable() &&
204 !is_wanted_notable(_wanted
)) {
205 ceph_assert(is_notable());
206 state
&= ~STATE_NOTABLE
;
207 session
->touch_cap_bottom(this);
211 void Capability::set_wanted(int w
) {
212 CInode
*in
= get_inode();
214 if (!is_wanted_notable(_wanted
) && is_wanted_notable(w
)) {
217 } else if (is_wanted_notable(_wanted
) && !is_wanted_notable(w
)) {
218 maybe_clear_notable();
224 void Capability::encode(bufferlist
& bl
) const
226 ENCODE_START(2, 2, bl
)
227 ::encode(last_sent
, bl
);
228 ::encode(last_issue_stamp
, bl
);
230 ::encode(_wanted
, bl
);
231 ::encode(_pending
, bl
);
232 ::encode(_revokes
, bl
);
236 void Capability::decode(bufferlist::iterator
&bl
)
238 DECODE_START_LEGACY_COMPAT_LEN(2, 2, 2, bl
)
239 ::decode(last_sent
, bl
);
240 ::decode(last_issue_stamp
, bl
);
242 ::decode(_wanted
, bl
);
243 ::decode(_pending
, bl
);
244 ::decode(_revokes
, bl
);
250 void Capability::dump(Formatter
*f
) const
252 f
->dump_unsigned("last_sent", last_sent
);
253 f
->dump_unsigned("last_issue_stamp", last_issue_stamp
);
254 f
->dump_unsigned("wanted", _wanted
);
255 f
->dump_unsigned("pending", _pending
);
257 f
->open_array_section("revokes");
258 for (const auto &r
: _revokes
) {
259 f
->open_object_section("revoke");
266 void Capability::generate_test_instances(list
<Capability
*>& ls
)
268 ls
.push_back(new Capability
);
269 ls
.push_back(new Capability
);
270 ls
.back()->last_sent
= 11;
271 ls
.back()->last_issue_stamp
= utime_t(12, 13);
272 ls
.back()->_wanted
= 14;
273 ls
.back()->_pending
= 15;
275 ls
.back()->_revokes
.emplace_back();
276 auto &r
= ls
.back()->_revokes
.back();
282 ls
.back()->_revokes
.emplace_back();
283 auto &r
= ls
.back()->_revokes
.back();
290 MEMPOOL_DEFINE_OBJECT_FACTORY(Capability
, co_cap
, mds_co
);