static int wait_for_subvolume_cleaning(int fd, int count, u64 *ids, int sleep_interval) { int ret = 0; int remaining; int i; remaining = count; while (1) { for (i = 0; i < count; i++) { if (!ids[i]) continue; ret = is_subvolume_cleaned(fd, ids[i]); if (ret < 0) { fprintf(stderr, "ERROR: can't perform the search - %s\n", strerror(-ret)); goto out; } if (ret) { printf("Subvolume id %llu is gone\n", ids[i]); ids[i] = 0; remaining--; } } if (!remaining) break; sleep(sleep_interval); } out: return ret; }
static int wait_for_subvolume_cleaning(int fd, int count, u64 *ids, int sleep_interval) { int ret; int i; while (1) { int clean = 1; for (i = 0; i < count; i++) { if (!ids[i]) continue; ret = is_subvolume_cleaned(fd, ids[i]); if (ret < 0) { error( "cannot read status of dead subvolume %llu: %s", (unsigned long long)ids[i], strerror(-ret)); return ret; } if (ret) { printf("Subvolume id %llu is gone\n", ids[i]); ids[i] = 0; } else { clean = 0; } } if (clean) break; sleep(sleep_interval); } return 0; }
static int cmd_subvol_sync(int argc, char **argv) { int fd = -1; int i; int ret = 1; DIR *dirstream = NULL; u64 *ids = NULL; int id_count; int remaining; int sleep_interval = 1; optind = 1; while (1) { int c = getopt(argc, argv, "s:"); if (c < 0) break; switch (c) { case 's': sleep_interval = atoi(argv[optind]); if (sleep_interval < 1) { fprintf(stderr, "ERROR: invalid sleep interval %s\n", argv[optind]); ret = 1; goto out; } break; default: usage(cmd_subvol_sync_usage); } } if (check_argc_min(argc - optind, 1)) usage(cmd_subvol_sync_usage); fd = open_file_or_dir(argv[optind], &dirstream); if (fd < 0) { fprintf(stderr, "ERROR: can't access '%s'\n", argv[optind]); ret = 1; goto out; } optind++; id_count = argc - optind; /* * Wait for all */ if (!id_count) { while (1) { ret = fs_has_dead_subvolumes(fd); if (ret < 0) { fprintf(stderr, "ERROR: can't perform the search - %s\n", strerror(-ret)); ret = 1; goto out; } if (!ret) goto out; sleep(sleep_interval); } } /* * Wait only for the requested ones */ ids = (u64*)malloc(sizeof(u64) * id_count); if (!ids) { fprintf(stderr, "ERROR: not enough memory\n"); ret = 1; goto out; } for (i = 0; i < id_count; i++) { u64 id; const char *arg; arg = argv[optind + i]; errno = 0; id = strtoull(arg, NULL, 10); if (errno < 0) { fprintf(stderr, "ERROR: unrecognized subvolume id %s\n", arg); ret = 1; goto out; } if (id < BTRFS_FIRST_FREE_OBJECTID || id > BTRFS_LAST_FREE_OBJECTID) { fprintf(stderr, "ERROR: subvolume id %s out of range\n", arg); ret = 1; goto out; } ids[i] = id; } remaining = id_count; while (1) { for (i = 0; i < id_count; i++) { if (!ids[i]) continue; ret = is_subvolume_cleaned(fd, ids[i]); if (ret < 0) { fprintf(stderr, "ERROR: can't perform the search - %s\n", strerror(-ret)); goto out; } if (ret) { printf("Subvolume id %llu is gone\n", ids[i]); ids[i] = 0; remaining--; } } if (!remaining) break; sleep(sleep_interval); } out: free(ids); close_file_or_dir(fd, dirstream); return !!ret; }