Improve error handling in the btrfs command
authorGoffredo Baroncelli <kreijack@libero.it>
Mon, 20 Dec 2010 20:06:19 +0000 (20:06 +0000)
committerChris Mason <chris.mason@oracle.com>
Tue, 25 Oct 2011 13:18:31 +0000 (09:18 -0400)
Hi Chris,

below is enclosed a trivial patch, which has the aim to improve the error
reporting of the "btrfs" command.

You can pull from

http://cassiopea.homelinux.net/git/btrfs-progs-unstable.git

branch

strerror

I changed every printf("some-error") to something like:

e = errno;
fprintf(stderr, "ERROR: .... - %s", strerror(e));

so:

1) all the error are reported to standard error
2) At the end of the message is printed the error as returned by the system.

The change is quite simple, I replaced every printf("some-error") to the line
above. I don't touched anything other.
I also integrated a missing "printf" on the basis of the Ben patch.

This patch leads the btrfs command to be more "user friendly" :-)

Regards
G.Baroncelli

 btrfs-list.c |   40 ++++++++++++++++++++++--------
 btrfs_cmds.c |   77 ++++++++++++++++++++++++++++++++++++++++-----------------
 utils.c      |    6 ++++
 3 files changed, 89 insertions(+), 34 deletions(-)

Signed-off-by: Chris Mason <chris.mason@oracle.com>
btrfs-list.c
btrfs_cmds.c
utils.c

