out << "[dentry " << path;
- switch (dn.get_d_type()) {
- case DT_UNKNOWN: out << " ?"; break;
- case DT_REG: out << " reg"; break;
- case DT_DIR: out << " dir"; break;
- case DT_LNK: out << " lnk"; break;
- default: assert(0);
- }
-
if (dn.is_auth()) {
out << " auth";
if (dn.is_replicated())
}
if (dn.is_null()) out << " NULL";
- if (dn.is_remote()) out << " REMOTE";
+ if (dn.is_remote()) {
+ out << " REMOTE(";
+ switch (dn.get_remote_d_type()) {
+ case DT_REG: out << "reg"; break;
+ case DT_DIR: out << "dir"; break;
+ case DT_LNK: out << "lnk"; break;
+ default: assert(0);
+ }
+ out << ")";
+ }
out << " " << dn.lock;
protected:
string name;
- unsigned char d_type;
+
inodeno_t remote_ino; // if remote dentry
+ unsigned char remote_d_type;
CInode *inode; // linked inode (if any)
CDir *dir; // containing dirfrag
public:
// cons
CDentry() :
- d_type(0),
- remote_ino(0),
- inode(0),
- dir(0),
- version(0),
- projected_version(0),
+ remote_ino(0), remote_d_type(0),
+ inode(0), dir(0),
+ version(0), projected_version(0),
auth_pins(0), nested_auth_pins(0),
lock(this, LOCK_OTYPE_DN, WAIT_LOCK_OFFSET) { }
- CDentry(const string& n, unsigned char dt, inodeno_t ino, CInode *in=0) :
+ CDentry(const string& n, CInode *in) :
name(n),
- d_type(dt),
- remote_ino(ino),
- inode(in),
- dir(0),
- version(0),
- projected_version(0),
+ remote_ino(0), remote_d_type(0),
+ inode(in), dir(0),
+ version(0), projected_version(0),
auth_pins(0), nested_auth_pins(0),
lock(this, LOCK_OTYPE_DN, WAIT_LOCK_OFFSET) { }
- CDentry(const string& n, unsigned char dt, CInode *in) :
+ CDentry(const string& n, inodeno_t ino, unsigned char dt, CInode *in=0) :
name(n),
- d_type(dt),
- remote_ino(0),
- inode(in),
- dir(0),
- version(0),
- projected_version(0),
+ remote_ino(ino), remote_d_type(dt),
+ inode(in), dir(0),
+ version(0), projected_version(0),
auth_pins(0), nested_auth_pins(0),
lock(this, LOCK_OTYPE_DN, WAIT_LOCK_OFFSET) { }
- unsigned char get_d_type() { return d_type; }
CInode *get_inode() const { return inode; }
CDir *get_dir() const { return dir; }
const string& get_name() const { return name; }
inodeno_t get_ino();
- inodeno_t get_remote_ino() { return remote_ino; }
-
- void set_remote_ino(inodeno_t ino) { remote_ino = ino; }
+ inodeno_t get_remote_ino() { return remote_ino; }
+ unsigned char get_remote_d_type() { return remote_d_type; }
+ void set_remote(inodeno_t ino, unsigned char d_type) {
+ remote_ino = ino;
+ remote_d_type = d_type;
+ }
// ref counts: pin ourselves in the LRU when we're pinned.
void first_get() {
class CDentryDiscover {
string dname;
- unsigned char d_type;
int replica_nonce;
int lockstate;
inodeno_t remote_ino;
+ unsigned char remote_d_type;
public:
CDentryDiscover() {}
CDentryDiscover(CDentry *dn, int nonce) :
- dname(dn->get_name()), d_type(dn->get_d_type()), replica_nonce(nonce),
+ dname(dn->get_name()), replica_nonce(nonce),
lockstate(dn->lock.get_replica_state()),
- remote_ino(dn->get_remote_ino()) { }
+ remote_ino(dn->get_remote_ino()), remote_d_type(dn->get_remote_d_type()) { }
string& get_dname() { return dname; }
- unsigned char get_d_type() { return d_type; }
int get_nonce() { return replica_nonce; }
bool is_remote() { return remote_ino ? true:false; }
inodeno_t get_remote_ino() { return remote_ino; }
+ unsigned char get_remote_d_type() { return remote_d_type; }
void update_dentry(CDentry *dn) {
dn->set_replica_nonce(replica_nonce);
void _encode(bufferlist& bl) {
::_encode(dname, bl);
- ::_encode(d_type, bl);
::_encode(remote_ino, bl);
+ ::_encode(remote_d_type, bl);
::_encode(replica_nonce, bl);
::_encode(lockstate, bl);
}
void _decode(bufferlist& bl, int& off) {
::_decode(dname, bl, off);
- ::_decode(d_type, bl, off);
::_decode(remote_ino, bl, off);
+ ::_decode(remote_d_type, bl, off);
::_decode(replica_nonce, bl, off);
::_decode(lockstate, bl, off);
}
* linking fun
*/
-CDentry* CDir::add_dentry(const string& dname, unsigned char d_type, inodeno_t ino)
+CDentry* CDir::add_null_dentry(const string& dname)
{
// foreign
assert(lookup(dname) == 0);
// create dentry
- CDentry* dn = new CDentry(dname, d_type, ino);
+ CDentry* dn = new CDentry(dname, 0);
if (is_auth())
dn->state_set(CDentry::STATE_AUTH);
cache->lru.lru_insert_mid(dn);
//assert(null_items.count(dn->name) == 0);
items[dn->name] = dn;
- nitems++;
+ nnull++;
- dout(12) << "add_dentry " << *dn << endl;
+ dout(12) << "add_null_dentry " << *dn << endl;
// pin?
if (nnull + nitems == 1) get(PIN_CHILD);
}
-CDentry* CDir::add_dentry(const string& dname, unsigned char d_type, CInode *in)
+CDentry* CDir::add_primary_dentry(const string& dname, CInode *in)
{
// primary
assert(lookup(dname) == 0);
// create dentry
- CDentry* dn = new CDentry(dname, d_type, in);
+ CDentry* dn = new CDentry(dname, in);
if (is_auth())
dn->state_set(CDentry::STATE_AUTH);
cache->lru.lru_insert_mid(dn);
//assert(null_items.count(dn->name) == 0);
items[dn->name] = dn;
+ link_inode_work( dn, in );
- if (in) {
- link_inode_work( dn, in );
- } else {
- assert(dn->inode == 0);
- //null_items[dn->name] = dn;
- nnull++;
- }
+ dout(12) << "add_primary_dentry " << *dn << endl;
+
+ // pin?
+ if (nnull + nitems == 1) get(PIN_CHILD);
+
+ assert(nnull + nitems == items.size());
+ //assert(nnull == null_items.size());
+ return dn;
+}
+
+CDentry* CDir::add_remote_dentry(const string& dname, inodeno_t ino, unsigned char d_type)
+{
+ // foreign
+ assert(lookup(dname) == 0);
+
+ // create dentry
+ CDentry* dn = new CDentry(dname, ino, d_type);
+ if (is_auth())
+ dn->state_set(CDentry::STATE_AUTH);
+ cache->lru.lru_insert_mid(dn);
- dout(12) << "add_dentry " << *dn << endl;
+ dn->dir = this;
+ dn->version = projected_version;
+
+ // add to dir
+ assert(items.count(dn->name) == 0);
+ //assert(null_items.count(dn->name) == 0);
+
+ items[dn->name] = dn;
+ nitems++;
+
+ dout(12) << "add_remote_dentry " << *dn << endl;
// pin?
if (nnull + nitems == 1) get(PIN_CHILD);
//assert(nnull == null_items.size());
}
-void CDir::link_inode(CDentry *dn, unsigned char d_type, inodeno_t ino)
+void CDir::link_remote_inode(CDentry *dn, inodeno_t ino, unsigned char d_type)
{
dout(12) << "link_inode " << *dn << " remote " << ino << endl;
assert(dn->is_null());
- dn->d_type = d_type;
- dn->set_remote_ino(ino);
+ dn->set_remote(ino, d_type);
nitems++;
//assert(null_items.count(dn->name) == 1);
assert(nnull + nitems == items.size());
}
-void CDir::link_inode(CDentry *dn, CInode *in )
+void CDir::link_primary_inode(CDentry *dn, CInode *in)
{
- dout(12) << "link_inode " << *dn << " " << *in << endl;
+ dout(12) << "link_primary_inode " << *dn << " " << *in << endl;
assert(!dn->is_remote());
link_inode_work(dn,in);
void CDir::link_inode_work( CDentry *dn, CInode *in)
{
- dn->d_type = in->inode.get_d_type();
dn->inode = in;
in->set_primary_parent(dn);
if (in)
dn->unlink_remote();
- dn->set_remote_ino(0);
+ dn->set_remote(0, 0);
} else {
// primary
assert(dn->is_primary());
dn->inode = 0;
}
- dn->d_type = DT_UNKNOWN;
nitems--; // adjust dir size
}
// dname
string dname;
- unsigned char d_type;
::_decode(dname, bl, off);
- ::_decode(d_type, bl, off);
- dout(24) << "_fetched parsed marker '" << type << "' dname '" << dname
- << "' d_type " << d_type << endl;
+ dout(24) << "_fetched parsed marker '" << type << "' dname '" << dname << endl;
CDentry *dn = lookup(dname); // existing dentry?
if (type == 'L') {
// hard link
inodeno_t ino;
+ unsigned char d_type;
::_decode(ino, bl, off);
-
+ ::_decode(d_type, bl, off);
+
if (dn) {
if (dn->get_inode() == 0) {
dout(12) << "_fetched had NEG dentry " << *dn << endl;
}
} else {
// (remote) link
- CDentry *dn = add_dentry( dname, d_type, ino );
+ CDentry *dn = add_remote_dentry(dname, ino, d_type);
// link to inode?
CInode *in = cache->get_inode(ino); // we may or may not have it.
cache->add_inode( in );
// link
- add_dentry( dname, d_type, in );
+ add_primary_dentry(dname, in);
dout(12) << "_fetched got " << *in << " mode " << in->inode.mode << " mtime " << in->inode.mtime << endl;
}
}
return iter->second;
}
- CDentry* add_dentry( const string& dname, unsigned char d_type, CInode *in=0 );
- CDentry* add_dentry( const string& dname, unsigned char d_type, inodeno_t ino );
+ CDentry* add_null_dentry(const string& dname);
+ CDentry* add_primary_dentry(const string& dname, CInode *in);
+ CDentry* add_remote_dentry(const string& dname, inodeno_t ino, unsigned char d_type);
void remove_dentry( CDentry *dn ); // delete dentry
- void link_inode( CDentry *dn, unsigned char d_type, inodeno_t ino );
- void link_inode( CDentry *dn, CInode *in );
+ void link_remote_inode( CDentry *dn, inodeno_t ino, unsigned char d_type);
+ void link_primary_inode( CDentry *dn, CInode *in );
void unlink_inode( CDentry *dn );
void try_remove_unlinked_dn(CDentry *dn);
private:
CDentry *straydn = straydir->lookup(straydname);
if (!straydn)
- straydn = straydir->add_dentry(straydname, DT_UNKNOWN, 0);
+ straydn = straydir->add_null_dentry(straydname);
return straydn;
}
++p) {
CDentry *dn = p->second;
if (dn->is_primary()) {
- rejoin->add_weak_primary_dentry(dir->dirfrag(), p->first,
- dn->get_d_type(), dn->get_inode()->ino());
+ rejoin->add_weak_primary_dentry(dir->dirfrag(), p->first, dn->get_inode()->ino());
dn->get_inode()->get_nested_dirfrags(nested);
} else if (dn->is_remote())
rejoin->add_weak_remote_dentry(dir->dirfrag(), p->first,
- dn->get_d_type(), dn->get_remote_ino());
+ dn->get_remote_ino(), dn->get_remote_d_type());
else
assert(0); // i shouldn't have a non-auth null dentry after replay + trim_non_auth()
}
p != dir->items.end();
++p) {
CDentry *dn = p->second;
- rejoin->add_strong_dentry(dir->dirfrag(), p->first, dn->get_d_type(),
+ rejoin->add_strong_dentry(dir->dirfrag(), p->first,
dn->is_primary() ? dn->get_inode()->ino():inodeno_t(0),
dn->is_remote() ? dn->get_remote_ino():inodeno_t(0),
+ dn->is_remote() ? dn->get_remote_d_type():0,
dn->get_replica_nonce(),
dn->lock.get_state());
if (dn->is_primary()) {
int nonce = dn->add_replica(from);
dout(10) << " have " << *dn << endl;
if (ack)
- ack->add_strong_dentry(p->first, q->first, dn->get_d_type(),
+ ack->add_strong_dentry(p->first, q->first,
dn->is_primary() ? dn->get_inode()->ino():inodeno_t(0),
dn->is_remote() ? dn->get_remote_ino():inodeno_t(0),
+ dn->is_remote() ? dn->get_remote_d_type():0,
nonce, dn->lock.get_replica_state());
// inode?
CDentry *dn = dir->lookup(q->first);
if (!dn) {
if (q->second.is_remote()) {
- dn = dir->add_dentry(q->first, q->second.d_type, q->second.remote_ino);
+ dn = dir->add_remote_dentry(q->first, q->second.remote_ino, q->second.remote_d_type);
} else if (q->second.is_null()) {
- dn = dir->add_dentry(q->first, q->second.d_type );
+ dn = dir->add_null_dentry(q->first);
} else {
CInode *in = get_inode(q->second.ino);
if (!in) in = rejoin_invent_inode(q->second.ino);
- dn = dir->add_dentry(q->first, q->second.d_type, in);
+ dn = dir->add_primary_dentry(q->first, in);
dout(10) << " missing " << q->second.ino << endl;
if (!missing) missing = new MMDSCacheRejoin(MMDSCacheRejoin::OP_MISSING);
for (map<int,int>::iterator r = dn->replicas_begin();
r != dn->replicas_end();
++r)
- ack[r->first]->add_strong_dentry(dir->dirfrag(), dn->name, dn->get_d_type(),
+ ack[r->first]->add_strong_dentry(dir->dirfrag(), dn->name,
dn->is_primary() ? dn->get_inode()->ino():inodeno_t(0),
dn->is_remote() ? dn->get_remote_ino():inodeno_t(0),
+ dn->is_remote() ? dn->get_remote_d_type():0,
r->second,
dn->lock.get_replica_state());
// send null dentry
dout(7) << "dentry " << dis->get_dentry(i) << " dne, returning null in "
<< *curdir << endl;
- dn = curdir->add_dentry(dis->get_dentry(i), DT_UNKNOWN, 0);
+ dn = curdir->add_null_dentry(dis->get_dentry(i));
}
assert(dn);
dis.update_dentry(dn);
dout(7) << "add_replica_dentry had " << *dn << endl;
} else {
- dn = dir->add_dentry( dis.get_dname(), dis.get_d_type(), 0 );
+ dn = dir->add_null_dentry(dis.get_dname());
dis.update_dentry(dn);
dis.init_dentry_lock(dn);
dout(7) << "add_replica_dentry added " << *dn << endl;
// remote_ino linkage?
if (dis.get_remote_ino()) {
if (dn->is_null())
- dir->link_inode(dn, dis.get_d_type(), dis.get_remote_ino());
+ dir->link_remote_inode(dn, dis.get_remote_ino(), dis.get_remote_d_type());
// hrm. yeah.
assert(dn->is_remote() && dn->get_remote_ino() == dis.get_remote_ino());
add_inode(in);
dout(10) << "add_replica_inode had " << *in << endl;
if (dn && dn->is_null())
- dn->dir->link_inode(dn, in);
+ dn->dir->link_primary_inode(dn, in);
} else {
dis.update_inode(in);
dout(10) << "add_replica_inode added " << *in << endl;
CInode *in = dn->inode;
dn->dir->unlink_inode(dn);
assert(straydn);
- straydn->dir->link_inode(straydn, in);
+ straydn->dir->link_primary_inode(straydn, in);
} else {
assert(dn->is_remote());
dn->dir->unlink_inode(dn);
// name
::_encode(it->first, enc_dir);
- ::_encode(dn->d_type, enc_dir);
// state
it->second->encode_export_state(enc_dir);
enc_dir.append("L", 1); // remote link
inodeno_t ino = dn->get_remote_ino();
- enc_dir.append((char*)&ino, sizeof(ino));
+ unsigned char d_type = dn->get_remote_d_type();
+ ::_encode(ino, enc_dir);
+ ::_encode(d_type, enc_dir);
continue;
}
CDir *condir = cache->get_dirfrag( m->get_containing_dirfrag(in->ino()) );
assert(condir);
cache->add_inode( in );
- condir->add_dentry( m->get_dentry(in->ino()), in->inode.get_d_type(), in );
+ condir->add_primary_dentry( m->get_dentry(in->ino()), in );
dout(7) << " added " << *in << endl;
}
// link before state -- or not! -sage
if (dn->inode != in) {
assert(!dn->inode);
- dn->dir->link_inode(dn, in);
+ dn->dir->link_primary_inode(dn, in);
}
// add inode?
// dentry
string dname;
- unsigned char d_type;
::_decode(dname, bl, off);
- ::_decode(d_type, bl, off);
CDentry *dn = dir->lookup(dname);
if (!dn)
- dn = dir->add_dentry(dname, d_type); // null
+ dn = dir->add_null_dentry(dname);
// decode state
dn->decode_import_state(bl, off, oldauth, mds->get_nodeid());
else if (icode == 'L') {
// remote link
inodeno_t ino;
- bl.copy(off, sizeof(ino), (char*)&ino);
- off += sizeof(ino);
+ unsigned char d_type;
+ ::_decode(ino, bl, off);
+ ::_decode(d_type, bl, off);
if (dn->is_remote()) {
assert(dn->get_remote_ino() == ino);
} else {
- dir->link_inode(dn, d_type, ino);
+ dir->link_remote_inode(dn, ino, d_type);
}
}
else if (icode == 'I') {
}
// create
- dn = dir->add_dentry(dname, 0);
+ dn = dir->add_null_dentry(dname);
dn->mark_new();
dout(10) << "prepare_null_dentry added " << *dn << endl;
assert(r == 0);
// link the inode
- dn->get_dir()->link_inode(dn, newi);
+ dn->get_dir()->link_primary_inode(dn, newi);
// dirty inode, dn, dir
newi->mark_dirty(newi->inode.version + 1);
dout(10) << "_link_local_finish " << *dn << " to " << *targeti << endl;
// link and unlock the NEW dentry
- dn->dir->link_inode(dn, targeti->inode.get_d_type(), targeti->ino());
+ dn->dir->link_remote_inode(dn, targeti->ino(), targeti->inode.get_d_type());
dn->mark_dirty(dnpv);
// target inode
dout(10) << "_link_remote_finish " << *dn << " to " << *targeti << endl;
// link the new dentry
- dn->dir->link_inode(dn, targeti->inode.get_d_type(), targeti->ino());
+ dn->dir->link_remote_inode(dn, targeti->ino(), targeti->inode.get_d_type());
dn->mark_dirty(dpv);
// dir inode's mtime
dn->dir->unlink_inode(dn);
// relink as stray? (i.e. was primary link?)
- if (straydn) straydn->dir->link_inode(straydn, in);
+ if (straydn) straydn->dir->link_primary_inode(straydn, in);
// nlink--, dirty old dentry
in->pop_and_dirty_projected_inode();
// move inode to dest
srcdn->dir->unlink_inode(srcdn);
destdn->dir->unlink_inode(destdn);
- destdn->dir->link_inode(destdn, oldin);
+ destdn->dir->link_primary_inode(destdn, oldin);
// nlink--
destdn->inode->inode.nlink--;
// relink oldin to stray dir. destdn was primary.
assert(oldin);
- straydn->dir->link_inode(straydn, oldin);
+ straydn->dir->link_primary_inode(straydn, oldin);
//assert(straypv == ipv);
// nlink-- in stray dir.
if (srcdn->is_remote()) {
// srcdn was remote.
srcdn->dir->unlink_inode(srcdn);
- destdn->dir->link_inode(destdn, in->inode.get_d_type(), in->ino());
+ destdn->dir->link_remote_inode(destdn, in->ino(), in->inode.get_d_type());
if (destdn->is_auth())
destdn->mark_dirty(mdr->pvmap[destdn]);
} else {
// srcdn was primary.
srcdn->dir->unlink_inode(srcdn);
- destdn->dir->link_inode(destdn, in);
+ destdn->dir->link_primary_inode(destdn, in);
// srcdn inode import?
if (!srcdn->is_auth() && destdn->is_auth()) {
assert(r == 0);
// link the inode
- dn->get_dir()->link_inode(dn, newi);
+ dn->get_dir()->link_primary_inode(dn, newi);
// dirty inode, dn, dir
newi->mark_dirty(pv);
*/
struct fullbit {
string dn; // dentry
- unsigned char d_type;
version_t dnv;
inode_t inode; // if it's not
string symlink;
bool dirty;
- fullbit(const string& d, unsigned char dt, version_t v, inode_t& i, bool dr) :
- dn(d), d_type(dt), dnv(v), inode(i), dirty(dr) { }
- fullbit(const string& d, unsigned char dt, version_t v, inode_t& i, string& sym, bool dr) :
- dn(d), d_type(dt), dnv(v), inode(i), symlink(sym), dirty(dr) { }
+ fullbit(const string& d, version_t v, inode_t& i, bool dr) :
+ dn(d), dnv(v), inode(i), dirty(dr) { }
+ fullbit(const string& d, version_t v, inode_t& i, string& sym, bool dr) :
+ dn(d), dnv(v), inode(i), symlink(sym), dirty(dr) { }
fullbit(bufferlist& bl, int& off) { _decode(bl, off); }
void _encode(bufferlist& bl) {
::_encode(dn, bl);
- ::_encode(d_type, bl);
::_encode(dnv, bl);
::_encode(inode, bl);
if (inode.is_symlink())
}
void _decode(bufferlist& bl, int& off) {
::_decode(dn, bl, off);
- ::_decode(d_type, bl, off);
::_decode(dnv, bl, off);
::_decode(inode, bl, off);
if (inode.is_symlink())
*/
struct remotebit {
string dn;
- unsigned char d_type;
version_t dnv;
inodeno_t ino;
+ unsigned char d_type;
bool dirty;
- remotebit(const string& d, unsigned char dt, version_t v, inodeno_t i, bool dr) :
- dn(d), d_type(dt), dnv(v), ino(i), dirty(dr) { }
+ remotebit(const string& d, version_t v, inodeno_t i, unsigned char dt, bool dr) :
+ dn(d), dnv(v), ino(i), d_type(dt), dirty(dr) { }
remotebit(bufferlist& bl, int& off) { _decode(bl, off); }
void _encode(bufferlist& bl) {
::_encode(dn, bl);
- ::_encode(d_type, bl);
::_encode(dnv, bl);
::_encode(ino, bl);
+ ::_encode(d_type, bl);
::_encode(dirty, bl);
}
void _decode(bufferlist& bl, int& off) {
::_decode(dn, bl, off);
- ::_decode(d_type, bl, off);
::_decode(dnv, bl, off);
::_decode(ino, bl, off);
+ ::_decode(d_type, bl, off);
::_decode(dirty, bl, off);
}
void print(ostream& out) {
add_remote_dentry(add_dir(dn->get_dir(), false),
dn, dirty, rino);
}
- void add_remote_dentry(dirlump& lump, CDentry *dn, bool dirty, inodeno_t rino=0) {
- if (!rino)
+ void add_remote_dentry(dirlump& lump, CDentry *dn, bool dirty,
+ inodeno_t rino=0, unsigned char rdt=0) {
+ if (!rino) {
rino = dn->get_remote_ino();
+ rdt = dn->get_remote_d_type();
+ }
lump.nremote++;
if (dirty)
lump.get_dremote().push_front(remotebit(dn->get_name(),
- dn->get_d_type(),
dn->get_projected_version(),
- rino,
+ rino, rdt,
dirty));
else
lump.get_dremote().push_back(remotebit(dn->get_name(),
- dn->get_d_type(),
dn->get_projected_version(),
- rino,
+ rino, rdt,
dirty));
}
lump.nfull++;
if (dirty) {
lump.get_dfull().push_front(fullbit(dn->get_name(),
- dn->get_d_type(),
dn->get_projected_version(),
in->inode, in->symlink,
dirty));
return &lump.get_dfull().front().inode;
} else {
lump.get_dfull().push_back(fullbit(dn->get_name(),
- dn->get_d_type(),
dn->get_projected_version(),
in->inode, in->symlink,
dirty));
p++) {
CDentry *dn = dir->lookup(p->dn);
if (!dn) {
- dn = dir->add_dentry( p->dn, p->d_type );
+ dn = dir->add_null_dentry(p->dn);
dn->set_version(p->dnv);
if (p->dirty) dn->_mark_dirty();
dout(10) << "EMetaBlob.replay added " << *dn << endl;
in->inode = p->inode;
if (in->inode.is_symlink()) in->symlink = p->symlink;
mds->mdcache->add_inode(in);
- dir->link_inode(dn, in);
+ dir->link_primary_inode(dn, in);
if (p->dirty) in->_mark_dirty();
dout(10) << "EMetaBlob.replay added " << *in << endl;
} else {
}
in->inode = p->inode;
if (in->inode.is_symlink()) in->symlink = p->symlink;
- dir->link_inode(dn, in);
+ dir->link_primary_inode(dn, in);
if (p->dirty) in->_mark_dirty();
dout(10) << "EMetaBlob.replay linked " << *in << endl;
}
p++) {
CDentry *dn = dir->lookup(p->dn);
if (!dn) {
- dn = dir->add_dentry(p->dn, p->ino);
- dn->set_remote_ino(p->ino);
+ dn = dir->add_remote_dentry(p->dn, p->ino, p->d_type);
dn->set_version(p->dnv);
if (p->dirty) dn->_mark_dirty();
dout(10) << "EMetaBlob.replay added " << *dn << endl;
dout(10) << "EMetaBlob.replay unlinking " << *dn << endl;
dir->unlink_inode(dn);
}
- dn->set_remote_ino(p->ino);
+ dn->set_remote(p->ino, p->d_type);
dn->set_version(p->dnv);
if (p->dirty) dn->_mark_dirty();
dout(10) << "EMetaBlob.replay had " << *dn << endl;
p++) {
CDentry *dn = dir->lookup(p->dn);
if (!dn) {
- dn = dir->add_dentry(p->dn, DT_UNKNOWN);
+ dn = dir->add_null_dentry(p->dn);
dn->set_version(p->dnv);
if (p->dirty) dn->_mark_dirty();
dout(10) << "EMetaBlob.replay added " << *dn << endl;
dirfrag_strong(int n) : nonce(n) {}
};
struct dn_strong {
- unsigned char d_type;
inodeno_t ino;
inodeno_t remote_ino;
+ unsigned char remote_d_type;
int32_t nonce;
int32_t lock;
- dn_strong() : d_type(0), ino(0), remote_ino(0), nonce(0), lock(0) {}
- dn_strong(unsigned char dt, inodeno_t pi, inodeno_t ri, int n, int l) :
- d_type(dt), ino(pi), remote_ino(ri), nonce(n), lock(l) {}
+ dn_strong() :
+ ino(0), remote_ino(0), remote_d_type(0), nonce(0), lock(0) {}
+ dn_strong(inodeno_t pi, inodeno_t ri, unsigned char rdt, int n, int l) :
+ ino(pi), remote_ino(ri), remote_d_type(rdt), nonce(n), lock(l) {}
bool is_primary() { return ino > 0; }
bool is_remote() { return remote_ino > 0; }
bool is_null() { return ino == 0 && remote_ino == 0; }
};
struct dn_weak {
- unsigned char d_type;
inodeno_t ino;
inodeno_t remote_ino;
- dn_weak() : d_type(0), ino(0), remote_ino(0) {}
- dn_weak(unsigned char dt, inodeno_t pi, inodeno_t ri) : d_type(dt), ino(pi), remote_ino(ri) {}
+ unsigned char remote_d_type;
+ dn_weak() :
+ ino(0), remote_ino(0), remote_d_type(0) {}
+ dn_weak(inodeno_t pi, inodeno_t ri, unsigned char rdt) :
+ ino(pi), remote_ino(ri), remote_d_type(rdt) {}
bool is_primary() { return ino > 0; }
bool is_remote() { return remote_ino > 0; }
bool is_null() { return ino == 0 && remote_ino == 0; }
void add_weak_null_dentry(dirfrag_t df, const string& dname) {
weak[df][dname] = dn_weak(0, 0, 0);
}
- void add_weak_primary_dentry(dirfrag_t df, const string& dname, unsigned char dt, inodeno_t ino) {
- weak[df][dname] = dn_weak(dt, ino, 0);
+ void add_weak_primary_dentry(dirfrag_t df, const string& dname, inodeno_t ino) {
+ weak[df][dname] = dn_weak(ino, 0, 0);
}
- void add_weak_remote_dentry(dirfrag_t df, const string& dname, unsigned char dt, inodeno_t ino) {
- weak[df][dname] = dn_weak(dt, 0, ino);
+ void add_weak_remote_dentry(dirfrag_t df, const string& dname, inodeno_t ino, unsigned char rdt) {
+ weak[df][dname] = dn_weak(0, ino, rdt);
}
- void add_strong_dentry(dirfrag_t df, const string& dname, unsigned char dt, inodeno_t pi, inodeno_t ri, int n, int ls) {
- strong_dentries[df][dname] = dn_strong(dt, pi, ri, n, ls);
+ void add_strong_dentry(dirfrag_t df, const string& dname, inodeno_t pi, inodeno_t ri, unsigned char rdt, int n, int ls) {
+ strong_dentries[df][dname] = dn_strong(pi, ri, rdt, n, ls);
}
void add_dentry_authpin(dirfrag_t df, const string& dname, const metareqid_t& ri) {
authpinned_dentries[df][dname] = ri;