diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 8566e55f291..c12930837df 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -2554,7 +2554,7 @@ void CInode::replicate_relax_locks() // ============================================= int CInode::encode_inodestat(bufferlist& bl, Session *session, - SnapRealm *realm, + SnapRealm *dir_realm, snapid_t snapid, unsigned max_bytes) { int client = session->inst.name.num(); @@ -2565,7 +2565,8 @@ int CInode::encode_inodestat(bufferlist& bl, Session *session, bool valid = true; // do not issue caps if inode differs from readdir snaprealm - bool no_caps = (realm && snaprealm && realm != snaprealm); + SnapRealm *realm = find_snaprealm(); + bool no_caps = (realm && dir_realm && realm != dir_realm); if (no_caps) dout(20) << "encode_inodestat realm=" << realm << " snaprealm " << snaprealm << " no_caps=" << no_caps << dendl; @@ -2724,7 +2725,7 @@ int CInode::encode_inodestat(bufferlist& bl, Session *session, } else { if (!no_caps && valid && !cap) { // add a new cap - cap = add_client_cap(client, session, find_snaprealm()); + cap = add_client_cap(client, session, realm); if (is_auth()) { if (choose_ideal_loner() >= 0) try_set_loner(); @@ -2747,7 +2748,7 @@ int CInode::encode_inodestat(bufferlist& bl, Session *session, e.cap.seq = cap->get_last_seq(); dout(10) << "encode_inodestat issueing " << ccap_string(issue) << " seq " << cap->get_last_seq() << dendl; e.cap.mseq = cap->get_mseq(); - e.cap.realm = find_snaprealm()->inode->ino(); + e.cap.realm = realm->inode->ino(); } else { e.cap.cap_id = 0; e.cap.caps = 0; diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index a03789f2368..e033bbee198 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -834,12 +834,7 @@ void Locker::try_eval(MDSCacheObject *p, int mask) return; } - if (!p->is_auth()) { - dout(7) << "try_eval not auth for " << *p << dendl; - return; - } - - if (!p->can_auth_pin()) { + if (p->is_auth() && !p->can_auth_pin()) { dout(7) << "try_eval can't auth_pin, waiting on " << *p << dendl; p->add_waiter(MDSCacheObject::WAIT_UNFREEZE, new C_Locker_Eval(this, p, mask)); return; @@ -849,7 +844,7 @@ void Locker::try_eval(MDSCacheObject *p, int mask) assert(mask == CEPH_LOCK_DN); bool need_issue = false; // ignore this, no caps on dentries CDentry *dn = (CDentry *)p; - simple_eval(&dn->lock, &need_issue); + eval_any(&dn->lock, &need_issue); } else { CInode *in = (CInode *)p; eval(in, mask); diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 00a21586bac..5027469f095 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -3315,10 +3315,9 @@ void MDCache::rejoin_send_rejoins() p->second->add_scatterlock_state(root); } } - for (int i = 0; i < NUM_STRAY; ++i) { - CInode *s = get_inode(MDS_INO_STRAY(p->first, i)); - if (s) - p->second->add_weak_inode(s->vino()); + if (CInode *in = get_inode(MDS_INO_MDSDIR(p->first))) { + if (in) + p->second->add_weak_inode(in->vino()); } } else { // strong @@ -3334,15 +3333,14 @@ void MDCache::rejoin_send_rejoins() p->second->add_scatterlock_state(root); } } - for (int i = 0; i < NUM_STRAY; ++i) { - if (CInode *in = get_inode(MDS_INO_STRAY(p->first, i))) { - p->second->add_weak_inode(in->vino()); - p->second->add_strong_inode(in->vino(), - in->get_caps_wanted(), - in->filelock.get_state(), - in->nestlock.get_state(), - in->dirfragtreelock.get_state()); - } + + if (CInode *in = get_inode(MDS_INO_MDSDIR(p->first))) { + p->second->add_weak_inode(in->vino()); + p->second->add_strong_inode(in->vino(), + in->get_caps_wanted(), + in->filelock.get_state(), + in->nestlock.get_state(), + in->dirfragtreelock.get_state()); } } } diff --git a/src/mds/Migrator.cc b/src/mds/Migrator.cc index 98ab4e1ffcd..9829d6839d5 100644 --- a/src/mds/Migrator.cc +++ b/src/mds/Migrator.cc @@ -640,8 +640,8 @@ void Migrator::export_dir(CDir *dir, int dest) return; } - if (!dir->inode->is_base() && - dir->inode->get_parent_dir()->ino() == MDS_INO_MDSDIR(mds->get_nodeid())) { + if (!dir->inode->is_base() && dir->get_parent_dir()->get_inode()->is_stray() && + dir->get_parent_dir()->get_parent_dir()->ino() == MDS_INO_MDSDIR(mds->get_nodeid())) { dout(7) << "i won't export anything in stray" << dendl; return; } diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 9c9ad3179cf..4642a1346ff 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -5138,7 +5138,7 @@ void Server::handle_client_rename(MDRequest *mdr) // is this a stray migration, reintegration or merge? (sanity checks!) if (mdr->reqid.name.is_mds() && - !(MDS_INO_IS_STRAY(srcpath.get_ino()) && + !(MDS_INO_IS_MDSDIR(srcpath.get_ino()) && MDS_INO_IS_STRAY(destpath.get_ino())) && !(destdnl->is_remote() && destdnl->get_remote_ino() == srci->ino())) {