index 93766a8..abcc2f4 100644 (file)
@@ -265,7 +265,7 @@ static int resolve_root(struct root_lookup *rl, struct root_info *ri)
 static int lookup_ino_path(int fd, struct root_info *ri)
 {
        struct btrfs_ioctl_ino_lookup_args args;
-       int ret;
+       int ret, e;
 
        if (ri->path)
                return 0;
@@ -275,9 +275,11 @@ static int lookup_ino_path(int fd, struct root_info *ri)
        args.objectid = ri->dir_id;
 
        ret = ioctl(fd, BTRFS_IOC_INO_LOOKUP, &args);
+       e = errno;
        if (ret) {
-               fprintf(stderr, "ERROR: Failed to lookup path for root %llu\n",
-                       (unsigned long long)ri->ref_tree);
+               fprintf(stderr, "ERROR: Failed to lookup path for root %llu - %s\n",
+                       (unsigned long long)ri->ref_tree,
+                       strerror(e));
                return ret;
        }
 
@@ -320,15 +322,18 @@ static u64 find_root_gen(int fd)
        unsigned long off = 0;
        u64 max_found = 0;
        int i;
+       int e;
 
        memset(&ino_args, 0, sizeof(ino_args));
        ino_args.objectid = BTRFS_FIRST_FREE_OBJECTID;
 
        /* this ioctl fills in ino_args->treeid */
        ret = ioctl(fd, BTRFS_IOC_INO_LOOKUP, &ino_args);
+       e = errno;
        if (ret) {
-               fprintf(stderr, "ERROR: Failed to lookup path for dirid %llu\n",
-                       (unsigned long long)BTRFS_FIRST_FREE_OBJECTID);
+               fprintf(stderr, "ERROR: Failed to lookup path for dirid %llu - %s\n",
+                       (unsigned long long)BTRFS_FIRST_FREE_OBJECTID,
+                       strerror(e));
                return 0;
        }
 
@@ -351,8 +356,10 @@ static u64 find_root_gen(int fd)
 
        while (1) {
                ret = ioctl(fd, BTRFS_IOC_TREE_SEARCH, &args);
+               e = errno;
                if (ret < 0) {
-                       fprintf(stderr, "ERROR: can't perform the search\n");
+                       fprintf(stderr, "ERROR: can't perform the search - %s\n",
+                               strerror(e));
                        return 0;
                }
                /* the ioctl returns the number of item it found in nr_items */
@@ -407,14 +414,16 @@ static char *__ino_resolve(int fd, u64 dirid)
        struct btrfs_ioctl_ino_lookup_args args;
        int ret;
        char *full;
+       int e;
 
        memset(&args, 0, sizeof(args));
        args.objectid = dirid;
 
        ret = ioctl(fd, BTRFS_IOC_INO_LOOKUP, &args);
+       e = errno;
        if (ret) {
-               fprintf(stderr, "ERROR: Failed to lookup path for dirid %llu\n",
-                       (unsigned long long)dirid);
+               fprintf(stderr, "ERROR: Failed to lookup path for dirid %llu - %s\n",
+                       (unsigned long long)dirid, strerror(e) );
                return ERR_PTR(ret);
        }
 
@@ -472,6 +481,7 @@ static char *ino_resolve(int fd, u64 ino, u64 *cache_dirid, char **cache_name)
        struct btrfs_ioctl_search_header *sh;
        unsigned long off = 0;
        int namelen;
+       int e;
 
        memset(&args, 0, sizeof(args));
 
@@ -490,8 +500,10 @@ static char *ino_resolve(int fd, u64 ino, u64 *cache_dirid, char **cache_name)
        sk->nr_items = 1;
 
        ret = ioctl(fd, BTRFS_IOC_TREE_SEARCH, &args);
+       e = errno;
        if (ret < 0) {
-               fprintf(stderr, "ERROR: can't perform the search\n");
+               fprintf(stderr, "ERROR: can't perform the search - %s\n",
+                       strerror(e));
                return NULL;
        }
        /* the ioctl returns the number of item it found in nr_items */
@@ -550,6 +562,7 @@ int list_subvols(int fd)
        char *name;
        u64 dir_id;
        int i;
+       int e;
 
        root_lookup_init(&root_lookup);
 
@@ -578,8 +591,10 @@ int list_subvols(int fd)
 
        while(1) {
                ret = ioctl(fd, BTRFS_IOC_TREE_SEARCH, &args);
+               e = errno;
                if (ret < 0) {
-                       fprintf(stderr, "ERROR: can't perform the search\n");
+                       fprintf(stderr, "ERROR: can't perform the search - %s\n",
+                               strerror(e));
                        return ret;
                }
                /* the ioctl returns the number of item it found in nr_items */
@@ -747,6 +762,7 @@ int find_updated_files(int fd, u64 root_id, u64 oldest_gen)
        u64 found_gen;
        u64 max_found = 0;
        int i;
+       int e;
        u64 cache_dirid = 0;
        u64 cache_ino = 0;
        char *cache_dir_name = NULL;
@@ -773,8 +789,10 @@ int find_updated_files(int fd, u64 root_id, u64 oldest_gen)
        max_found = find_root_gen(fd);
        while(1) {
                ret = ioctl(fd, BTRFS_IOC_TREE_SEARCH, &args);
+               e = errno;
                if (ret < 0) {
-                       fprintf(stderr, "ERROR: can't perform the search\n");
+                       fprintf(stderr, "ERROR: can't perform the search- %s\n",
+                               strerror(e));
                        return ret;
                }
                /* the ioctl returns the number of item it found in nr_items */
index fffb423..775bfe1 100644 (file)
@@ -156,6 +156,7 @@ int do_defrag(int ac, char **av)
        int verbose = 0;
        int fancy_ioctl = 0;
        struct btrfs_ioctl_defrag_range_args range;
+       int e=0;
 
        optind = 1;
        while(1) {
@@ -219,19 +220,21 @@ int do_defrag(int ac, char **av)
                }
                if (!fancy_ioctl) {
                        ret = ioctl(fd, BTRFS_IOC_DEFRAG, NULL);
+                       e=errno;
                } else {
                        ret = ioctl(fd, BTRFS_IOC_DEFRAG_RANGE, &range);
                        if (ret && errno == ENOTTY) {
-                               fprintf(stderr, "defrag range ioctl not "
+                               fprintf(stderr, "ERROR: defrag range ioctl not "
                                        "supported in this kernel, please try "
                                        "without any options.\n");
                                errors++;
+                               close(fd);
                                break;
                        }
                }
                if (ret) {
-                       fprintf(stderr, "ioctl failed on %s ret %d errno %d\n",
-                               av[i], ret, errno);
+                       fprintf(stderr, "ERROR: defrag failed on %s - %s\n",
+                               av[i], strerror(e));
                        errors++;
                }
                close(fd);
@@ -310,7 +313,7 @@ int do_subvol_list(int argc, char **argv)
 int do_clone(int argc, char **argv)
 {
        char    *subvol, *dst;
-       int     res, fd, fddst, len;
+       int     res, fd, fddst, len, e;
        char    *newname;
        char    *dstdir;
 
@@ -377,12 +380,14 @@ int do_clone(int argc, char **argv)
        args.fd = fd;
        strncpy(args.name, newname, BTRFS_PATH_NAME_MAX);
        res = ioctl(fddst, BTRFS_IOC_SNAP_CREATE, &args);
+       e = errno;
 
        close(fd);
        close(fddst);
 
        if(res < 0 ){
-               fprintf( stderr, "ERROR: cannot snapshot '%s'\n",subvol);
+               fprintf( stderr, "ERROR: cannot snapshot '%s' - %s\n",
+                       subvol, strerror(e));
                return 11;
        }
 
@@ -392,7 +397,7 @@ int do_clone(int argc, char **argv)
 
 int do_delete_subvolume(int argc, char **argv)
 {
-       int     res, fd, len;
+       int     res, fd, len, e;
        struct btrfs_ioctl_vol_args     args;
        char    *dname, *vname, *cpath;
        char    *path = argv[1];
@@ -438,11 +443,13 @@ int do_delete_subvolume(int argc, char **argv)
        printf("Delete subvolume '%s/%s'\n", dname, vname);
        strncpy(args.name, vname, BTRFS_PATH_NAME_MAX);
        res = ioctl(fd, BTRFS_IOC_SNAP_DESTROY, &args);
+       e = errno;
 
        close(fd);
 
        if(res < 0 ){
-               fprintf( stderr, "ERROR: cannot delete '%s/%s'\n",dname, vname);
+               fprintf( stderr, "ERROR: cannot delete '%s/%s' - %s\n",
+                       dname, vname, strerror(e));
                return 11;
        }
 
@@ -452,7 +459,7 @@ int do_delete_subvolume(int argc, char **argv)
 
 int do_create_subvol(int argc, char **argv)
 {
-       int     res, fddst, len;
+       int     res, fddst, len, e;
        char    *newname;
        char    *dstdir;
        struct btrfs_ioctl_vol_args     args;
@@ -492,11 +499,13 @@ int do_create_subvol(int argc, char **argv)
        printf("Create subvolume '%s/%s'\n", dstdir, newname);
        strncpy(args.name, newname, BTRFS_PATH_NAME_MAX);
        res = ioctl(fddst, BTRFS_IOC_SUBVOL_CREATE, &args);
+       e = errno;
 
        close(fddst);
 
        if(res < 0 ){
-               fprintf( stderr, "ERROR: cannot create subvolume\n");
+               fprintf( stderr, "ERROR: cannot create subvolume - %s\n",
+                       strerror(e));
                return 11;
        }
 
@@ -506,7 +515,7 @@ int do_create_subvol(int argc, char **argv)
 
 int do_fssync(int argc, char **argv)
 {
-       int fd, res;
+       int     fd, res, e;
        char    *path = argv[1];
 
        fd = open_file_or_dir(path);
@@ -517,9 +526,11 @@ int do_fssync(int argc, char **argv)
 
        printf("FSSync '%s'\n", path);
        res = ioctl(fd, BTRFS_IOC_SYNC);
+       e = errno;
        close(fd);
        if( res < 0 ){
-               fprintf(stderr, "ERROR: unable to fs-syncing '%s'\n", path);
+               fprintf(stderr, "ERROR: unable to fs-syncing '%s' - %s\n", 
+                       path, strerror(e));
                return 16;
        }
 
@@ -528,7 +539,7 @@ int do_fssync(int argc, char **argv)
 
 int do_scan(int argc, char **argv)
 {
-       int     i, fd;
+       int     i, fd, e;
        if(argc<=1){
                int ret;
 
@@ -560,10 +571,12 @@ int do_scan(int argc, char **argv)
                 * a btrfs filesystem from an I/O error !!!
                 */
                ret = ioctl(fd, BTRFS_IOC_SCAN_DEV, &args);
+               e = errno;
 
                if( ret < 0 ){
                        close(fd);
-                       fprintf(stderr, "ERROR: unable to scan the device '%s'\n", argv[i]);
+                       fprintf(stderr, "ERROR: unable to scan the device '%s' - %s\n", 
+                               argv[i], strerror(e));
                        return 11;
                }
        }
@@ -577,7 +590,7 @@ int do_resize(int argc, char **argv)
 {
 
        struct btrfs_ioctl_vol_args     args;
-       int     fd, res, len;
+       int     fd, res, len, e;
        char    *amount=argv[1], *path=argv[2];
 
        fd = open_file_or_dir(path);
@@ -595,9 +608,11 @@ int do_resize(int argc, char **argv)
        printf("Resize '%s' of '%s'\n", path, amount);
        strncpy(args.name, amount, BTRFS_PATH_NAME_MAX);
        res = ioctl(fd, BTRFS_IOC_RESIZE, &args);
+       e = errno;
        close(fd);
        if( res < 0 ){
-               fprintf(stderr, "ERROR: unable to resize '%s'\n", path);
+               fprintf(stderr, "ERROR: unable to resize '%s' - %s\n", 
+                       path, strerror(e));
                return 30;
        }
        return 0;
@@ -691,7 +706,7 @@ int do_add_volume(int nargs, char **args)
 {
 
        char    *mntpnt = args[nargs-1];
-       int     i, fdmnt, ret=0;
+       int     i, fdmnt, ret=0, e;
 
 
        fdmnt = open_file_or_dir(mntpnt);
@@ -738,8 +753,10 @@ int do_add_volume(int nargs, char **args)
 
                strncpy(ioctl_args.name, args[i], BTRFS_PATH_NAME_MAX);
                res = ioctl(fdmnt, BTRFS_IOC_ADD_DEV, &ioctl_args);
+               e = errno;
                if(res<0){
-                       fprintf(stderr, "ERROR: error adding the device '%s'\n", args[i]);
+                       fprintf(stderr, "ERROR: error adding the device '%s' - %s\n", 
+                               args[i], strerror(e));
                        ret++;
                }
 
@@ -756,7 +773,7 @@ int do_add_volume(int nargs, char **args)
 int do_balance(int argc, char **argv)
 {
 
-       int     fdmnt, ret=0;
+       int     fdmnt, ret=0, e;
        struct btrfs_ioctl_vol_args args;
        char    *path = argv[1];
 
@@ -768,9 +785,11 @@ int do_balance(int argc, char **argv)
 
        memset(&args, 0, sizeof(args));
        ret = ioctl(fdmnt, BTRFS_IOC_BALANCE, &args);
+       e = errno;
        close(fdmnt);
        if(ret<0){
-               fprintf(stderr, "ERROR: balancing '%s'\n", path);
+               fprintf(stderr, "ERROR: error during balancing '%s' - %s\n", 
+                       path, strerror(e));
 
                return 19;
        }
@@ -780,7 +799,7 @@ int do_remove_volume(int nargs, char **args)
 {
 
        char    *mntpnt = args[nargs-1];
-       int     i, fdmnt, ret=0;
+       int     i, fdmnt, ret=0, e;
 
        fdmnt = open_file_or_dir(mntpnt);
        if (fdmnt < 0) {
@@ -794,8 +813,10 @@ int do_remove_volume(int nargs, char **args)
 
                strncpy(arg.name, args[i], BTRFS_PATH_NAME_MAX);
                res = ioctl(fdmnt, BTRFS_IOC_RM_DEV, &arg);
+               e = errno;
                if(res<0){
-                       fprintf(stderr, "ERROR: error removing the device '%s'\n", args[i]);
+                       fprintf(stderr, "ERROR: error removing the device '%s' - %s\n", 
+                               args[i], strerror(e));
                        ret++;
                }
        }
@@ -809,7 +830,7 @@ int do_remove_volume(int nargs, char **args)
 
 int do_set_default_subvol(int nargs, char **argv)
 {
-       int     ret=0, fd;
+       int     ret=0, fd, e;
        u64     objectid;
        char    *path = argv[2];
        char    *subvolid = argv[1];
@@ -826,9 +847,11 @@ int do_set_default_subvol(int nargs, char **argv)
                return 30;
        }
        ret = ioctl(fd, BTRFS_IOC_DEFAULT_SUBVOL, &objectid);
+       e = errno;
        close(fd);
        if( ret < 0 ){
-               fprintf(stderr, "ERROR: unable to set a new default subvolume\n");
+               fprintf(stderr, "ERROR: unable to set a new default subvolume - %s\n",
+                       strerror(e));
                return 30;
        }
        return 0;
@@ -840,6 +863,7 @@ int do_df_filesystem(int nargs, char **argv)
        u64 count = 0, i;
        int ret;
        int fd;
+       int e;
        char *path = argv[1];
 
        fd = open_file_or_dir(path);
@@ -856,7 +880,10 @@ int do_df_filesystem(int nargs, char **argv)
        sargs->total_spaces = 0;
 
        ret = ioctl(fd, BTRFS_IOC_SPACE_INFO, sargs);
+       e = errno;
        if (ret) {
+               fprintf(stderr, "ERROR: couldn't get space info on '%s' - %s\n",
+                       path, strerror(e));
                free(sargs);
                return ret;
        }
@@ -874,7 +901,11 @@ int do_df_filesystem(int nargs, char **argv)
        sargs->total_spaces = 0;
 
        ret = ioctl(fd, BTRFS_IOC_SPACE_INFO, sargs);
+       e = errno;
        if (ret) {
+               fprintf(stderr, "ERROR: couldn't get space info on '%s' - %s\n",
+                       path, strerror(e));
+               close(fd);
                free(sargs);
                return ret;
        }
diff --git a/utils.c b/utils.c
index d8c3dcc..2a15d86 100644 (file)
--- a/utils.c
+++ b/utils.c
@@ -821,6 +821,7 @@ void btrfs_register_one_device(char *fname)
        struct btrfs_ioctl_vol_args args;
        int fd;
        int ret;
+       int e;
 
        fd = open("/dev/btrfs-control", O_RDONLY);
        if (fd < 0) {
@@ -830,6 +831,11 @@ void btrfs_register_one_device(char *fname)
        }
        strncpy(args.name, fname, BTRFS_PATH_NAME_MAX);
        ret = ioctl(fd, BTRFS_IOC_SCAN_DEV, &args);
+       e = errno;
+       if(ret<0){
+               fprintf(stderr, "ERROR: unable to scan the device '%s' - %s\n",
+                       fname, strerror(e));
+       }
        close(fd);
 }