summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Farnum <greg@inktank.com>2013-02-21 09:22:00 -0800
committerGreg Farnum <greg@inktank.com>2013-02-21 13:44:01 -0800
commit6bd8781dda524f04bb56bcdac5aa5b13ba61b07d (patch)
treed12a9483903c9d56e673c4c3826541c92a78fcdb
parent84ef1649c5aef7eb8c75ff90d021212752e4a919 (diff)
downloadceph-6bd8781dda524f04bb56bcdac5aa5b13ba61b07d.tar.gz
mds: use inode_t::layout for dir layout policy
This cherry-pick is going in the reverse direction of normal. That's because this direction makes for the minimal change -- this patchset is required to fix the loss of directory layouts we were previously seeing, but fixing it requires changing the encoding versions. So we wrote it on top of Bobtail and let it update the struct_v's as they existed then. Note that we here change a few encoding versions in ways which are NOT COMPATIBLE with previous development code (but not any releases). In particular, development code introduced and this removes the file_layout_policy_t, and some of the CInode and EMetaBlob encoding struct_v values were used in development code to mean one thing, but mean something different due to the Bobtail patch. Remove the default_file_layout struct, which was just a ceph_file_layout, and store it in the inode_t. Rip out all the annoying code that put this on the heap. To aid in this usage, add a clear_layout() function to inode_t. Signed-off-by: Sage Weil <sage.weil@dreamhost.com> Signed-off-by: Greg Farnum <greg@inktank.com> Reviewed-by: Sage Weil <sage@inktank.com> (cherry picked from commit 36ed407e0f939a9bca57c3ffc0ee5608d50ab7ed) Conflicts: src/mds/CInode.cc src/mds/CInode.h src/mds/MDCache.cc src/mds/Server.cc src/mds/events/EMetaBlob.h Cherry-pick- Reviewed-by: Sage Weil <sage@inktank.com>
-rw-r--r--src/mds/CInode.cc64
-rw-r--r--src/mds/CInode.h47
-rw-r--r--src/mds/Locker.cc4
-rw-r--r--src/mds/MDCache.cc5
-rw-r--r--src/mds/MDS.h2
-rw-r--r--src/mds/Server.cc59
-rw-r--r--src/mds/events/EMetaBlob.h33
-rw-r--r--src/mds/journal.cc23
-rw-r--r--src/mds/mdstypes.cc35
-rw-r--r--src/mds/mdstypes.h34
-rw-r--r--src/test/encoding/types.h1
11 files changed, 93 insertions, 214 deletions
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 20372947f5f..4ef66ff236d 100644
--- a/src/mds/Server.cc
+++ b/src/mds/Server.cc
@@ -3455,50 +3455,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();
@@ -3617,16 +3614,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) {
@@ -3648,7 +3645,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);
@@ -3718,7 +3715,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;
}
@@ -3728,7 +3725,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)