summaryrefslogtreecommitdiffstats
path: root/src/mds/cephfs_features.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/mds/cephfs_features.cc')
-rw-r--r--src/mds/cephfs_features.cc80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/mds/cephfs_features.cc b/src/mds/cephfs_features.cc
new file mode 100644
index 000000000..4a864076b
--- /dev/null
+++ b/src/mds/cephfs_features.cc
@@ -0,0 +1,80 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#include <array>
+#include "cephfs_features.h"
+#include "mdstypes.h"
+
+#include <fmt/format.h>
+
+static const std::array feature_names
+{
+ "reserved",
+ "reserved",
+ "reserved",
+ "reserved",
+ "reserved",
+ "jewel",
+ "kraken",
+ "luminous",
+ "mimic",
+ "reply_encoding",
+ "reclaim_client",
+ "lazy_caps_wanted",
+ "multi_reconnect",
+ "deleg_ino",
+ "metric_collect",
+ "alternate_name",
+ "notify_session_state",
+ "op_getvxattr",
+ "32bits_retry_fwd",
+ "new_snaprealm_info",
+ "has_owner_uidgid",
+};
+static_assert(feature_names.size() == CEPHFS_FEATURE_MAX + 1);
+
+std::string_view cephfs_feature_name(size_t id)
+{
+ if (id > feature_names.size())
+ return "unknown";
+ return feature_names[id];
+}
+
+int cephfs_feature_from_name(std::string_view name)
+{
+ if (name == "reserved") {
+ return -1;
+ }
+ for (size_t i = 0; i < feature_names.size(); ++i) {
+ if (name == feature_names[i])
+ return i;
+ }
+ return -1;
+}
+
+std::string cephfs_stringify_features(const feature_bitset_t& features)
+{
+ CachedStackStringStream css;
+ bool first = true;
+ *css << "{";
+ for (size_t i = 0; i < feature_names.size(); ++i) {
+ if (!features.test(i))
+ continue;
+ if (!first)
+ *css << ",";
+ *css << i << "=" << cephfs_feature_name(i);
+ first = false;
+ }
+ *css << "}";
+ return css->str();
+}
+
+void cephfs_dump_features(ceph::Formatter *f, const feature_bitset_t& features)
+{
+ for (size_t i = 0; i < feature_names.size(); ++i) {
+ if (!features.test(i))
+ continue;
+ f->dump_string(fmt::format("feature_{}", i),
+ cephfs_feature_name(i));
+ }
+}