]>
git.proxmox.com Git - ceph.git/blob - ceph/src/mds/SimpleLock.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) 2015 Red Hat
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.
16 #include "SimpleLock.h"
19 void SimpleLock::dump(ceph::Formatter
*f
) const {
20 ceph_assert(f
!= NULL
);
21 if (is_sync_and_unlocked()) {
25 f
->open_array_section("gather_set");
27 for(const auto &i
: more()->gather_set
) {
28 f
->dump_int("rank", i
);
33 f
->dump_string("state", get_state_name(get_state()));
34 f
->dump_bool("is_leased", is_leased());
35 f
->dump_int("num_rdlocks", get_num_rdlocks());
36 f
->dump_int("num_wrlocks", get_num_wrlocks());
37 f
->dump_int("num_xlocks", get_num_xlocks());
38 f
->open_object_section("xlock_by");
40 get_xlock_by()->dump(f
);
45 int SimpleLock::get_wait_shift() const {
47 case CEPH_LOCK_DN
: return 8;
48 case CEPH_LOCK_DVERSION
: return 8 + 1*SimpleLock::WAIT_BITS
;
49 case CEPH_LOCK_IAUTH
: return 8 + 2*SimpleLock::WAIT_BITS
;
50 case CEPH_LOCK_ILINK
: return 8 + 3*SimpleLock::WAIT_BITS
;
51 case CEPH_LOCK_IDFT
: return 8 + 4*SimpleLock::WAIT_BITS
;
52 case CEPH_LOCK_IFILE
: return 8 + 5*SimpleLock::WAIT_BITS
;
53 case CEPH_LOCK_IVERSION
: return 8 + 6*SimpleLock::WAIT_BITS
;
54 case CEPH_LOCK_IXATTR
: return 8 + 7*SimpleLock::WAIT_BITS
;
55 case CEPH_LOCK_ISNAP
: return 8 + 8*SimpleLock::WAIT_BITS
;
56 case CEPH_LOCK_INEST
: return 8 + 9*SimpleLock::WAIT_BITS
;
57 case CEPH_LOCK_IFLOCK
: return 8 +10*SimpleLock::WAIT_BITS
;
58 case CEPH_LOCK_IPOLICY
: return 8 +11*SimpleLock::WAIT_BITS
;
64 int SimpleLock::get_cap_shift() const {
66 case CEPH_LOCK_IAUTH
: return CEPH_CAP_SAUTH
;
67 case CEPH_LOCK_ILINK
: return CEPH_CAP_SLINK
;
68 case CEPH_LOCK_IFILE
: return CEPH_CAP_SFILE
;
69 case CEPH_LOCK_IXATTR
: return CEPH_CAP_SXATTR
;
74 int SimpleLock::get_cap_mask() const {
76 case CEPH_LOCK_IFILE
: return (1 << CEPH_CAP_FILE_BITS
) - 1;
77 default: return (1 << CEPH_CAP_SIMPLE_BITS
) - 1;
81 SimpleLock::unstable_bits_t::unstable_bits_t() :
82 lock_caches(member_offset(MDLockCache::LockItem
, item_lock
)) {}
84 void SimpleLock::add_cache(MDLockCacheItem
& item
) {
85 more()->lock_caches
.push_back(&item
.item_lock
);
86 state_flags
|= CACHED
;
89 void SimpleLock::remove_cache(MDLockCacheItem
& item
) {
90 auto& lock_caches
= more()->lock_caches
;
91 item
.item_lock
.remove_myself();
92 if (lock_caches
.empty()) {
93 state_flags
&= ~CACHED
;
98 std::vector
<MDLockCache
*> SimpleLock::get_active_caches() {
99 std::vector
<MDLockCache
*> result
;
101 for (auto it
= more()->lock_caches
.begin_use_current(); !it
.end(); ++it
) {
102 auto lock_cache
= (*it
)->parent
;
103 if (!lock_cache
->invalidating
)
104 result
.push_back(lock_cache
);