| 4361 | |
| 4362 | |
| 4363 | void 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 | |
| 4401 | void Client::finish_cap_snap(Inode *in, CapSnap &capsnap, int used) |
| 4402 | { |
nothing calls this directly
no test coverage detected