Goffredo - This is missing a S-o-B, and is damaged with line-wrapping. If you fix it up and re-send, I can pull into my integration branch so it doesn't get forgotten...
Hugo. On Sun, Dec 05, 2010 at 06:47:38PM +0100, Goffredo Baroncelli wrote: > Hi all, > > this patch makes the command "btrfs" more verbose when a btrfs ioctl return > an > error. The error code is printed as text message by the strerror(errno) > function. > > Example: > > # btrfs subvol create /tmp/1 > Create subvolume '/tmp/1' > # btrfs subvol create /tmp/1/2 > Create subvolume '/tmp/1/2' > # btrfs subvol delete > $ sudo btrfs subvol delete /tmp/1 > Delete subvolume '/tmp/1' > ERROR: cannot delete '/tmp/1' - Directory not empty > > You can pull the patch also from > http://cassiopea.homelinux.net/git/btrfs-progs-unstable.git > branch > strerror > > Comments are welcome. > > Reagrds > G.Baroncelli > > diff --git a/btrfs-list.c b/btrfs-list.c > index 93766a8..abcc2f4 100644 > --- a/btrfs-list.c > +++ b/btrfs-list.c > @@ -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 > */ > diff --git a/btrfs_cmds.c b/btrfs_cmds.c > index 8031c58..3765a10 100644 > --- a/btrfs_cmds.c > +++ b/btrfs_cmds.c > @@ -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; > strcpy(args.name, newname); > 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); > strcpy(args.name, vname); > 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); > strcpy(args.name, newname); > 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); > strcpy(args.name, amount); > 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) > > strcpy(ioctl_args.name, args[i]); > 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) > > strcpy(arg.name, args[i]); > 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); > @@ -874,7 +898,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 - %s\n", > + strerror(e)); > + close(fd); > free(sargs); > return ret; > } > diff --git a/utils.c b/utils.c > index fd894f3..3e22403 100644 > --- 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) > } > strcpy(args.name, fname); > 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); > } > > > > > -- === Hugo Mills: hugo@... carfax.org.uk | darksatanic.net | lug.org.uk === PGP key: 515C238D from wwwkeys.eu.pgp.net or http://www.carfax.org.uk --- My doctor tells me that I have a malformed public-duty gland, --- and a natural deficiency in moral fibre.
signature.asc
Description: Digital signature