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

Method _read_sync

src/client/Client.cc:11968–12087  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

11966}
11967
11968int 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);
11981uint64_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

Callers

nothing calls this directly

Calls 13

prepare_data_readMethod · 0.80
decrypt_blMethod · 0.80
createFunction · 0.50
getMethod · 0.45
effective_sizeMethod · 0.45
waitMethod · 0.45
lengthMethod · 0.45
claim_appendMethod · 0.45
zeroMethod · 0.45
push_backMethod · 0.45
read_truncMethod · 0.45
unlockMethod · 0.45

Tested by

no test coverage detected