summaryrefslogtreecommitdiff
path: root/cmds-filesystem.c
diff options
context:
space:
mode:
authorDavid Sterba <dsterba@suse.com>2016-09-20 16:45:36 +0200
committerDavid Sterba <dsterba@suse.com>2016-09-21 11:50:42 +0200
commitd75e061bcd46634cf97559ee43e889d1f21b11b5 (patch)
treefe60542a75c808fedc06bb303baebc0be96523ff /cmds-filesystem.c
parenteccba6261a2060aed34f3a777b5f137afbb96177 (diff)
btrfs-progs: defrag: set errno correctly in the callback
In case defrag fails, the errno is not properly reported everywhere but rather the last value of 'e', which could be 0. Then we get confusing error messages like: ERROR: defrag failed on /path/to/file: Success Reported-by: Adam Mizerski <adam@mizerski.pl> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'cmds-filesystem.c')
-rw-r--r--cmds-filesystem.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/cmds-filesystem.c b/cmds-filesystem.c
index 76ea82ed..90eccf70 100644
--- a/cmds-filesystem.c
+++ b/cmds-filesystem.c
@@ -993,32 +993,35 @@ static int defrag_callback(const char *fpath, const struct stat *sb,
int typeflag, struct FTW *ftwbuf)
{
int ret = 0;
- int e = 0;
+ int err = 0;
int fd = 0;
if ((typeflag == FTW_F) && S_ISREG(sb->st_mode)) {
if (defrag_global_verbose)
printf("%s\n", fpath);
fd = open(fpath, O_RDWR);
- if (fd < 0)
+ if (fd < 0) {
+ err = errno;
goto error;
+ }
ret = do_defrag(fd, defrag_global_fancy_ioctl, &defrag_global_range);
- e = errno;
close(fd);
- if (ret && e == ENOTTY && defrag_global_fancy_ioctl) {
+ if (ret && errno == ENOTTY && defrag_global_fancy_ioctl) {
error("defrag range ioctl not "
"supported in this kernel, please try "
"without any options.");
defrag_global_errors++;
return ENOTTY;
}
- if (ret)
+ if (ret) {
+ err = errno;
goto error;
+ }
}
return 0;
error:
- error("defrag failed on %s: %s", fpath, strerror(e));
+ error("defrag failed on %s: %s", fpath, strerror(err));
defrag_global_errors++;
return 0;
}