| 11966 | } |
| 11967 | |
| 11968 | int Client::_read_sync(Fh *f, uint64_t off, uint64_t len, bufferlist *bl, |
| 11969 | bool *checkeof) |
| 11970 | { |
| 11971 | ceph_assert(ceph_mutex_is_locked_by_me(client_lock)); |
| 11972 | if (len == 0) { |
| 11973 | // zero byte read is not supported by OSD |
| 11974 | return 0; |
| 11975 | } |
| 11976 | |
| 11977 | Inode *in = f->inode.get(); |
| 11978 | |
| 11979 | auto effective_size = in->effective_size(); |
| 11980 | auto target_len = std::min(len, effective_size - off); |
| 11981 | uint64_t read_start; |
| 11982 | uint64_t read_len; |
| 11983 | |
| 11984 | #if defined(__linux__) |
| 11985 | FSCryptFDataDencRef fscrypt_denc; |
| 11986 | fscrypt->prepare_data_read(in->fscrypt_ctx, |
| 11987 | &in->fscrypt_key_validator, |
| 11988 | off, len, in->size, |
| 11989 | &read_start, &read_len, |
| 11990 | &fscrypt_denc); |
| 11991 | #else |
| 11992 | read_start = off; |
| 11993 | read_len = len; |
| 11994 | #endif |
| 11995 | uint64_t pos = read_start; |
| 11996 | int left = read_len; |
| 11997 | int read = 0; |
| 11998 | |
| 11999 | bufferlist encbl; |
| 12000 | #if defined(__linux__) |
| 12001 | bufferlist *pbl = (fscrypt_denc ? &encbl : bl); |
| 12002 | #else |
| 12003 | bufferlist *pbl = bl; |
| 12004 | #endif |
| 12005 | ldout(cct, 10) << __func__ << " " << *in << " " << off << "~" << len << dendl; |
| 12006 | |
| 12007 | // 0 success, 1 continue and < 0 error happen. |
| 12008 | auto wait_and_copy = [&](C_SaferCond &onfinish, bufferlist &tbl, int wanted) { |
| 12009 | int r = onfinish.wait(); |
| 12010 | |
| 12011 | // if we get ENOENT from OSD, assume 0 bytes returned |
| 12012 | if (r == -ENOENT) |
| 12013 | r = 0; |
| 12014 | if (r < 0) |
| 12015 | return r; |
| 12016 | |
| 12017 | if (tbl.length()) { |
| 12018 | r = tbl.length(); |
| 12019 | |
| 12020 | read += r; |
| 12021 | pos += r; |
| 12022 | left -= r; |
| 12023 | pbl->claim_append(tbl); |
| 12024 | } |
| 12025 |
nothing calls this directly
no test coverage detected