return false;
}
+bool CInode::has_subtree_or_exporting_dirfrag()
+{
+ for (map<frag_t,CDir*>::iterator p = dirfrags.begin();
+ p != dirfrags.end();
+ ++p)
+ if (p->second->is_subtree_root() ||
+ p->second->state_test(CDir::STATE_EXPORTING))
+ return true;
+ return false;
+}
void CInode::get_stickydirs()
{
CInode *in = static_cast<CInode *>(lock->get_parent());
client_t client = mut->get_client();
bool want_scatter = !nowait && lock->get_parent()->is_auth() &&
- (in->has_subtree_root_dirfrag() ||
+ (in->has_subtree_or_exporting_dirfrag() ||
static_cast<ScatterLock*>(lock)->get_scatter_wanted());
while (1) {
}
CInode *in = static_cast<CInode*>(lock->get_parent());
- if (!in->has_subtree_root_dirfrag() || in->is_base()) {
+ if (!in->has_subtree_or_exporting_dirfrag() || in->is_base()) {
// i _should_ be sync.
if (!lock->is_wrlocked() &&
lock->get_state() != LOCK_SYNC) {
!lock->is_rdlocked() &&
//!lock->is_waiter_for(SimpleLock::WAIT_WR) &&
((wanted & (CEPH_CAP_GWR|CEPH_CAP_GBUFFER)) ||
- (in->inode.is_dir() && !in->has_subtree_root_dirfrag())) &&
+ (in->inode.is_dir() && !in->has_subtree_or_exporting_dirfrag())) &&
in->get_target_loner() >= 0) {
dout(7) << "file_eval stable, bump to loner " << *lock
<< " on " << *lock->get_parent() << dendl;
!lock->is_waiter_for(SimpleLock::WAIT_WR) &&
!(wanted & (CEPH_CAP_GWR|CEPH_CAP_GBUFFER)) &&
!((lock->get_state() == LOCK_MIX) &&
- in->is_dir() && in->has_subtree_root_dirfrag()) // if we are a delegation point, stay where we are
+ in->is_dir() && in->has_subtree_or_exporting_dirfrag()) // if we are a delegation point, stay where we are
//((wanted & CEPH_CAP_RD) ||
//in->is_replicated() ||
//lock->get_num_client_lease() ||