snapid_t first, snapid_t last)
{
// foreign
- assert(lookup(dname, last) == 0);
+ assert(lookup_exact_snap(dname, last) == 0);
// create dentry
CDentry* dn = new CDentry(dname, first, last);
snapid_t first, snapid_t last)
{
// primary
- assert(lookup(dname, last) == 0);
+ assert(lookup_exact_snap(dname, last) == 0);
// create dentry
CDentry* dn = new CDentry(dname, first, last);
snapid_t first, snapid_t last)
{
// foreign
- assert(lookup(dname, last) == 0);
+ assert(lookup_exact_snap(dname, last) == 0);
// create dentry
CDentry* dn = new CDentry(dname, ino, d_type, first, last);
// -- dentries and inodes --
public:
+ CDentry* lookup_exact_snap(const nstring& dname, snapid_t last) {
+ map_t::iterator p = items.find(dentry_key_t(last, dname.c_str()));
+ if (p == items.end())
+ return NULL;
+ return p->second;
+ }
CDentry* lookup(const string& n, snapid_t snap=CEPH_NOSNAP) {
return lookup(n.c_str(), snap);
}
for (list<fullbit>::iterator p = lump.get_dfull().begin();
p != lump.get_dfull().end();
p++) {
- CDentry *dn = dir->lookup(p->dn, p->dnlast);
- if (!dn || dn->last != p->dnlast) {
+ CDentry *dn = dir->lookup_exact_snap(p->dn, p->dnlast);
+ if (!dn) {
dn = dir->add_null_dentry(p->dn, p->dnfirst, p->dnlast);
dn->set_version(p->dnv);
if (p->dirty) dn->_mark_dirty(logseg);
for (list<remotebit>::iterator p = lump.get_dremote().begin();
p != lump.get_dremote().end();
p++) {
- CDentry *dn = dir->lookup(p->dn, p->dnlast);
- if (!dn || dn->last != p->dnlast) {
+ CDentry *dn = dir->lookup_exact_snap(p->dn, p->dnlast);
+ if (!dn) {
dn = dir->add_remote_dentry(p->dn, p->ino, p->d_type, p->dnfirst, p->dnlast);
dn->set_version(p->dnv);
if (p->dirty) dn->_mark_dirty(logseg);
for (list<nullbit>::iterator p = lump.get_dnull().begin();
p != lump.get_dnull().end();
p++) {
- CDentry *dn = dir->lookup(p->dn, p->dnfirst);
- if (!dn || dn->last != p->dnlast) {
+ CDentry *dn = dir->lookup_exact_snap(p->dn, p->dnfirst);
+ if (!dn) {
dn = dir->add_null_dentry(p->dn, p->dnfirst, p->dnlast);
dn->set_version(p->dnv);
if (p->dirty) dn->_mark_dirty(logseg);