void Client::check_caps(Inode *in, bool is_delayed)
{
- int wanted = in->caps_wanted();
- int used = in->caps_used();
+ unsigned wanted = in->caps_wanted();
+ unsigned used = in->caps_used();
dout(10) << "check_caps on " << *in
<< " wanted " << ccap_string(wanted)
InodeCap *cap = it->second;
it++;
+ int like = wanted;
+ if (!unmounting)
+ like |= CEPH_CAP_ANY_RD;
+
int revoking = cap->implemented & ~cap->issued;
if (in->wanted_max_size > in->inode.max_size &&
goto ack;
}
- if ((cap->issued & ~wanted) == 0)
- continue; /* nothing extra, all good */
+ if (wanted == cap->wanted && // mds knows what we want.
+ cap->issued & ~like) // and we don't have anything we wouldn't like
+ continue;
+ //if ((cap->issued & ~wanted) == 0)
+ //continue; /* nothing extra, all good */
if (now < in->hold_caps_until) {
dout(10) << "delaying cap release" << dendl;
cap->issued,
wanted,
cap->mseq);
+ cap->wanted = wanted;
in->reported_size = in->inode.size;
m->set_max_size(in->wanted_max_size);
in->requested_max_size = in->wanted_max_size;
// don't want it?
int wanted = in->caps_wanted();
+ /*
if (wanted == 0) {
dout(5) << "handle_cap_grant on ino " << m->get_ino()
<< " seq " << m->get_seq()
messenger->send_message(m, m->get_source_inst());
return;
}
+ */
int used = in->caps_used();
m->set_mtime(in->inode.mtime);
m->set_atime(in->inode.atime);
m->set_wanted(wanted);
+ cap->wanted = wanted;
m->set_snap_follows(in->snaprealm->get_snap_context().seq);
m->set_migrate_seq(cap->mseq);
}
struct InodeCap {
unsigned issued;
unsigned implemented;
+ unsigned wanted; // as known to mds.
__u64 seq;
__u32 mseq; // migration seq
- InodeCap() : issued(0), implemented(0), seq(0), mseq(0) {}
+ InodeCap() : issued(0), implemented(0), wanted(0), seq(0), mseq(0) {}
};
struct CapSnap {