]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/mds/SimpleLock.cc
import 15.2.0 Octopus source
[ceph.git] / ceph / src / mds / SimpleLock.cc
index c4c0ae0db24737b62b7c7f8b8ae3057f7a0b2a98..1f3b732169b7b751faeb71854075a67f7ce60811 100644 (file)
@@ -41,3 +41,66 @@ void SimpleLock::dump(Formatter *f) const {
   }
   f->close_section();
 }
+
+int SimpleLock::get_wait_shift() const {
+  switch (get_type()) {
+    case CEPH_LOCK_DN:       return 8;
+    case CEPH_LOCK_DVERSION: return 8 + 1*SimpleLock::WAIT_BITS;
+    case CEPH_LOCK_IAUTH:    return 8 + 2*SimpleLock::WAIT_BITS;
+    case CEPH_LOCK_ILINK:    return 8 + 3*SimpleLock::WAIT_BITS;
+    case CEPH_LOCK_IDFT:     return 8 + 4*SimpleLock::WAIT_BITS;
+    case CEPH_LOCK_IFILE:    return 8 + 5*SimpleLock::WAIT_BITS;
+    case CEPH_LOCK_IVERSION: return 8 + 6*SimpleLock::WAIT_BITS;
+    case CEPH_LOCK_IXATTR:   return 8 + 7*SimpleLock::WAIT_BITS;
+    case CEPH_LOCK_ISNAP:    return 8 + 8*SimpleLock::WAIT_BITS;
+    case CEPH_LOCK_INEST:    return 8 + 9*SimpleLock::WAIT_BITS;
+    case CEPH_LOCK_IFLOCK:   return 8 +10*SimpleLock::WAIT_BITS;
+    case CEPH_LOCK_IPOLICY:  return 8 +11*SimpleLock::WAIT_BITS;
+    default:
+      ceph_abort();
+  }
+}
+
+int SimpleLock::get_cap_shift() const {
+  switch (get_type()) {
+    case CEPH_LOCK_IAUTH: return CEPH_CAP_SAUTH;
+    case CEPH_LOCK_ILINK: return CEPH_CAP_SLINK;
+    case CEPH_LOCK_IFILE: return CEPH_CAP_SFILE;
+    case CEPH_LOCK_IXATTR: return CEPH_CAP_SXATTR;
+    default: return 0;
+  }
+}
+
+int SimpleLock::get_cap_mask() const {
+  switch (get_type()) {
+    case CEPH_LOCK_IFILE: return (1 << CEPH_CAP_FILE_BITS) - 1;
+    default: return (1 << CEPH_CAP_SIMPLE_BITS) - 1;
+  }
+}
+
+SimpleLock::unstable_bits_t::unstable_bits_t() :
+  lock_caches(member_offset(MDLockCache::LockItem, item_lock)) {}
+
+void SimpleLock::add_cache(MDLockCacheItem& item) {
+  more()->lock_caches.push_back(&item.item_lock);
+  state_flags |= CACHED;
+}
+
+void SimpleLock::remove_cache(MDLockCacheItem& item) {
+  auto& lock_caches = more()->lock_caches;
+  item.item_lock.remove_myself();
+  if (lock_caches.empty()) {
+    state_flags &= ~CACHED;
+    try_clear_more();
+  }
+}
+
+MDLockCache* SimpleLock::get_first_cache() {
+  if (have_more()) {
+    auto& lock_caches = more()->lock_caches;
+    if (!lock_caches.empty()) {
+      return lock_caches.front()->parent;
+    }
+  }
+  return nullptr;
+}