| 320 | return r; |
| 321 | } |
| 322 | int for_each_readdir_snapdiff(const char* relpath, |
| 323 | const char* snap1, |
| 324 | const char* snap2, |
| 325 | std::function<bool(const dirent*, uint64_t)> fn) |
| 326 | { |
| 327 | auto s1 = make_snap_name(snap1); |
| 328 | auto s2 = make_snap_name(snap2); |
| 329 | ceph_snapdiff_info info; |
| 330 | ceph_snapdiff_entry_t res_entry; |
| 331 | int r = ceph_open_snapdiff(cmount, |
| 332 | dir_path, |
| 333 | relpath, |
| 334 | s1.c_str(), |
| 335 | s2.c_str(), |
| 336 | &info); |
| 337 | if (r != 0) { |
| 338 | std::cerr << " Failed to open snapdiff, ret:" << r << std::endl; |
| 339 | return r; |
| 340 | } |
| 341 | while (0 < (r = ceph_readdir_snapdiff(&info, |
| 342 | &res_entry))) { |
| 343 | if (strcmp(res_entry.dir_entry.d_name, ".") == 0 || |
| 344 | strcmp(res_entry.dir_entry.d_name, "..") == 0) { |
| 345 | continue; |
| 346 | } |
| 347 | if (!fn(&res_entry.dir_entry, res_entry.snapid)) { |
| 348 | r = -EINTR; |
| 349 | break; |
| 350 | } |
| 351 | } |
| 352 | ceph_assert(0 == ceph_close_snapdiff(&info)); |
| 353 | if (r != 0) { |
| 354 | std::cerr << " Failed to readdir snapdiff, ret:" << r |
| 355 | << " " << relpath << ", " << snap1 << " vs. " << snap2 |
| 356 | << std::endl; |
| 357 | } |
| 358 | return r; |
| 359 | } |
| 360 | int readdir_snapdiff_and_compare(const char* relpath, |
| 361 | const char* snap1, |
| 362 | const char* snap2, |
no test coverage detected