MCPcopy Create free account
hub / github.com/ceph/ceph / queue_cap_snap

Method queue_cap_snap

src/client/Client.cc:4363–4399  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

4361
4362
4363void Client::queue_cap_snap(Inode *in, const SnapContext& old_snapc)
4364{
4365 int used = get_caps_used(in);
4366 int dirty = in->caps_dirty();
4367 ldout(cct, 10) << __func__ << " " << *in << " snapc " << old_snapc << " used " << ccap_string(used) << dendl;
4368
4369 if (in->cap_snaps.size() &&
4370 in->cap_snaps.rbegin()->second.writing) {
4371 ldout(cct, 10) << __func__ << " already have pending cap_snap on " << *in << dendl;
4372 return;
4373 } else if (dirty || (used & CEPH_CAP_FILE_WR)) {
4374 const auto &capsnapem = in->cap_snaps.emplace(std::piecewise_construct, std::make_tuple(old_snapc.seq), std::make_tuple(in));
4375 ceph_assert(capsnapem.second); /* element inserted */
4376 CapSnap &capsnap = capsnapem.first->second;
4377 capsnap.context = old_snapc;
4378 capsnap.issued = in->caps_issued();
4379 capsnap.dirty = dirty;
4380
4381 capsnap.dirty_data = (used & CEPH_CAP_FILE_BUFFER);
4382
4383 capsnap.uid = in->uid;
4384 capsnap.gid = in->gid;
4385 capsnap.mode = in->mode;
4386 capsnap.btime = in->btime;
4387 capsnap.xattrs = in->xattrs;
4388 capsnap.xattr_version = in->xattr_version;
4389
4390 if (used & CEPH_CAP_FILE_WR) {
4391 ldout(cct, 10) << __func__ << " WR used on " << *in << dendl;
4392 capsnap.writing = 1;
4393 } else {
4394 finish_cap_snap(in, capsnap, used);
4395 }
4396 } else {
4397 ldout(cct, 10) << __func__ << " not dirty|writing on " << *in << dendl;
4398 }
4399}
4400
4401void Client::finish_cap_snap(Inode *in, CapSnap &capsnap, int used)
4402{

Callers

nothing calls this directly

Calls 6

ccap_stringFunction · 0.85
caps_dirtyMethod · 0.80
caps_issuedMethod · 0.80
sizeMethod · 0.45
rbeginMethod · 0.45
emplaceMethod · 0.45

Tested by

no test coverage detected