]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: use inode_t::layout for dir layout policy
authorGreg Farnum <greg@inktank.com>
Thu, 21 Feb 2013 17:22:00 +0000 (09:22 -0800)
committerGreg Farnum <greg@inktank.com>
Thu, 21 Feb 2013 21:44:01 +0000 (13:44 -0800)
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>
src/mds/CInode.cc
src/mds/CInode.h
src/mds/Locker.cc
src/mds/MDCache.cc
src/mds/MDS.h
src/mds/Server.cc
src/mds/events/EMetaBlob.h
src/mds/journal.cc
src/mds/mdstypes.cc
src/mds/mdstypes.h
src/test/encoding/types.h

index b2b1faf34756665f581503eaba47ac002b6f1f21..9638de6b0779a9b2b23e0da9550ed1e75210dcd8 100644 (file)
@@ -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;
index 32d27bcbe13e00931622859cb217e6cb28fd4f72..843edf8efd6f3e43d70e02bf72a1bd747276a95c 100644 (file)
@@ -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);
-      }
-    }
   }
 
 
index da6661889ef0dd680b9b8406a25064e3baf55782..55e4a371ad2953dfc05ea5ee30bdab5d1fdf3ccc 100644 (file)
@@ -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;
       }
     }
index 8762400ab55834742a8238ea16c952e324f42025..32c87f9c6883f7fa323d22f0f0b5de8dca80dc97 100644 (file)
@@ -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;
 }
 
index 50555e831d9e3d71e37d3e5060ab822b1b1a8902..42e8516cbe5a6bcc03dc73fd70d8a3c31c7bdc3c 100644 (file)
@@ -35,7 +35,7 @@
 #include "SessionMap.h"
 
 
-#define CEPH_MDS_PROTOCOL    14 /* cluster internal */
+#define CEPH_MDS_PROTOCOL    15 /* cluster internal */
 
 
 enum {
index 20372947f5f3025bad4b0affe977e11b80755df2..4ef66ff236d9f47106db3929cbffb01bfdc1e2d6 100644 (file)
@@ -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
index d1baefe940233a29f6c6c96efd5b3111935355a3..b098f84a08e5dfdd2d946fd6c57151c86da09d19 100644 (file)
@@ -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)));
   }
   
index 1fb58c6b7ca02bcfe4687e9d177a8fd2b83d0b68..09072cef0d8fb8eadd22afa3b07b7c6e1ad2798c 100644 (file)
@@ -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
index 6b87c221e56dbc3ccd75aac1d63c204244a7c98b..65e16bf80da193edc1e4193af3d8e38746766fc0 100644 (file)
@@ -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
index 7b25d3a5c274d53785b8e2c7d4fbed23a6656b22..a67ff254984cd94f4227c24fd71d4905819aa44b 100644 (file)
@@ -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;
   }
index 9ff7010a1d807af785bbd604c83107643c0d30c1..b69bb9fd07c51a27d410c3cb10ca8bb050e4857a 100644 (file)
@@ -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)