}
-void Locker::share_inode_max_size(CInode *in)
+void Locker::share_inode_max_size(CInode *in, Capability *only_cap)
{
/*
* only share if currently issued a WR cap. if client doesn't have it,
* the cap later.
*/
dout(10) << "share_inode_max_size on " << *in << dendl;
- for (map<client_t,Capability*>::iterator it = in->client_caps.begin();
- it != in->client_caps.end();
- ++it) {
+ map<client_t, Capability*>::iterator it;
+ if (only_cap)
+ it = in->client_caps.find(only_cap->get_client());
+ else
+ it = in->client_caps.begin();
+ for (; it != in->client_caps.end(); ++it) {
const client_t client = it->first;
Capability *cap = it->second;
if (cap->is_suppress())
in->encode_cap_message(m, cap);
mds->send_message_client_counted(m, client);
}
+ if (only_cap)
+ break;
}
}
bool did_issue = eval(in, CEPH_CAP_LOCKS);
if (!did_issue && (cap->wanted() & ~cap->pending()))
issue_caps(in, cap);
+ if (cap->get_last_seq() == 0 &&
+ (cap->pending() & (CEPH_CAP_FILE_WR|CEPH_CAP_FILE_BUFFER))) {
+ cap->issue_norevoke(cap->issued());
+ share_inode_max_size(in, cap);
+ }
}
}
void calc_new_client_ranges(CInode *in, uint64_t size, map<client_t, client_writeable_range_t>& new_ranges);
bool check_inode_max_size(CInode *in, bool force_wrlock=false, bool update_size=false, uint64_t newsize=0,
utime_t mtime=utime_t());
- void share_inode_max_size(CInode *in);
+ void share_inode_max_size(CInode *in, Capability *only_cap=0);
private:
friend class C_MDL_CheckMaxSize;
SnapRealm *realm = in->find_snaprealm();
if (realm->have_past_parents_open()) {
dout(10) << "do_cap_import " << session->info.inst.name << " mseq " << cap->get_mseq() << " on " << *in << dendl;
+ if (cap->get_last_seq() == 0)
+ cap->issue_norevoke(cap->issued()); // reconnected cap
cap->set_last_issue();
MClientCaps *reap = new MClientCaps(CEPH_CAP_OP_IMPORT,
in->ino(),