dn->lease_seq = dlease->seq;
}
}
+ dn->cap_rdcache_gen = dir->parent_inode->rdcache_gen;
}
if (flags & CEPH_CAP_FLAG_AUTH)
in->auth_cap = cap;
+ if ((issued & CEPH_CAP_FILE_RDCACHE) &&
+ !(cap->issued & CEPH_CAP_FILE_RDCACHE))
+ in->rdcache_gen++;
+
unsigned old_caps = cap->issued;
cap->cap_id = cap_id;
cap->issued |= issued;
kick_writers = true;
}
+ if ((issued & CEPH_CAP_FILE_RDCACHE) &&
+ !(cap->issued & CEPH_CAP_FILE_RDCACHE))
+ in->rdcache_gen++;
+
// update caps
if (old_caps & ~new_caps) {
dout(10) << " revocation of " << ccap_string(~new_caps & old_caps) << dendl;
<< dendl;
// is lease valid?
- if (dn->lease_mds >= 0 &&
- dn->lease_ttl > g_clock.now()) {
+ if ((dn->lease_mds >= 0 &&
+ dn->lease_ttl > g_clock.now()) ||
+ ((dir->caps_issued() & CEPH_CAP_FILE_RDCACHE) &&
+ dn->cap_rdcache_gen == dir->rdcache_gen)) {
*target = dn->inode;
goto done;
}
int lease_mds;
utime_t lease_ttl;
ceph_seq_t lease_seq;
+ int cap_rdcache_gen;
void get() {
assert(ref == 0); ref++; lru_pin();
//cout << "dentry.put on " << this << " " << name << " now " << ref << std::endl;
}
- Dentry() : dir(0), inode(0), ref(0), lease_mds(-1), lease_seq(0) { }
+ Dentry() : dir(0), inode(0), ref(0), lease_mds(-1), lease_seq(0), cap_rdcache_gen(0) { }
};
class Dir {
map<int,InodeCap*> caps; // mds -> InodeCap
InodeCap *auth_cap;
unsigned dirty_caps, flushing_caps;
+ int rdcache_gen;
int snap_caps, snap_cap_refs;
unsigned exporting_issued;
int exporting_mds;
//inode(_inode),
snapid(vino.snapid),
dir_auth(-1), dir_hashed(false), dir_replicated(false),
- dirty_caps(0), flushing_caps(0),
+ dirty_caps(0), flushing_caps(0), rdcache_gen(0),
snap_caps(0), snap_cap_refs(0),
exporting_issued(0), exporting_mds(-1), exporting_mseq(0),
cap_item(this),