btrfs-progs: remove duplicate checks from cmd_filesystem_resize

btrfs_open_dir already has a check whether the passed path is a
directory and if so it returns a specific error code (-3) when such an
error occurs. Use this instead of open-coding the directory check. To
avoid regression in cli/003 test also move directory checks before fs
type in btrfs_open.

Output before this check:

  ERROR: resize works on mounted filesystems and accepts only
  directories as argument. Passing file containing a btrfs image
  would resize the underlying filesystem instead of the image.

After:

  ERROR: not a directory: /root/btrfs-progs/tests/test.img
  ERROR: resize works on mounted filesystems and accepts only
  directories as argument. Passing file containing a btrfs image
  would resize the underlying filesystem instead of the image.

Signed-off-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Nikolay Borisov 2021-01-25 12:43:58 +02:00 committed by David Sterba
parent b39d02a0c0
commit 3e653e801c
2 changed files with 19 additions and 24 deletions

View File

@ -1082,7 +1082,6 @@ static int cmd_filesystem_resize(const struct cmd_struct *cmd,
char *amount, *path; char *amount, *path;
DIR *dirstream = NULL; DIR *dirstream = NULL;
int ret; int ret;
struct stat st;
bool enqueue = false; bool enqueue = false;
/* /*
@ -1115,22 +1114,18 @@ static int cmd_filesystem_resize(const struct cmd_struct *cmd,
return 1; return 1;
} }
res = stat(path, &st); fd = btrfs_open_dir(path, &dirstream, 1);
if (res < 0) { if (fd < 0) {
error("resize: cannot stat %s: %m", path); /* The path is a directory */
return 1; if (fd == -3) {
} error(
if (!S_ISDIR(st.st_mode)) { "resize works on mounted filesystems and accepts only\n"
error("resize works on mounted filesystems and accepts only\n"
"directories as argument. Passing file containing a btrfs image\n" "directories as argument. Passing file containing a btrfs image\n"
"would resize the underlying filesystem instead of the image.\n"); "would resize the underlying filesystem instead of the image.\n");
}
return 1; return 1;
} }
fd = btrfs_open_dir(path, &dirstream, 1);
if (fd < 0)
return 1;
ret = check_running_fs_exclop(fd, BTRFS_EXCLOP_RESIZE, enqueue); ret = check_running_fs_exclop(fd, BTRFS_EXCLOP_RESIZE, enqueue);
if (ret != 0) { if (ret != 0) {
if (ret < 0) if (ret < 0)

View File

@ -184,16 +184,6 @@ int btrfs_open(const char *path, DIR **dirstream, int verbose, int dir_only)
struct stat st; struct stat st;
int ret; int ret;
if (statfs(path, &stfs) != 0) {
error_on(verbose, "cannot access '%s': %m", path);
return -1;
}
if (stfs.f_type != BTRFS_SUPER_MAGIC) {
error_on(verbose, "not a btrfs filesystem: %s", path);
return -2;
}
if (stat(path, &st) != 0) { if (stat(path, &st) != 0) {
error_on(verbose, "cannot access '%s': %m", path); error_on(verbose, "cannot access '%s': %m", path);
return -1; return -1;
@ -204,6 +194,16 @@ int btrfs_open(const char *path, DIR **dirstream, int verbose, int dir_only)
return -3; return -3;
} }
if (statfs(path, &stfs) != 0) {
error_on(verbose, "cannot access '%s': %m", path);
return -1;
}
if (stfs.f_type != BTRFS_SUPER_MAGIC) {
error_on(verbose, "not a btrfs filesystem: %s", path);
return -2;
}
ret = open_file_or_dir(path, dirstream); ret = open_file_or_dir(path, dirstream);
if (ret < 0) { if (ret < 0) {
error_on(verbose, "cannot access '%s': %m", path); error_on(verbose, "cannot access '%s': %m", path);