Goffredo Baroncelli
2010-Dec-05 17:47 UTC
[PATCH 2/5][REPOST][BTRFS-PROGS] Be more verbose when a ioctl returns an error
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);
}
--
gpg key@ keyserver.linux.it: Goffredo Baroncelli (ghigo)
<kreijack@inwind.it>
Key fingerprint = 4769 7E51 5293 D36C 814E C054 BF04 F161 3DC5 0512
Hugo Mills
2011-Jun-12 21:51 UTC
Re: [PATCH 2/5][REPOST][BTRFS-PROGS] Be more verbose when a ioctl returns an error
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.
Goffredo Baroncelli
2011-Jun-13 16:44 UTC
Re: [PATCH 2/5][REPOST][BTRFS-PROGS] Be more verbose when a ioctl returns an error
Hi Hugo, I tryed to rebase this patch on your repo, but it seem that it was already applied. (see commit b3007332100e01ca84c161b6c75f0a414ab4611b)... Let me know how to proceede Regards G.Baroncelli On 06/12/2011 11:51 PM, Hugo Mills wrote:> 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); >> } >> >> >> >> >> >-- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hugo Mills
2011-Jun-13 16:51 UTC
Re: [PATCH 2/5][REPOST][BTRFS-PROGS] Be more verbose when a ioctl returns an error
Hi, Goffredo, On Mon, Jun 13, 2011 at 06:44:06PM +0200, Goffredo Baroncelli wrote:> I tryed to rebase this patch on your repo, but it seem that it was > already applied. (see commit b3007332100e01ca84c161b6c75f0a414ab4611b)... > > Let me know how to proceedeDon''t worry, then. I saw the three other patches from this series that Chris applied for the tmp branch, but completely missed spotting that this one had also gone in. It''s already applied -- no further work needs to be done. Hugo.> Regards > G.Baroncelli > > On 06/12/2011 11:51 PM, Hugo Mills wrote: > > 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 --- Strive for apathy! ---