#include "disk-io.h"
#include "commands.h"
+#include "help.h"
static const char * const scrub_cmd_group_usage[] = {
"btrfs scrub <command> [options] <path>|<device>",
/*
* returns 0 if the key did not match (nothing was read)
* 1 if the key did match (success)
- * -1 if the key did match and an error occured
+ * -1 if the key did match and an error occurred
*/
static int scrub_kvread(int *i, int len, int avail, const char *buf,
const char *key, u64 *dest)
{
int avail = 0;
int old_avail = 0;
- char l[16 * 1024];
+ char l[SZ_16K];
int state = 0;
int curr = -1;
int i = 0;
again:
old_avail = avail - i;
- BUG_ON(old_avail < 0);
+ if (old_avail < 0) {
+ error("scrub record file corrupted near byte %d", i);
+ return ERR_PTR(-EINVAL);
+ }
if (old_avail)
memmove(l, l + i, old_avail);
avail = read(fd, l + old_avail, sizeof(l) - old_avail);
} while (i < avail);
continue;
}
- BUG();
+ error("internal error: unknown parser state %d near byte %d",
+ state, i);
+ return ERR_PTR(-EINVAL);
}
goto again;
}
IOPRIO_PRIO_VALUE(sp->ioprio_class,
sp->ioprio_classdata));
if (ret)
- warning("setting ioprio failed: %s (ignored)",
- strerror(errno));
+ warning("setting ioprio failed: %m (ignored)");
ret = ioctl(sp->fd, BTRFS_IOC_SCRUB, &sp->scrub_args);
gettimeofday(&tv, NULL);
int force = 0;
int nothing_to_resume = 0;
- optind = 1;
while ((c = getopt(argc, argv, "BdqrRc:n:f")) != -1) {
switch (c) {
case 'B':
if (mkdir_p(datafile)) {
warning_on(!do_quiet,
- "cannot create scrub data file, mkdir %s failed: %s. Status recording disabled",
- datafile, strerror(errno));
+ "cannot create scrub data file, mkdir %s failed: %m. Status recording disabled",
+ datafile);
do_record = 0;
}
free(datafile);
path = argv[optind];
- fdmnt = open_path_or_dev_mnt(path, &dirstream);
-
- if (fdmnt < 0) {
- if (errno == EINVAL)
- error_on(!do_quiet, "'%s' is not a mounted btrfs device",
- path);
- else
- error_on(!do_quiet, "can't access '%s': %s",
- path, strerror(errno));
+ fdmnt = open_path_or_dev_mnt(path, &dirstream, !do_quiet);
+ if (fdmnt < 0)
return 1;
- }
ret = get_fs_info(path, &fi_args, &di_args);
if (ret) {
spc.progress = calloc(fi_args.num_devices * 2, sizeof(*spc.progress));
if (!t_devs || !sp || !spc.progress) {
- error_on(!do_quiet, "scrub failed: %s", strerror(errno));
+ error_on(!do_quiet, "scrub failed: %m");
err = 1;
goto out;
}
ret = listen(prg_fd, 100);
if (ret == -1) {
warning_on(!do_quiet,
- "failed to open the progress status socket at %s: %s. Progress cannot be queried",
+ "failed to open the progress status socket at %s: %m. Progress cannot be queried",
sock_path[0] ? sock_path :
- SCRUB_PROGRESS_SOCKET_PATH, strerror(errno));
+ SCRUB_PROGRESS_SOCKET_PATH);
if (prg_fd != -1) {
close(prg_fd);
prg_fd = -1;
if (do_background) {
pid = fork();
if (pid == -1) {
- error_on(!do_quiet, "cannot scrub, fork failed: %s",
- strerror(errno));
+ error_on(!do_quiet, "cannot scrub, fork failed: %m");
err = 1;
goto out;
}
}
ret = wait(&stat);
if (ret != pid) {
- error_on(!do_quiet, "wait failed (ret=%d): %s",
- ret, strerror(errno));
+ error_on(!do_quiet, "wait failed (ret=%d): %m",
+ ret);
err = 1;
goto out;
}
int fdmnt = -1;
DIR *dirstream = NULL;
- if (check_argc_exact(argc, 2))
+ clean_args_no_options(argc, argv, cmd_scrub_cancel_usage);
+
+ if (check_argc_exact(argc - optind, 1))
usage(cmd_scrub_cancel_usage);
- path = argv[1];
+ path = argv[optind];
- fdmnt = open_path_or_dev_mnt(path, &dirstream);
+ fdmnt = open_path_or_dev_mnt(path, &dirstream, 1);
if (fdmnt < 0) {
- if (errno == EINVAL)
- error("'%s' is not a mounted btrfs device", path);
- else
- error("can't access '%s': %s", path, strerror(errno));
ret = 1;
goto out;
}
int err = 0;
DIR *dirstream = NULL;
- optind = 1;
while ((c = getopt(argc, argv, "dR")) != -1) {
switch (c) {
case 'd':
path = argv[optind];
- fdmnt = open_path_or_dev_mnt(path, &dirstream);
-
- if (fdmnt < 0) {
- if (errno == EINVAL)
- error("'%s' is not a mounted btrfs device", path);
- else
- error("can't access '%s': %s", path, strerror(errno));
+ fdmnt = open_path_or_dev_mnt(path, &dirstream, 1);
+ if (fdmnt < 0)
return 1;
- }
ret = get_fs_info(path, &fi_args, &di_args);
if (ret) {
fdres = socket(AF_UNIX, SOCK_STREAM, 0);
if (fdres == -1) {
- error("failed to create socket to receive progress information: %s",
- strerror(errno));
+ error("failed to create socket to receive progress information: %m");
err = 1;
goto out;
}