ceph_cap_string(retain),
ceph_cap_string(__ceph_caps_issued(ci, NULL)),
(flags & CHECK_CAPS_AUTHONLY) ? " AUTHONLY":"");
- dout(20, " now %lu hold until min %lu max %lu\n",
- jiffies, ci->i_hold_caps_min, ci->i_hold_caps_max);
+ dout(20, " hold for min %ld max %ld\n",
+ ci->i_hold_caps_min - jiffies, ci->i_hold_caps_max - jiffies);
/*
* If we no longer need to hold onto old our caps, and we may
mut->cleanup();
delete mut;
+ if (cap && cap->wanted() & ~cap->pending())
+ issue_caps(in, cap);
+
if (share && in->is_auth() && in->filelock.is_stable())
share_inode_max_size(in);
}
-bool Locker::issue_caps(CInode *in)
+bool Locker::issue_caps(CInode *in, Capability *only_cap)
{
// allowed caps are determined by the lock mode.
int all_allowed = in->get_caps_allowed_by_type(CAP_ANY);
check_inode_max_size(in, true);
// client caps
- for (map<int, Capability*>::iterator it = in->client_caps.begin();
- it != in->client_caps.end();
- it++) {
+ map<int, 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++) {
Capability *cap = it->second;
if (cap->is_stale())
continue;
mds->send_message_client(m, it->first);
}
}
+
+ if (only_cap)
+ break;
}
return (nissued == 0); // true if no re-issued, no callbacks
}
int op = m->get_op();
- bool do_issue = true;
+ bool can_issue = true;
if (op == CEPH_CAP_OP_RENEW) {
if (cap->touch()) {
}
}
if (m->get_op() == CEPH_CAP_OP_DROP)
- do_issue = false;
+ can_issue = false;
if (!_do_cap_update(in, cap, m->get_dirty(), m->get_wanted(), follows, m, ack)) {
// no update, ack now.
eval_cap_gather(in);
if (in->filelock.is_stable())
- file_eval(&in->filelock, do_issue);
+ file_eval(&in->filelock, can_issue);
if (in->authlock.is_stable())
eval(&in->authlock);
+ if (cap->wanted() & ~cap->pending())
+ issue_caps(in, cap);
}
// done?
-void Locker::file_eval(ScatterLock *lock, bool do_issue)
+void Locker::file_eval(ScatterLock *lock, bool can_issue)
{
CInode *in = (CInode*)lock->get_parent();
int loner_wanted, other_wanted;
<< " on " << *lock->get_parent() << dendl;
simple_sync(lock);
}
-
- else
- do_issue = true;
-
- if (in->is_any_caps() && do_issue)
- issue_caps(in);
}
// file
public:
void try_file_eval(ScatterLock *lock);
- void file_eval(ScatterLock *lock, bool do_issue=true);
+ void file_eval(ScatterLock *lock, bool can_issue=true);
protected:
void handle_file_lock(ScatterLock *lock, MLock *m);
void file_mixed(ScatterLock *lock);
public:
version_t issue_file_data_version(CInode *in);
Capability* issue_new_caps(CInode *in, int mode, Session *session, SnapRealm *conrealm=0);
- bool issue_caps(CInode *in);
+ bool issue_caps(CInode *in, Capability *only_cap=0);
void issue_truncate(CInode *in);
void revoke_stale_caps(Session *session);
void resume_stale_caps(Session *session);