return straydir;
}
-CDentry *MDCache::get_or_create_stray_dentry(CInode *in)
-{
- CDir *straydir = get_stray_dir(in);
- string straydname;
- in->name_stray_dentry(straydname);
- CDentry *straydn = straydir->lookup(straydname);
- if (!straydn) {
- straydn = straydir->add_null_dentry(straydname);
- straydn->mark_new();
- } else {
- ceph_assert(straydn->get_projected_linkage()->is_null());
- }
-
- straydn->state_set(CDentry::STATE_STRAY);
- return straydn;
-}
-
-
-
MDSCacheObject *MDCache::get_object(const MDSCacheObjectInfo &info)
{
// inode?
void MDCache::encode_replica_stray(CDentry *straydn, mds_rank_t who, bufferlist& bl)
{
+ ceph_assert(straydn->get_num_auth_pins());
ENCODE_START(1, 1, bl);
uint64_t features = mds->mdsmap->get_up_features();
encode_replica_inode(get_myin(), who, bl, features);
void open_foreign_mdsdir(inodeno_t ino, MDSContext *c);
CDir *get_stray_dir(CInode *in);
- CDentry *get_or_create_stray_dentry(CInode *in);
/**
* Find the given dentry (and whether it exists or not), its ancestors,
CDentry* Server::prepare_stray_dentry(MDRequestRef& mdr, CInode *in)
{
+ string straydname;
+ in->name_stray_dentry(straydname);
+
CDentry *straydn = mdr->straydn;
if (straydn) {
- string straydname;
- in->name_stray_dentry(straydname);
ceph_assert(straydn->get_name() == straydname);
return straydn;
}
-
CDir *straydir = mdcache->get_stray_dir(in);
if (!mdr->client_request->is_replay() &&
!check_fragment_space(mdr, straydir))
- return NULL;
+ return nullptr;
- straydn = mdcache->get_or_create_stray_dentry(in);
+ straydn = straydir->lookup(straydname);
+ if (!straydn) {
+ if (straydir->is_frozen_dir()) {
+ dout(10) << __func__ << ": " << *straydir << " is frozen, waiting" << dendl;
+ mds->locker->drop_locks(mdr.get());
+ mdr->drop_local_auth_pins();
+ straydir->add_waiter(CInode::WAIT_UNFREEZE, new C_MDS_RetryRequest(mdcache, mdr));
+ return nullptr;
+ }
+ straydn = straydir->add_null_dentry(straydname);
+ straydn->mark_new();
+ } else {
+ ceph_assert(straydn->get_projected_linkage()->is_null());
+ }
+
+ straydn->state_set(CDentry::STATE_STRAY);
mdr->straydn = straydn;
mdr->pin(straydn);
+
return straydn;
}