// -*- 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_TYPES_H #define CEPH_TYPES_H // this is needed for ceph_fs to compile in userland #include "inttypes.h" #include "byteorder.h" #include "uuid.h" #include #include #include // // temporarily remap __le* to ceph_le* for benefit of shared kernel/userland headers #define __le16 ceph_le16 #define __le32 ceph_le32 #define __le64 ceph_le64 #include "ceph_fs.h" #include "ceph_frag.h" #include "rbd_types.h" #undef __le16 #undef __le32 #undef __le64 // #ifdef __cplusplus #ifndef _BACKWARD_BACKWARD_WARNING_H #define _BACKWARD_BACKWARD_WARNING_H // make gcc 4.3 shut up about hash_* #endif #endif extern "C" { #include #include #include #include "statlite.h" } #include #include #include #include #include #include #include using namespace std; #include using namespace __gnu_cxx; #include "object.h" #include "intarith.h" #include "acconfig.h" #include "assert.h" // DARWIN compatibility #ifdef DARWIN typedef long long loff_t; typedef long long off64_t; #define O_DIRECT 00040000 #endif // FreeBSD compatibility #ifdef __FreeBSD__ typedef off_t loff_t; typedef off_t off64_t; #endif // -- stl crap -- namespace __gnu_cxx { template<> struct hash< std::string > { size_t operator()( const std::string& x ) const { static hash H; return H(x.c_str()); } }; #ifndef __LP64__ template<> struct hash { size_t operator()(int64_t __x) const { static hash H; return H((__x >> 32) ^ (__x & 0xffffffff)); } }; template<> struct hash { size_t operator()(uint64_t __x) const { static hash H; return H((__x >> 32) ^ (__x & 0xffffffff)); } }; #endif } // -- io helpers -- template inline ostream& operator<<(ostream& out, const pair v) { return out << v.first << "," << v.second; } template inline ostream& operator<<(ostream& out, const vector& v) { out << "["; for (typename vector::const_iterator p = v.begin(); p != v.end(); p++) { if (p != v.begin()) out << ","; out << *p; } out << "]"; return out; } template inline ostream& operator<<(ostream& out, const deque& v) { out << "<"; for (typename deque::const_iterator p = v.begin(); p != v.end(); p++) { if (p != v.begin()) out << ","; out << *p; } out << ">"; return out; } template inline ostream& operator<<(ostream& out, const list& ilist) { for (typename list::const_iterator it = ilist.begin(); it != ilist.end(); it++) { if (it != ilist.begin()) out << ","; out << *it; } return out; } template inline ostream& operator<<(ostream& out, const set& iset) { for (typename set::const_iterator it = iset.begin(); it != iset.end(); it++) { if (it != iset.begin()) out << ","; out << *it; } return out; } template inline ostream& operator<<(ostream& out, const multiset& iset) { for (typename multiset::const_iterator it = iset.begin(); it != iset.end(); it++) { if (it != iset.begin()) out << ","; out << *it; } return out; } template inline ostream& operator<<(ostream& out, const map& m) { out << "{"; for (typename map::const_iterator it = m.begin(); it != m.end(); it++) { if (it != m.begin()) out << ","; out << it->first << "=" << it->second; } out << "}"; return out; } template inline ostream& operator<<(ostream& out, const multimap& m) { out << "{{"; for (typename multimap::const_iterator it = m.begin(); it != m.end(); it++) { if (it != m.begin()) out << ","; out << it->first << "=" << it->second; } out << "}}"; return out; } /* * comparators for stl containers */ // for hash_map: // hash_map, eqstr> vals; struct eqstr { bool operator()(const char* s1, const char* s2) const { return strcmp(s1, s2) == 0; } }; // for set, map struct ltstr { bool operator()(const char* s1, const char* s2) const { return strcmp(s1, s2) < 0; } }; #include "encoding.h" WRITE_RAW_ENCODER(ceph_fsid) WRITE_RAW_ENCODER(ceph_file_layout) WRITE_RAW_ENCODER(ceph_dir_layout) WRITE_RAW_ENCODER(ceph_mds_session_head) WRITE_RAW_ENCODER(ceph_mds_request_head) WRITE_RAW_ENCODER(ceph_mds_request_release) WRITE_RAW_ENCODER(ceph_filelock) WRITE_RAW_ENCODER(ceph_mds_caps) WRITE_RAW_ENCODER(ceph_mds_cap_release) WRITE_RAW_ENCODER(ceph_mds_cap_item) WRITE_RAW_ENCODER(ceph_mds_lease) WRITE_RAW_ENCODER(ceph_mds_snap_head) WRITE_RAW_ENCODER(ceph_mds_snap_realm) WRITE_RAW_ENCODER(ceph_mds_reply_head) WRITE_RAW_ENCODER(ceph_mds_reply_inode) WRITE_RAW_ENCODER(ceph_mds_cap_reconnect) WRITE_RAW_ENCODER(ceph_mds_snaprealm_reconnect) WRITE_RAW_ENCODER(ceph_frag_tree_split) WRITE_RAW_ENCODER(ceph_osd_reply_head) WRITE_RAW_ENCODER(ceph_osd_op) WRITE_RAW_ENCODER(ceph_msg_header) WRITE_RAW_ENCODER(ceph_msg_footer) WRITE_RAW_ENCODER(ceph_mon_subscribe_item) WRITE_RAW_ENCODER(ceph_mon_statfs) WRITE_RAW_ENCODER(ceph_mon_statfs_reply) // ---------------------- // some basic types // NOTE: these must match ceph_fs.h typedefs typedef uint64_t tid_t; // transaction id typedef uint64_t version_t; typedef __u32 epoch_t; // map epoch (32bits -> 13 epochs/second for 10 years) #define O_LAZY 01000000 // -------------------------------------- // identify individual mount clients by 64bit value struct client_t { int64_t v; client_t(int64_t _v = -2) : v(_v) {} void encode(bufferlist& bl) const { ::encode(v, bl); } void decode(bufferlist::iterator& bl) { ::decode(v, bl); } }; WRITE_CLASS_ENCODER(client_t) static inline bool operator==(const client_t& l, const client_t& r) { return l.v == r.v; } static inline bool operator!=(const client_t& l, const client_t& r) { return l.v != r.v; } static inline bool operator<(const client_t& l, const client_t& r) { return l.v < r.v; } static inline bool operator<=(const client_t& l, const client_t& r) { return l.v <= r.v; } static inline bool operator>(const client_t& l, const client_t& r) { return l.v > r.v; } static inline bool operator>=(const client_t& l, const client_t& r) { return l.v >= r.v; } static inline bool operator>=(const client_t& l, int64_t o) { return l.v >= o; } static inline bool operator<(const client_t& l, int64_t o) { return l.v < o; } inline ostream& operator<<(ostream& out, const client_t& c) { return out << c.v; } // -------------------------------------- // ino typedef uint64_t _inodeno_t; struct inodeno_t { _inodeno_t val; inodeno_t() : val(0) {} inodeno_t(_inodeno_t v) : val(v) {} inodeno_t operator+=(inodeno_t o) { val += o.val; return *this; } operator _inodeno_t() const { return val; } void encode(bufferlist& bl) const { ::encode(val, bl); } void decode(bufferlist::iterator& p) { ::decode(val, p); } } __attribute__ ((__may_alias__)); WRITE_CLASS_ENCODER(inodeno_t) inline ostream& operator<<(ostream& out, inodeno_t ino) { return out << hex << ino.val << dec; } namespace __gnu_cxx { template<> struct hash< inodeno_t > { size_t operator()( const inodeno_t& x ) const { static rjhash H; return H(x.val); } }; } // file modes static inline bool file_mode_is_readonly(int mode) { return (mode & CEPH_FILE_MODE_WR) == 0; } // dentries #define MAX_DENTRY_LEN 255 // -- struct prettybyte_t { uint64_t v; prettybyte_t(uint64_t _v) : v(_v) {} }; inline ostream& operator<<(ostream& out, const prettybyte_t& b) { uint64_t bump_after = 100; if (b.v > bump_after << 60) return out << (b.v >> 60) << " EB"; if (b.v > bump_after << 50) return out << (b.v >> 50) << " PB"; if (b.v > bump_after << 40) return out << (b.v >> 40) << " TB"; if (b.v > bump_after << 30) return out << (b.v >> 30) << " GB"; if (b.v > bump_after << 20) return out << (b.v >> 20) << " MB"; if (b.v > bump_after << 10) return out << (b.v >> 10) << " KB"; return out << b.v << " bytes"; } struct kb_t { uint64_t v; kb_t(uint64_t _v) : v(_v) {} }; inline ostream& operator<<(ostream& out, const kb_t& kb) { uint64_t bump_after = 100; if (kb.v > bump_after << 40) return out << (kb.v >> 40) << " PB"; if (kb.v > bump_after << 30) return out << (kb.v >> 30) << " TB"; if (kb.v > bump_after << 20) return out << (kb.v >> 20) << " GB"; if (kb.v > bump_after << 10) return out << (kb.v >> 10) << " MB"; return out << kb.v << " KB"; } inline ostream& operator<<(ostream& out, const ceph_mon_subscribe_item& i) { return out << i.start << ((i.flags & CEPH_SUBSCRIBE_ONETIME) ? "" : "+"); } enum health_status_t { HEALTH_ERR = 0, HEALTH_WARN = 1, HEALTH_OK = 2, }; #ifdef __cplusplus inline ostream& operator<<(ostream &oss, health_status_t status) { switch (status) { case HEALTH_ERR: oss << "HEALTH_ERR"; break; case HEALTH_WARN: oss << "HEALTH_WARN"; break; case HEALTH_OK: oss << "HEALTH_OK"; break; } return oss; }; #endif #endif