}
void Client::send_cap(Inode *in, MetaSession *session, Cap *cap,
- int used, int want, int retain, int flush)
+ int used, int want, int retain, int flush,
+ ceph_tid_t flush_tid)
{
int held = cap->issued | cap->implemented;
int revoking = cap->implemented & ~cap->issued;
cap->implemented &= cap->issued | used;
}
- uint64_t flush_tid = 0;
snapid_t follows = 0;
- if (flush) {
- flush_tid = ++last_flush_tid;
- in->flushing_cap_tids[flush_tid] = flush;
+ if (flush)
follows = in->snaprealm->get_snap_context().seq;
- }
MClientCaps *m = new MClientCaps(op,
in->ino,
ack:
int flushing;
- if (in->auth_cap == cap && in->dirty_caps)
- flushing = mark_caps_flushing(in);
- else
+ ceph_tid_t flush_tid;
+ if (in->auth_cap == cap && in->dirty_caps) {
+ flushing = mark_caps_flushing(in, &flush_tid);
+ } else {
flushing = 0;
+ flush_tid = 0;
+ }
- send_cap(in, session, cap, cap_used, wanted, retain, flushing);
+ send_cap(in, session, cap, cap_used, wanted, retain, flushing, flush_tid);
}
}
in->dirty_caps |= caps;
}
-int Client::mark_caps_flushing(Inode *in)
+int Client::mark_caps_flushing(Inode *in, ceph_tid_t* ptid)
{
MetaSession *session = in->auth_cap->session;
int flushing = in->dirty_caps;
assert(flushing);
+ ceph_tid_t flush_tid = ++last_flush_tid;
+ in->flushing_cap_tids[flush_tid] = flushing;
+
if (!in->flushing_caps) {
ldout(cct, 10) << "mark_caps_flushing " << ccap_string(flushing) << " " << *in << dendl;
in->flushing_cap_seq = ++last_flush_seq;
session->flushing_caps.push_back(&in->flushing_cap_item);
+ *ptid = flush_tid;
return flushing;
}
Cap *cap = in->auth_cap;
assert(cap->session == session);
- send_cap(in, session, cap, get_caps_used(in), in->caps_wanted(),
- (cap->issued | cap->implemented), in->flushing_caps);
+ for (map<ceph_tid_t,int>::iterator p = in->flushing_cap_tids.begin();
+ p != in->flushing_cap_tids.end();
+ ++p) {
+ send_cap(in, session, cap, (get_caps_used(in) | in->caps_dirty()),
+ in->caps_wanted(), (cap->issued | cap->implemented),
+ p->second, p->first);
+ }
}
void Client::wait_sync_caps(Inode *in, ceph_tid_t want)
void remove_all_caps(Inode *in);
void remove_session_caps(MetaSession *session);
void mark_caps_dirty(Inode *in, int caps);
- int mark_caps_flushing(Inode *in);
+ int mark_caps_flushing(Inode *in, ceph_tid_t *ptid);
void flush_caps();
void flush_caps(Inode *in, MetaSession *session);
void kick_flushing_caps(MetaSession *session);
void handle_cap_grant(MetaSession *session, Inode *in, Cap *cap, class MClientCaps *m);
void cap_delay_requeue(Inode *in);
void send_cap(Inode *in, MetaSession *session, Cap *cap,
- int used, int want, int retain, int flush);
+ int used, int want, int retain, int flush,
+ ceph_tid_t flush_tid);
void check_caps(Inode *in, bool is_delayed);
void get_cap_ref(Inode *in, int cap);
void put_cap_ref(Inode *in, int cap);