| 1050 | } |
| 1051 | |
| 1052 | int 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 |
nothing calls this directly
no test coverage detected