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 <nbori...@suse.com>
---
 cmds/filesystem.c | 21 +++++++--------------
 common/utils.c    | 16 ++++++++--------
 2 files changed, 15 insertions(+), 22 deletions(-)

diff --git a/cmds/filesystem.c b/cmds/filesystem.c
index ba2e5928cc02..8379fd7a8151 100644
--- a/cmds/filesystem.c
+++ b/cmds/filesystem.c
@@ -1082,7 +1082,6 @@ static int cmd_filesystem_resize(const struct cmd_struct 
*cmd,
        char    *amount, *path;
        DIR     *dirstream = NULL;
        int ret;
-       struct stat st;
        bool enqueue = false;

        /*
@@ -1115,21 +1114,15 @@ static int cmd_filesystem_resize(const struct 
cmd_struct *cmd,
                return 1;
        }

-       res = stat(path, &st);
-       if (res < 0) {
-               error("resize: cannot stat %s: %m", path);
-               return 1;
-       }
-       if (!S_ISDIR(st.st_mode)) {
-               error("resize works on mounted filesystems and accepts only\n"
-                       "directories as argument. Passing file containing a 
btrfs image\n"
-                       "would resize the underlying filesystem instead of the 
image.\n");
-               return 1;
-       }
-
        fd = btrfs_open_dir(path, &dirstream, 1);
-       if (fd < 0)
+       if (fd < 0) {
+               if (fd == -3) {
+                       error("resize works on mounted filesystems and accepts 
only\n"
+                             "directories as argument. Passing file containing 
a btrfs image\n"
+                             "would resize the underlying filesystem instead 
of the image.\n");
+               }
                return 1;
+       }

        ret = check_running_fs_exclop(fd, BTRFS_EXCLOP_RESIZE, enqueue);
        if (ret != 0) {
diff --git a/common/utils.c b/common/utils.c
index f7dc320c8915..15fda84ed291 100644
--- a/common/utils.c
+++ b/common/utils.c
@@ -185,24 +185,24 @@ int btrfs_open(const char *path, DIR **dirstream, int 
verbose, int dir_only)
        struct stat st;
        int ret;

-       if (statfs(path, &stfs) != 0) {
+       if (stat(path, &st) != 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 (dir_only && !S_ISDIR(st.st_mode)) {
+               error_on(verbose, "not a directory: %s", path);
+               return -3;
        }

-       if (stat(path, &st) != 0) {
+       if (statfs(path, &stfs) != 0) {
                error_on(verbose, "cannot access '%s': %m", path);
                return -1;
        }

-       if (dir_only && !S_ISDIR(st.st_mode)) {
-               error_on(verbose, "not a directory: %s", path);
-               return -3;
+       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);
--
2.25.1

Reply via email to