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

Method _sync_write

src/blk/kernel/KernelDevice.cc:1052–1113  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1050}
1051
1052int KernelDevice::_sync_write(uint64_t off, bufferlist &bl, bool buffered, int write_hint)
1053{
1054 uint64_t len = bl.length();
1055 dout(5) << __func__ << " 0x" << std::hex << off << "~" << len
1056 << std::dec << " " << buffermode(buffered) << dendl;
1057 if (cct->_conf->bdev_inject_crash &&
1058 rand() % cct->_conf->bdev_inject_crash == 0) {
1059 derr << __func__ << " bdev_inject_crash: dropping io 0x" << std::hex
1060 << off << "~" << len << std::dec << dendl;
1061 ++injecting_crash;
1062 return 0;
1063 }
1064 vector<iovec> iov;
1065 bl.prepare_iov(&iov);
1066
1067 auto left = len;
1068 auto o = off;
1069 size_t idx = 0;
1070 do {
1071 auto r = ::pwritev(choose_fd(buffered, write_hint),
1072 &iov[idx], iov.size() - idx, o);
1073
1074 if (r < 0) {
1075 r = -errno;
1076 derr << __func__ << " pwritev error: " << cpp_strerror(r) << dendl;
1077 return r;
1078 }
1079 o += r;
1080 left -= r;
1081 if (left) {
1082 // skip fully processed IOVs
1083 while (idx < iov.size() && (size_t)r >= iov[idx].iov_len) {
1084 r -= iov[idx++].iov_len;
1085 }
1086 // update partially processed one if any
1087 if (r) {
1088 ceph_assert(idx < iov.size());
1089 ceph_assert((size_t)r < iov[idx].iov_len);
1090 iov[idx].iov_base = static_cast<char*>(iov[idx].iov_base) + r;
1091 iov[idx].iov_len -= r;
1092 r = 0;
1093 }
1094 ceph_assert(r == 0);
1095 }
1096 } while (left);
1097
1098#ifdef HAVE_SYNC_FILE_RANGE
1099 if (buffered) {
1100 // initiate IO and wait till it completes
1101 auto r = ::sync_file_range(fd_buffereds[WRITE_LIFE_NOT_SET], off, len, SYNC_FILE_RANGE_WRITE|SYNC_FILE_RANGE_WAIT_AFTER|SYNC_FILE_RANGE_WAIT_BEFORE);
1102 if (r < 0) {
1103 r = -errno;
1104 derr << __func__ << " sync_file_range error: " << cpp_strerror(r) << dendl;
1105 return r;
1106 }
1107 }
1108#endif
1109

Callers

nothing calls this directly

Calls 5

buffermodeFunction · 0.85
cpp_strerrorFunction · 0.85
lengthMethod · 0.45
sizeMethod · 0.45
storeMethod · 0.45

Tested by

no test coverage detected