| 291 | } |
| 292 | |
| 293 | Errata |
| 294 | StripeSM::updateHeaderFooter() |
| 295 | { |
| 296 | Errata zret; |
| 297 | this->vol_init_data(); |
| 298 | |
| 299 | int64_t hdr_size = this->vol_headerlen(); |
| 300 | int64_t dir_size = this->vol_dirlen(); |
| 301 | Bytes footer_offset = Bytes(dir_size - ROUND_TO_STORE_BLOCK(sizeof(StripeMeta))); |
| 302 | _meta_pos[A][HEAD] = round_down(_start); |
| 303 | _meta_pos[A][FOOT] = round_down(_start + footer_offset); |
| 304 | _meta_pos[B][HEAD] = round_down(this->_start + Bytes(dir_size)); |
| 305 | _meta_pos[B][FOOT] = round_down(this->_start + Bytes(dir_size) + footer_offset); |
| 306 | std::cout << "updating header " << _meta_pos[0][0] << std::endl; |
| 307 | std::cout << "updating header " << _meta_pos[0][1] << std::endl; |
| 308 | std::cout << "updating header " << _meta_pos[1][0] << std::endl; |
| 309 | std::cout << "updating header " << _meta_pos[1][1] << std::endl; |
| 310 | InitializeMeta(); |
| 311 | |
| 312 | if (!OPEN_RW_FLAG) { |
| 313 | zret.note("Writing Not Enabled.. Please use --write to enable writing to disk"); |
| 314 | return zret; |
| 315 | } |
| 316 | |
| 317 | char *meta_t = static_cast<char *>(ats_memalign(ats_pagesize(), dir_size)); |
| 318 | // copy headers |
| 319 | for (auto i : {A, B}) { |
| 320 | // copy header |
| 321 | memcpy(meta_t, &_meta[i][HEAD], sizeof(StripeMeta)); |
| 322 | // copy freelist |
| 323 | memcpy(meta_t + sizeof(StripeMeta) - sizeof(uint16_t), this->freelist, this->_segments * sizeof(uint16_t)); |
| 324 | |
| 325 | ssize_t n = pwrite(_span->_fd, meta_t, hdr_size, _meta_pos[i][HEAD]); |
| 326 | if (n < hdr_size) { |
| 327 | zret = swoc::Errata(make_errno_code(), "Failed to write stripe header "); |
| 328 | std::cout << "problem writing header to disk: " << strerror(errno) << ":" << " " << n << "<" << hdr_size << std::endl; |
| 329 | ats_free(meta_t); |
| 330 | return zret; |
| 331 | } |
| 332 | // copy dir entries |
| 333 | dir_size = dir_size - hdr_size - ROUND_TO_STORE_BLOCK(sizeof(StripeMeta)); |
| 334 | memcpy(meta_t, (char *)dir, dir_size); |
| 335 | n = pwrite(_span->_fd, meta_t, dir_size, _meta_pos[i][HEAD] + hdr_size); // |
| 336 | if (n < dir_size) { |
| 337 | zret = Errata(make_errno_code(), "Failed to write stripe header "); |
| 338 | std::cout << "problem writing dir to disk: " << strerror(errno) << ":" << " " << n << "<" << dir_size << std::endl; |
| 339 | ats_free(meta_t); |
| 340 | return zret; |
| 341 | } |
| 342 | |
| 343 | // copy footer, |
| 344 | memcpy(meta_t, &_meta[i][FOOT], sizeof(StripeMeta)); |
| 345 | |
| 346 | int64_t footer_size = ROUND_TO_STORE_BLOCK(sizeof(StripeMeta)); |
| 347 | n = pwrite(_span->_fd, meta_t, footer_size, _meta_pos[i][FOOT]); |
| 348 | if (n < footer_size) { |
| 349 | zret = Errata(make_errno_code(), "Failed to write stripe header "); |
| 350 | std::cout << "problem writing footer to disk: " << strerror(errno) << ":" << " " << n << "<" << footer_size << std::endl; |
no test coverage detected