diff options
author | Sage Weil <sage@inktank.com> | 2013-02-21 17:30:46 -0800 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-02-21 17:30:46 -0800 |
commit | 60ebf02a2890d8de7670924a0e89db9cefdeb144 (patch) | |
tree | 487b68efb9c35dfb48eb4e852b799d49103e1125 | |
parent | 6cb53740f2c356768adfbd3cb55c007d187309d3 (diff) | |
parent | dd007db3ca27627d6a3017c436b6745084288ee5 (diff) | |
download | ceph-60ebf02a2890d8de7670924a0e89db9cefdeb144.tar.gz |
Merge branch 'next'
-rw-r--r-- | src/ceph_common.sh | 6 | ||||
-rw-r--r-- | src/mds/CInode.cc | 64 | ||||
-rw-r--r-- | src/mds/CInode.h | 47 | ||||
-rw-r--r-- | src/mds/Locker.cc | 4 | ||||
-rw-r--r-- | src/mds/MDCache.cc | 5 | ||||
-rw-r--r-- | src/mds/MDS.h | 2 | ||||
-rw-r--r-- | src/mds/Server.cc | 59 | ||||
-rw-r--r-- | src/mds/events/EMetaBlob.h | 33 | ||||
-rw-r--r-- | src/mds/journal.cc | 23 | ||||
-rw-r--r-- | src/mds/mdstypes.cc | 35 | ||||
-rw-r--r-- | src/mds/mdstypes.h | 34 | ||||
-rw-r--r-- | src/test/encoding/types.h | 1 |
12 files changed, 96 insertions, 217 deletions
diff --git a/src/ceph_common.sh b/src/ceph_common.sh index 47a21af85bd..af2576b3cd4 100644 --- a/src/ceph_common.sh +++ b/src/ceph_common.sh @@ -144,7 +144,7 @@ get_local_name_list() { } get_name_list() { - orig=$1 + orig="$*" # extract list of monitors, mdss, osds defined in startup.conf allconf=`$CCONF -c $conf -l mon | egrep -v '^mon$' ; \ @@ -162,14 +162,14 @@ get_name_list() { id=`echo $f | cut -c 4- | sed 's/\\.//'` case $f in mon | osd | mds) - what=`echo $allconf $local | grep ^$type || true` + what="$what "`echo "$allconf" "$local" | grep ^$type || true` ;; *) if ! echo " " $allconf $local " " | egrep -q "( $type$id | $type.$id )"; then echo "$0: $type.$id not found ($conf defines" $allconf", /var/lib/ceph defines" $local")" exit 1 fi - what="$f" + what="$what $f" ;; esac done diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index b2b1faf3475..9638de6b077 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -313,14 +313,11 @@ inode_t *CInode::project_inode(map<string,bufferptr> *px) projected_nodes.push_back(new projected_inode_t(new inode_t(inode))); if (px) *px = xattrs; - projected_nodes.back()->dir_layout = default_layout; } else { - file_layout_policy_t *last_dl = projected_nodes.back()->dir_layout; projected_nodes.push_back(new projected_inode_t( new inode_t(*projected_nodes.back()->inode))); if (px) *px = *get_projected_xattrs(); - projected_nodes.back()->dir_layout = last_dl; } projected_nodes.back()->xattrs = px; dout(15) << "project_inode " << projected_nodes.back()->inode << dendl; @@ -341,11 +338,6 @@ void CInode::pop_and_dirty_projected_inode(LogSegment *ls) delete px; } - if (projected_nodes.front()->dir_layout != default_layout) { - delete default_layout; - default_layout = projected_nodes.front()->dir_layout; - } - if (projected_nodes.front()->snapnode) pop_projected_snaprealm(projected_nodes.front()->snapnode); @@ -1061,7 +1053,7 @@ void CInode::_stored_parent(version_t v, Context *fin) void CInode::encode_store(bufferlist& bl) { - ENCODE_START(3, 3, bl); + ENCODE_START(4, 4, bl); ::encode(inode, bl); if (is_symlink()) ::encode(symlink, bl); @@ -1071,16 +1063,11 @@ void CInode::encode_store(bufferlist& bl) encode_snap_blob(snapbl); ::encode(snapbl, bl); ::encode(old_inodes, bl); - if (inode.is_dir()) { - ::encode((default_layout ? true : false), bl); - if (default_layout) - ::encode(*default_layout, bl); - } ENCODE_FINISH(bl); } void CInode::decode_store(bufferlist::iterator& bl) { - DECODE_START_LEGACY_COMPAT_LEN(3, 3, 3, bl); + DECODE_START_LEGACY_COMPAT_LEN(4, 4, 4, bl); ::decode(inode, bl); if (is_symlink()) ::decode(symlink, bl); @@ -1090,13 +1077,12 @@ void CInode::decode_store(bufferlist::iterator& bl) { ::decode(snapbl, bl); decode_snap_blob(snapbl); ::decode(old_inodes, bl); - if (struct_v >= 2 && inode.is_dir()) { + if (struct_v == 2 && inode.is_dir()) { bool default_layout_exists; ::decode(default_layout_exists, bl); if (default_layout_exists) { - delete default_layout; - default_layout = new file_layout_policy_t; - ::decode(*default_layout, bl); + ::decode(struct_v, bl); // this was a default_file_layout + ::decode(inode.layout, bl); // but we only care about the layout portion } } DECODE_FINISH(bl); @@ -1153,12 +1139,14 @@ void CInode::encode_lock_state(int type, bufferlist& bl) case CEPH_LOCK_IFILE: if (is_auth()) { - ::encode(inode.layout, bl); - ::encode(inode.size, bl); ::encode(inode.mtime, bl); ::encode(inode.atime, bl); ::encode(inode.time_warp_seq, bl); - ::encode(inode.client_ranges, bl); + if (!is_dir()) { + ::encode(inode.layout, bl); + ::encode(inode.size, bl); + ::encode(inode.client_ranges, bl); + } } else { bool dirty = filelock.is_dirty(); ::encode(dirty, bl); @@ -1240,9 +1228,7 @@ void CInode::encode_lock_state(int type, bufferlist& bl) case CEPH_LOCK_IPOLICY: if (inode.is_dir()) { - ::encode((default_layout ? true : false), bl); - if (default_layout) - encode(*default_layout, bl); + ::encode(inode.layout, bl); } break; @@ -1336,12 +1322,14 @@ void CInode::decode_lock_state(int type, bufferlist& bl) case CEPH_LOCK_IFILE: if (!is_auth()) { - ::decode(inode.layout, p); - ::decode(inode.size, p); ::decode(inode.mtime, p); ::decode(inode.atime, p); ::decode(inode.time_warp_seq, p); - ::decode(inode.client_ranges, p); + if (!is_dir()) { + ::decode(inode.layout, p); + ::decode(inode.size, p); + ::decode(inode.client_ranges, p); + } } else { bool replica_dirty; ::decode(replica_dirty, p); @@ -1483,13 +1471,7 @@ void CInode::decode_lock_state(int type, bufferlist& bl) case CEPH_LOCK_IPOLICY: if (inode.is_dir()) { - bool default_layout_exists; - ::decode(default_layout_exists, p); - if (default_layout_exists) { - delete default_layout; - default_layout = new file_layout_policy_t; - decode(*default_layout, p); - } + ::decode(inode.layout, p); } break; @@ -2719,16 +2701,10 @@ int CInode::encode_inodestat(bufferlist& bl, Session *session, // file i = pfile ? pi:oi; - if (is_file()) { - e.layout = i->layout; - } else if (is_dir()) { - ceph_file_layout *l = ppolicy ? get_projected_dir_layout() : ( default_layout ? &default_layout->layout : NULL ); - if (l) - e.layout = *l; - else - memset(&e.layout, 0, sizeof(e.layout)); + if (is_dir()) { + e.layout = (ppolicy ? pi : oi)->layout; } else { - memset(&e.layout, 0, sizeof(e.layout)); + e.layout = i->layout; } e.size = i->size; e.truncate_seq = i->truncate_seq; diff --git a/src/mds/CInode.h b/src/mds/CInode.h index 32d27bcbe13..843edf8efd6 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -211,8 +211,6 @@ public: //bool hack_accessed; //utime_t hack_load_stamp; - file_layout_policy_t *default_layout; - /** * Projection methods, used to store inode changes until they have been journaled, * at which point they are popped. @@ -230,14 +228,13 @@ public: inode_t *inode; map<string,bufferptr> *xattrs; sr_t *snapnode; - file_layout_policy_t *dir_layout; - - projected_inode_t() : inode(NULL), xattrs(NULL), snapnode(NULL), dir_layout(NULL) {} - projected_inode_t(inode_t *in, sr_t *sn) : inode(in), xattrs(NULL), snapnode(sn), - dir_layout(NULL) {} - projected_inode_t(inode_t *in, map<string, bufferptr> *xp = NULL, sr_t *sn = NULL, - file_layout_policy_t *dl = NULL) : - inode(in), xattrs(xp), snapnode(sn), dir_layout(dl) {} + + projected_inode_t() + : inode(NULL), xattrs(NULL), snapnode(NULL) {} + projected_inode_t(inode_t *in, sr_t *sn) + : inode(in), xattrs(NULL), snapnode(sn) {} + projected_inode_t(inode_t *in, map<string, bufferptr> *xp = NULL, sr_t *sn = NULL) + : inode(in), xattrs(xp), snapnode(sn) {} }; list<projected_inode_t*> projected_nodes; // projected values (only defined while dirty) @@ -251,21 +248,6 @@ public: return projected_nodes.back(); } - ceph_file_layout *get_projected_dir_layout() { - if (!inode.is_dir()) - return NULL; - if (projected_nodes.empty()) { - if (default_layout) - return &default_layout->layout; - else - return NULL; - } - else if (projected_nodes.back()->dir_layout) - return &projected_nodes.back()->dir_layout->layout; - else - return NULL; - } - version_t get_projected_version() { if (projected_nodes.empty()) return inode.version; @@ -439,7 +421,6 @@ private: snaprealm(0), containing_realm(0), first(f), last(l), last_journaled(0), //last_open_journaled(0), - default_layout(NULL), //hack_accessed(true), stickydir_ref(0), parent(0), @@ -569,11 +550,6 @@ private: _encode_base(bl); _encode_locks_state_for_replica(bl); - if (inode.is_dir()) { - ::encode((default_layout ? true : false), bl); - if (default_layout) - ::encode(*default_layout, bl); - } } void decode_replica(bufferlist::iterator& p, bool is_new) { __u32 nonce; @@ -582,15 +558,6 @@ private: _decode_base(p); _decode_locks_state(p, is_new); - if (inode.is_dir()) { - bool default_layout_exists; - ::decode(default_layout_exists, p); - if (default_layout_exists) { - delete default_layout; - default_layout = new file_layout_policy_t; - ::decode(*default_layout, p); - } - } } diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index da6661889ef..55e4a371ad2 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -154,8 +154,8 @@ void Locker::include_snap_rdlocks_wlayout(set<SimpleLock*>& rdlocks, CInode *in, rdlocks.insert(&t->snaplock); if (!found_layout) { rdlocks.insert(&t->policylock); - if (t->get_projected_dir_layout()) { - *layout = t->get_projected_dir_layout(); + if (t->get_projected_inode()->has_layout()) { + *layout = &t->get_projected_inode()->layout; found_layout = true; } } diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 8762400ab55..32c87f9c688 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -311,9 +311,8 @@ CInode *MDCache::create_system_inode(inodeno_t ino, int mode) CInode *MDCache::create_root_inode() { CInode *i = create_system_inode(MDS_INO_ROOT, S_IFDIR|0755); - i->default_layout = new struct file_layout_policy_t; - i->default_layout->layout = default_file_layout; - i->default_layout->layout.fl_pg_pool = mds->mdsmap->get_first_data_pool(); + i->inode.layout = default_file_layout; + i->inode.layout.fl_pg_pool = mds->mdsmap->get_first_data_pool(); return i; } diff --git a/src/mds/MDS.h b/src/mds/MDS.h index 50555e831d9..42e8516cbe5 100644 --- a/src/mds/MDS.h +++ b/src/mds/MDS.h @@ -35,7 +35,7 @@ #include "SessionMap.h" -#define CEPH_MDS_PROTOCOL 14 /* cluster internal */ +#define CEPH_MDS_PROTOCOL 15 /* cluster internal */ enum { diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 38c7642bd7c..1dd3302c94d 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -3451,50 +3451,47 @@ void Server::handle_client_setdirlayout(MDRequest *mdr) return; // validate layout - file_layout_policy_t *layout = new file_layout_policy_t; - if (cur->get_projected_dir_layout()) - layout->layout = *cur->get_projected_dir_layout(); + inode_t *pi = cur->get_projected_inode(); + ceph_file_layout layout; + if (pi->has_layout()) + layout = pi->layout; else if (dir_layout) - layout->layout = *dir_layout; + layout = *dir_layout; else - layout->layout = mds->mdcache->default_file_layout; + layout = mds->mdcache->default_file_layout; if (req->head.args.setlayout.layout.fl_object_size > 0) - layout->layout.fl_object_size = req->head.args.setlayout.layout.fl_object_size; + layout.fl_object_size = req->head.args.setlayout.layout.fl_object_size; if (req->head.args.setlayout.layout.fl_stripe_unit > 0) - layout->layout.fl_stripe_unit = req->head.args.setlayout.layout.fl_stripe_unit; + layout.fl_stripe_unit = req->head.args.setlayout.layout.fl_stripe_unit; if (req->head.args.setlayout.layout.fl_stripe_count > 0) - layout->layout.fl_stripe_count=req->head.args.setlayout.layout.fl_stripe_count; + layout.fl_stripe_count=req->head.args.setlayout.layout.fl_stripe_count; if (req->head.args.setlayout.layout.fl_cas_hash > 0) - layout->layout.fl_cas_hash = req->head.args.setlayout.layout.fl_cas_hash; + layout.fl_cas_hash = req->head.args.setlayout.layout.fl_cas_hash; if (req->head.args.setlayout.layout.fl_object_stripe_unit > 0) - layout->layout.fl_object_stripe_unit = req->head.args.setlayout.layout.fl_object_stripe_unit; + layout.fl_object_stripe_unit = req->head.args.setlayout.layout.fl_object_stripe_unit; if (req->head.args.setlayout.layout.fl_pg_pool > 0) { - layout->layout.fl_pg_pool = req->head.args.setlayout.layout.fl_pg_pool; - + layout.fl_pg_pool = req->head.args.setlayout.layout.fl_pg_pool; // make sure we have as new a map as the client if (req->get_mdsmap_epoch() > mds->mdsmap->get_epoch()) { - delete layout; mds->wait_for_mdsmap(req->get_mdsmap_epoch(), new C_MDS_RetryRequest(mdcache, mdr)); return; - } + } } - if (!ceph_file_layout_is_valid(&layout->layout)) { + if (!ceph_file_layout_is_valid(&layout)) { dout(10) << "bad layout" << dendl; reply_request(mdr, -EINVAL); - delete layout; return; } - if (!mds->mdsmap->is_data_pool(layout->layout.fl_pg_pool)) { - dout(10) << " invalid data pool " << layout->layout.fl_pg_pool << dendl; + if (!mds->mdsmap->is_data_pool(layout.fl_pg_pool)) { + dout(10) << " invalid data pool " << layout.fl_pg_pool << dendl; reply_request(mdr, -EINVAL); - delete layout; return; } - cur->project_inode(); - cur->get_projected_node()->dir_layout = layout; - cur->get_projected_inode()->version = cur->pre_dirty(); + pi = cur->project_inode(); + pi->layout = layout; + pi->version = cur->pre_dirty(); // log + wait mdr->ls = mdlog->get_current_segment(); @@ -3613,16 +3610,16 @@ void Server::handle_set_vxattr(MDRequest *mdr, CInode *cur, return; } - file_layout_policy_t *dlayout = new file_layout_policy_t; - if (cur->get_projected_dir_layout()) - dlayout->layout = *cur->get_projected_dir_layout(); + ceph_file_layout layout; + if (cur->get_projected_inode()->has_layout()) + layout = cur->get_projected_inode()->layout; else if (dir_layout) - dlayout->layout = *dir_layout; + layout = *dir_layout; else - dlayout->layout = mds->mdcache->default_file_layout; + layout = mds->mdcache->default_file_layout; rest = name.substr(name.find("layout")); - int r = parse_layout_vxattr(rest, value, &dlayout->layout); + int r = parse_layout_vxattr(rest, value, &layout); if (r < 0) { if (r == -ENOENT) { if (!mdr->waited_for_osdmap) { @@ -3644,7 +3641,7 @@ void Server::handle_set_vxattr(MDRequest *mdr, CInode *cur, return; pi = cur->project_inode(); - cur->get_projected_node()->dir_layout = dlayout; + cur->get_projected_inode()->layout = layout; } else { if (!cur->is_file()) { reply_request(mdr, -EINVAL); @@ -3714,7 +3711,7 @@ void Server::handle_remove_vxattr(MDRequest *mdr, CInode *cur, return; } - if (!cur->get_projected_dir_layout()) { + if (!cur->get_projected_inode()->has_layout()) { reply_request(mdr, -ENODATA); return; } @@ -3724,7 +3721,7 @@ void Server::handle_remove_vxattr(MDRequest *mdr, CInode *cur, return; cur->project_inode(); - cur->get_projected_node()->dir_layout = NULL; + cur->get_projected_inode()->clear_layout(); cur->get_projected_inode()->version = cur->pre_dirty(); // log + wait diff --git a/src/mds/events/EMetaBlob.h b/src/mds/events/EMetaBlob.h index d1baefe9402..b098f84a08e 100644 --- a/src/mds/events/EMetaBlob.h +++ b/src/mds/events/EMetaBlob.h @@ -68,7 +68,6 @@ public: string symlink; bufferlist snapbl; bool dirty; - struct file_layout_policy_t *dir_layout; typedef map<snapid_t, old_inode_t> old_inodes_t; old_inodes_t old_inodes; @@ -80,11 +79,11 @@ public: fullbit(const string& d, snapid_t df, snapid_t dl, version_t v, const inode_t& i, const fragtree_t &dft, const map<string,bufferptr> &xa, const string& sym, - const bufferlist &sbl, bool dr, const file_layout_policy_t *defl = NULL, + const bufferlist &sbl, bool dr, const old_inodes_t *oi = NULL) : //dn(d), dnfirst(df), dnlast(dl), dnv(v), //inode(i), dirfragtree(dft), xattrs(xa), symlink(sym), snapbl(sbl), dirty(dr) - dir_layout(NULL), _enc(1024) + _enc(1024) { ::encode(d, _enc); ::encode(df, _enc); @@ -97,27 +96,23 @@ public: if (i.is_dir()) { ::encode(dft, _enc); ::encode(sbl, _enc); - ::encode((defl ? true : false), _enc); - if (defl) - ::encode(*defl, _enc); } ::encode(dr, _enc); ::encode(oi ? true : false, _enc); if (oi) ::encode(*oi, _enc); } - fullbit(bufferlist::iterator &p) : dir_layout(NULL) { + fullbit(bufferlist::iterator &p) { decode(p); } - fullbit() : dir_layout(NULL) {} - ~fullbit() { - delete dir_layout; - } + fullbit() {} + ~fullbit() {} void encode(bufferlist& bl) const; void decode(bufferlist::iterator &bl); void dump(Formatter *f) const; static void generate_test_instances(list<EMetaBlob::fullbit*>& ls); + void update_inode(MDS *mds, CInode *in); void print(ostream& out) const { @@ -429,12 +424,6 @@ private: //cout << "journaling " << in->inode.ino << " at " << my_offset << std::endl; inode_t *pi = in->get_projected_inode(); - file_layout_policy_t *default_layout = NULL; - if (in->is_dir()) - default_layout = (in->get_projected_node() ? - in->get_projected_node()->dir_layout : - in->default_layout); - bufferlist snapbl; sr_t *sr = in->get_projected_srnode(); if (sr) @@ -447,7 +436,7 @@ private: *pi, in->dirfragtree, *in->get_projected_xattrs(), in->symlink, snapbl, - dirty, default_layout, + dirty, &in->old_inodes))); } @@ -478,12 +467,6 @@ private: if (!pdft) pdft = &in->dirfragtree; if (!px) px = &in->xattrs; - file_layout_policy_t *default_layout = NULL; - if (in->is_dir()) - default_layout = (in->get_projected_node() ? - in->get_projected_node()->dir_layout : - in->default_layout); - bufferlist snapbl; if (psnapbl) snapbl = *psnapbl; @@ -500,7 +483,7 @@ private: string empty; roots.push_back(std::tr1::shared_ptr<fullbit>(new fullbit(empty, in->first, in->last, 0, *pi, *pdft, *px, in->symlink, - snapbl, dirty, default_layout, + snapbl, dirty, &in->old_inodes))); } diff --git a/src/mds/journal.cc b/src/mds/journal.cc index 1fb58c6b7ca..09072cef0d8 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -382,10 +382,10 @@ void EMetaBlob::update_segment(LogSegment *ls) // EMetaBlob::fullbit void EMetaBlob::fullbit::encode(bufferlist& bl) const { - ENCODE_START(4, 4, bl); + ENCODE_START(5, 5, bl); if (!_enc.length()) { fullbit copy(dn, dnfirst, dnlast, dnv, inode, dirfragtree, xattrs, symlink, - snapbl, dirty, dir_layout, &old_inodes); + snapbl, dirty, &old_inodes); bl.append(copy._enc); } else { bl.append(_enc); @@ -394,7 +394,7 @@ void EMetaBlob::fullbit::encode(bufferlist& bl) const { } void EMetaBlob::fullbit::decode(bufferlist::iterator &bl) { - DECODE_START_LEGACY_COMPAT_LEN(4, 4, 4, bl); + DECODE_START_LEGACY_COMPAT_LEN(5, 5, 5, bl); ::decode(dn, bl); ::decode(dnfirst, bl); ::decode(dnlast, bl); @@ -406,12 +406,13 @@ void EMetaBlob::fullbit::decode(bufferlist::iterator &bl) { if (inode.is_dir()) { ::decode(dirfragtree, bl); ::decode(snapbl, bl); - if (struct_v >= 2) { + if ((struct_v == 2) || (struct_v == 3)) { bool dir_layout_exists; ::decode(dir_layout_exists, bl); if (dir_layout_exists) { - dir_layout = new file_layout_policy_t; - ::decode(*dir_layout, bl); + __u8 dir_struct_v; + ::decode(dir_struct_v, bl); // default_file_layout version + ::decode(inode.layout, bl); // and actual layout, that we care about } } } @@ -460,9 +461,10 @@ void EMetaBlob::fullbit::dump(Formatter *f) const if (inode.is_dir()) { f->dump_stream("frag tree") << dirfragtree; f->dump_string("has_snapbl", snapbl.length() ? "true" : "false"); - if (dir_layout) { + if (inode.has_layout()) { f->open_object_section("file layout policy"); - dir_layout->dump(f); + // FIXME + f->dump_string("layout", "the layout exists"); f->close_section(); // file layout policy } } @@ -488,7 +490,7 @@ void EMetaBlob::fullbit::generate_test_instances(list<EMetaBlob::fullbit*>& ls) bufferlist empty_snapbl; fullbit *sample = new fullbit("/testdn", 0, 0, 0, inode, fragtree, empty_xattrs, "", empty_snapbl, - false, NULL, NULL); + false, NULL); ls.push_back(sample); } @@ -504,9 +506,6 @@ void EMetaBlob::fullbit::update_inode(MDS *mds, CInode *in) in->force_dirfrags(); } - delete in->default_layout; - in->default_layout = dir_layout; - dir_layout = NULL; /* * we can do this before linking hte inode bc the split_at would * be a no-op.. we have no children (namely open snaprealms) to diff --git a/src/mds/mdstypes.cc b/src/mds/mdstypes.cc index 6b87c221e56..65e16bf80da 100644 --- a/src/mds/mdstypes.cc +++ b/src/mds/mdstypes.cc @@ -4,24 +4,6 @@ #include "mdstypes.h" #include "common/Formatter.h" -/* - * file_layout_policy_t - */ - -void file_layout_policy_t::encode(bufferlist &bl) const -{ - ENCODE_START(2, 2, bl); - ::encode(layout, bl); - ENCODE_FINISH(bl); -} - -void file_layout_policy_t::decode(bufferlist::iterator& bl) -{ - DECODE_START_LEGACY_COMPAT_LEN(2, 2, 2, bl); - ::decode(layout, bl); - DECODE_FINISH(bl); -} - void dump(const ceph_file_layout& l, Formatter *f) { f->dump_unsigned("stripe_unit", l.fl_stripe_unit); @@ -40,23 +22,6 @@ void dump(const ceph_dir_layout& l, Formatter *f) f->dump_unsigned("dir_hash", l.dl_dir_hash); } -void file_layout_policy_t::dump(Formatter *f) const -{ - ::dump(layout, f); -} - -void file_layout_policy_t::generate_test_instances(list<file_layout_policy_t*>& ls) -{ - ls.push_back(new file_layout_policy_t); - ls.push_back(new file_layout_policy_t); - ls.back()->layout.fl_stripe_unit = 1024; - ls.back()->layout.fl_stripe_count = 2; - ls.back()->layout.fl_object_size = 2048; - ls.back()->layout.fl_cas_hash = 3; - ls.back()->layout.fl_object_stripe_unit = 8; - ls.back()->layout.fl_pg_pool = 9; -} - /* * frag_info_t diff --git a/src/mds/mdstypes.h b/src/mds/mdstypes.h index 7b25d3a5c27..a67ff254984 100644 --- a/src/mds/mdstypes.h +++ b/src/mds/mdstypes.h @@ -108,25 +108,6 @@ inline string ccap_string(int cap) } -/** - * Default file layout stuff. This lets us set a default file layout on - * a directory inode that all files in its tree will use on creation. - */ -struct file_layout_policy_t { - ceph_file_layout layout; - - file_layout_policy_t() { - memset(&layout, 0, sizeof(layout)); - } - - void encode(bufferlist &bl) const; - void decode(bufferlist::iterator& bl); - void dump(Formatter *f) const; - static void generate_test_instances(list<file_layout_policy_t*>& ls); -}; -WRITE_CLASS_ENCODER(file_layout_policy_t); - - struct scatter_info_t { version_t version; @@ -371,7 +352,7 @@ struct inode_t { truncate_pending(0), time_warp_seq(0), version(0), file_data_version(0), xattr_version(0), last_renamed_version(0) { - memset(&layout, 0, sizeof(layout)); + clear_layout(); memset(&dir_layout, 0, sizeof(dir_layout)); } @@ -391,6 +372,19 @@ struct inode_t { truncate_pending++; } + bool has_layout() const { + // why on earth is there no converse of memchr() in string.h? + const char *p = (const char *)&layout; + for (size_t i = 0; i < sizeof(layout); i++) + if (p[i] != '\0') + return true; + return false; + } + + void clear_layout() { + memset(&layout, 0, sizeof(layout)); + } + uint64_t get_layout_size_increment() { return (uint64_t)layout.fl_object_size * (uint64_t)layout.fl_stripe_count; } diff --git a/src/test/encoding/types.h b/src/test/encoding/types.h index 9ff7010a1d8..b69bb9fd07c 100644 --- a/src/test/encoding/types.h +++ b/src/test/encoding/types.h @@ -100,7 +100,6 @@ TYPE(snaplink_t) TYPE(sr_t) #include "mds/mdstypes.h" -TYPE(file_layout_policy_t) TYPE(frag_info_t) TYPE(nest_info_t) TYPE(client_writeable_range_t) |