| 2413 | } |
| 2414 | |
| 2415 | int Client::encode_inode_release(Inode *in, MetaRequest *req, |
| 2416 | mds_rank_t mds, int drop, |
| 2417 | int unless, int force) |
| 2418 | { |
| 2419 | ldout(cct, 20) << __func__ << " enter(in:" << *in << ", req:" << req |
| 2420 | << " mds:" << mds << ", drop:" << ccap_string(drop) << ", unless:" << ccap_string(unless) |
| 2421 | << ", force:" << force << ")" << dendl; |
| 2422 | int released = 0; |
| 2423 | auto it = in->caps.find(mds); |
| 2424 | if (it != in->caps.end()) { |
| 2425 | Cap &cap = it->second; |
| 2426 | drop &= ~(in->dirty_caps | get_caps_used(in)); |
| 2427 | if ((drop & cap.issued) && |
| 2428 | !(unless & cap.issued)) { |
| 2429 | ldout(cct, 25) << "dropping caps " << ccap_string(drop) << dendl; |
| 2430 | cap.issued &= ~drop; |
| 2431 | cap.implemented &= ~drop; |
| 2432 | released = 1; |
| 2433 | } else { |
| 2434 | released = force; |
| 2435 | } |
| 2436 | if (released) { |
| 2437 | cap.wanted = in->caps_wanted(); |
| 2438 | if (&cap == in->auth_cap && |
| 2439 | !(cap.wanted & CEPH_CAP_ANY_FILE_WR)) { |
| 2440 | in->requested_max_size = 0; |
| 2441 | ldout(cct, 25) << "reset requested_max_size due to not wanting any file write cap" << dendl; |
| 2442 | } |
| 2443 | ceph_mds_request_release rel; |
| 2444 | rel.ino = in->ino; |
| 2445 | rel.cap_id = cap.cap_id; |
| 2446 | rel.seq = cap.seq; |
| 2447 | rel.issue_seq = cap.issue_seq; |
| 2448 | rel.mseq = cap.mseq; |
| 2449 | rel.caps = cap.implemented; |
| 2450 | rel.wanted = cap.wanted; |
| 2451 | rel.dname_len = 0; |
| 2452 | rel.dname_seq = 0; |
| 2453 | req->cap_releases.push_back(MClientRequest::Release(rel,"")); |
| 2454 | } |
| 2455 | } |
| 2456 | ldout(cct, 25) << __func__ << " exit(in:" << *in << ") released:" |
| 2457 | << released << dendl; |
| 2458 | return released; |
| 2459 | } |
| 2460 | |
| 2461 | void Client::encode_dentry_release(Dentry *dn, MetaRequest *req, |
| 2462 | mds_rank_t mds, int drop, int unless) |
nothing calls this directly
no test coverage detected