From c4f1af5f625e5660d1a1731289c81b89412f4627 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 23 Oct 2009 21:33:00 -0700 Subject: [PATCH] osd: break out OSDCaps into a separate file --- src/Makefile.am | 1 + src/osd/OSD.cc | 174 ------------------------------------------- src/osd/OSD.h | 37 +--------- src/osd/OSDCaps.cc | 179 +++++++++++++++++++++++++++++++++++++++++++++ src/osd/OSDCaps.h | 62 ++++++++++++++++ 5 files changed, 243 insertions(+), 210 deletions(-) create mode 100644 src/osd/OSDCaps.cc create mode 100644 src/osd/OSDCaps.h diff --git a/src/Makefile.am b/src/Makefile.am index 0d0a09c6faf4d..16145085201d8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -384,6 +384,7 @@ libosd_a_SOURCES = \ osd/ReplicatedPG.cc \ osd/Ager.cc \ osd/OSD.cc \ + osd/OSDCaps.cc \ common/ClassHandler.cc # osd/RAID4PG.cc diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index d6d64a3f73861..bdeb0acbe4759 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -4257,177 +4257,3 @@ void OSD::init_op_flags(MOSDOp *op) } } } - -bool OSD::OSDCaps::get_next_token(string s, size_t& pos, string& token) -{ - int start = s.find_first_not_of(" \t", pos); - int end; - - if (s[start] == '=' || s[start] == ',' || s[start] == ';') { - end = start + 1; - } else { - end = s.find_first_of(";,= \t", start+1); - } - - if (start < 0) { - return false; - } - - if (end < 0) { - end=s.size(); - } - - token = s.substr(start, end - start); - - pos = end; - - return true; -} - -bool OSD::OSDCaps::is_rwx(string& token, rwx_t& cap_val) -{ - const char *t = token.c_str(); - int val = 0; - - while (*t) { - switch (*t) { - case 'r': - val |= OSD_POOL_CAP_R; - break; - case 'w': - val |= OSD_POOL_CAP_W; - break; - case 'x': - val |= OSD_POOL_CAP_X; - break; - default: - return false; - } - t++; - } - - cap_val = val; - return true; -} - -bool OSD::OSDCaps::parse(bufferlist::iterator& iter) -{ - string s; - - try { - ::decode(s, iter); - - generic_dout(0) << "decoded caps: " << s << dendl; - - size_t pos = 0; - string token; - bool init = true; - - bool op_allow = false; - bool op_deny = false; - bool cmd_pool = false; - bool any_cmd = false; - bool got_eq = false; - list num_list; - bool last_is_comma = false; - rwx_t cap_val = 0; - - while (pos < s.size()) { - if (init) { - op_allow = false; - op_deny = false; - cmd_pool = false; - any_cmd = false; - got_eq = false; - last_is_comma = false; - cap_val = 0; - init = false; - num_list.clear(); - } - -#define ASSERT_STATE(x) \ -do { \ - if (!(x)) { \ - *_dout << "error parsing caps at pos=" << pos << " (" #x ")" << std::endl; \ - } \ -} while (0) - - if (get_next_token(s, pos, token)) { - if (token.compare("=") == 0) { - ASSERT_STATE(any_cmd); - got_eq = true; - } else if (token.compare("allow") == 0) { - ASSERT_STATE((!op_allow) && (!op_deny)); - op_allow = true; - } else if (token.compare("deny") == 0) { - ASSERT_STATE((!op_allow) && (!op_deny)); - op_deny = true; - } else if ((token.compare("pools") == 0) || - (token.compare("pool") == 0)) { - ASSERT_STATE(op_allow || op_deny); - cmd_pool = true; - any_cmd = true; - } else if (is_rwx(token, cap_val)) { - ASSERT_STATE(op_allow || op_deny); - } else if (token.compare(";") != 0) { - ASSERT_STATE(got_eq); - if (token.compare(",") == 0) { - ASSERT_STATE(!last_is_comma); - } else { - last_is_comma = false; - int num = strtol(token.c_str(), NULL, 10); - num_list.push_back(num); - } - } - - if (token.compare(";") == 0 || pos >= s.size()) { - if (got_eq) { - ASSERT_STATE(num_list.size() > 0); - list::iterator iter; - for (iter = num_list.begin(); iter != num_list.end(); ++iter) { - OSDPoolCap& cap = pools_map[*iter]; - if (op_allow) { - cap.allow |= cap_val; - } else { - cap.deny |= cap_val; - } - } - } else { - if (op_allow) { - default_action |= cap_val; - } else { - default_action &= ~cap_val; - } - } - init = true; - } - - } - } - } catch (buffer::error *err) { - return false; - } - - generic_dout(0) << "default=" << (int)default_action << dendl; - map::iterator it; - for (it = pools_map.begin(); it != pools_map.end(); ++it) { - generic_dout(0) << it->first << " -> (" << (int)it->second.allow << "." << (int)it->second.deny << ")" << dendl; - } - - return true; -} - -int OSD::OSDCaps::get_pool_cap(int pool_id) -{ - int cap = default_action; - - map::iterator iter = pools_map.find(pool_id); - if (iter != pools_map.end()) { - OSDPoolCap& c = iter->second; - cap |= c.allow; - cap &= ~c.deny; - } - - return cap; -} - diff --git a/src/osd/OSD.h b/src/osd/OSD.h index c675ec6dadc02..5f3a8eee86104 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -25,6 +25,7 @@ #include "os/ObjectStore.h" #include "PG.h" +#include "OSDCaps.h" #include "common/DecayCounter.h" #include "common/ClassHandler.h" @@ -42,9 +43,6 @@ using namespace __gnu_cxx; -#define OSD_POOL_CAP_R 0x01 -#define OSD_POOL_CAP_W 0x02 -#define OSD_POOL_CAP_X 0x04 enum { l_osd_first = 10000, @@ -182,24 +180,6 @@ private: // -- sessions -- public: - typedef __u8 rwx_t; - struct OSDPoolCap { - rwx_t allow; - rwx_t deny; - OSDPoolCap() : allow(0), deny(0) {} - }; - - struct OSDCaps { - map pools_map; - rwx_t default_action; - bool get_next_token(string s, size_t& pos, string& token); - bool is_rwx(string& token, rwx_t& cap_val); - - OSDCaps() : default_action(0) {} - bool parse(bufferlist::iterator& iter); - int get_pool_cap(int pool_id); - }; - struct Session : public RefCountedObject { AuthTicket ticket; OSDCaps caps; @@ -884,20 +864,5 @@ protected: void init_op_flags(MOSDOp *op); }; -static inline ostream& operator<<(ostream& out, OSD::rwx_t p) { - if (p & OSD_POOL_CAP_R) - out << "r"; - if (p & OSD_POOL_CAP_W) - out << "w"; - if (p & OSD_POOL_CAP_X) - out << "x"; - return out; -} -static inline ostream& operator<<(ostream& out, const OSD::OSDPoolCap& pc) { - return out << "(allow " << pc.allow << ", deny " << pc.deny << ")"; -} -static inline ostream& operator<<(ostream& out, const OSD::OSDCaps& c) { - return out << "osdcaps(pools=" << c.pools_map << " default=" << c.default_action << ")"; -} #endif diff --git a/src/osd/OSDCaps.cc b/src/osd/OSDCaps.cc new file mode 100644 index 0000000000000..8dc5ae10d843d --- /dev/null +++ b/src/osd/OSDCaps.cc @@ -0,0 +1,179 @@ + +#include "OSDCaps.h" + +#include "config.h" + + +bool OSDCaps::get_next_token(string s, size_t& pos, string& token) +{ + int start = s.find_first_not_of(" \t", pos); + int end; + + if (s[start] == '=' || s[start] == ',' || s[start] == ';') { + end = start + 1; + } else { + end = s.find_first_of(";,= \t", start+1); + } + + if (start < 0) { + return false; + } + + if (end < 0) { + end=s.size(); + } + + token = s.substr(start, end - start); + + pos = end; + + return true; +} + +bool OSDCaps::is_rwx(string& token, rwx_t& cap_val) +{ + const char *t = token.c_str(); + int val = 0; + + while (*t) { + switch (*t) { + case 'r': + val |= OSD_POOL_CAP_R; + break; + case 'w': + val |= OSD_POOL_CAP_W; + break; + case 'x': + val |= OSD_POOL_CAP_X; + break; + default: + return false; + } + t++; + } + + cap_val = val; + return true; +} + +bool OSDCaps::parse(bufferlist::iterator& iter) +{ + string s; + + try { + ::decode(s, iter); + + generic_dout(0) << "decoded caps: " << s << dendl; + + size_t pos = 0; + string token; + bool init = true; + + bool op_allow = false; + bool op_deny = false; + bool cmd_pool = false; + bool any_cmd = false; + bool got_eq = false; + list num_list; + bool last_is_comma = false; + rwx_t cap_val = 0; + + while (pos < s.size()) { + if (init) { + op_allow = false; + op_deny = false; + cmd_pool = false; + any_cmd = false; + got_eq = false; + last_is_comma = false; + cap_val = 0; + init = false; + num_list.clear(); + } + +#define ASSERT_STATE(x) \ +do { \ + if (!(x)) { \ + *_dout << "error parsing caps at pos=" << pos << " (" #x ")" << std::endl; \ + } \ +} while (0) + + if (get_next_token(s, pos, token)) { + if (token.compare("=") == 0) { + ASSERT_STATE(any_cmd); + got_eq = true; + } else if (token.compare("allow") == 0) { + ASSERT_STATE((!op_allow) && (!op_deny)); + op_allow = true; + } else if (token.compare("deny") == 0) { + ASSERT_STATE((!op_allow) && (!op_deny)); + op_deny = true; + } else if ((token.compare("pools") == 0) || + (token.compare("pool") == 0)) { + ASSERT_STATE(op_allow || op_deny); + cmd_pool = true; + any_cmd = true; + } else if (is_rwx(token, cap_val)) { + ASSERT_STATE(op_allow || op_deny); + } else if (token.compare(";") != 0) { + ASSERT_STATE(got_eq); + if (token.compare(",") == 0) { + ASSERT_STATE(!last_is_comma); + } else { + last_is_comma = false; + int num = strtol(token.c_str(), NULL, 10); + num_list.push_back(num); + } + } + + if (token.compare(";") == 0 || pos >= s.size()) { + if (got_eq) { + ASSERT_STATE(num_list.size() > 0); + list::iterator iter; + for (iter = num_list.begin(); iter != num_list.end(); ++iter) { + OSDPoolCap& cap = pools_map[*iter]; + if (op_allow) { + cap.allow |= cap_val; + } else { + cap.deny |= cap_val; + } + } + } else { + if (op_allow) { + default_action |= cap_val; + } else { + default_action &= ~cap_val; + } + } + init = true; + } + + } + } + } catch (buffer::error *err) { + return false; + } + + generic_dout(0) << "default=" << (int)default_action << dendl; + map::iterator it; + for (it = pools_map.begin(); it != pools_map.end(); ++it) { + generic_dout(0) << it->first << " -> (" << (int)it->second.allow << "." << (int)it->second.deny << ")" << dendl; + } + + return true; +} + +int OSDCaps::get_pool_cap(int pool_id) +{ + int cap = default_action; + + map::iterator iter = pools_map.find(pool_id); + if (iter != pools_map.end()) { + OSDPoolCap& c = iter->second; + cap |= c.allow; + cap &= ~c.deny; + } + + return cap; +} + diff --git a/src/osd/OSDCaps.h b/src/osd/OSDCaps.h new file mode 100644 index 0000000000000..bde0d12406f2a --- /dev/null +++ b/src/osd/OSDCaps.h @@ -0,0 +1,62 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2004-2006 Sage Weil + * + * This is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software + * Foundation. See file COPYING. + * + */ + +#ifndef __CEPH_OSDCAPS_H +#define __CEPH_OSDCAPS_H + +#include "include/types.h" + +#define OSD_POOL_CAP_R 0x01 +#define OSD_POOL_CAP_W 0x02 +#define OSD_POOL_CAP_X 0x04 + +typedef __u8 rwx_t; + +static inline ostream& operator<<(ostream& out, rwx_t p) { + if (p & OSD_POOL_CAP_R) + out << "r"; + if (p & OSD_POOL_CAP_W) + out << "w"; + if (p & OSD_POOL_CAP_X) + out << "x"; + return out; +} + + +struct OSDPoolCap { + rwx_t allow; + rwx_t deny; + OSDPoolCap() : allow(0), deny(0) {} +}; + +static inline ostream& operator<<(ostream& out, const OSDPoolCap& pc) { + return out << "(allow " << pc.allow << ", deny " << pc.deny << ")"; +} + +struct OSDCaps { + map pools_map; + rwx_t default_action; + bool get_next_token(string s, size_t& pos, string& token); + bool is_rwx(string& token, rwx_t& cap_val); + + OSDCaps() : default_action(0) {} + bool parse(bufferlist::iterator& iter); + int get_pool_cap(int pool_id); +}; + +static inline ostream& operator<<(ostream& out, const OSDCaps& c) { + return out << "osdcaps(pools=" << c.pools_map << " default=" << c.default_action << ")"; +} + +#endif -- 2.39.5