mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/kdave/btrfs-progs.git
synced 2024-12-12 21:53:43 +08:00
Improve error handling in the btrfs command
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>
This commit is contained in:
parent
0646719841
commit
17cf679fb3
40
btrfs-list.c
40
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 */
|
||||
|
77
btrfs_cmds.c
77
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;
|
||||
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;
|
||||
}
|
||||
|
6
utils.c
6
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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user