Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
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;
}