]> code.ossystems Code Review - openembedded-core.git/blob
e7e3fae332ae6e84a70826cb543efd213af3d808
[openembedded-core.git] /
1 Upstream-Status: Inappropriate [Backport]
2 From b3007332100e01ca84c161b6c75f0a414ab4611b Mon Sep 17 00:00:00 2001
3 From: Goffredo Baroncelli <kreijack@libero.it>
4 Date: Mon, 20 Dec 2010 20:06:19 +0000
5 Subject: [PATCH 05/15] Improve error handling in the btrfs command
6
7 Hi Chris,
8
9 below is enclosed a trivial patch, which has the aim to improve the error
10 reporting of the "btrfs" command.
11
12 You can pull from
13
14         http://cassiopea.homelinux.net/git/btrfs-progs-unstable.git
15
16 branch
17
18         strerror
19
20 I changed every printf("some-error") to something like:
21
22         e = errno;
23         fprintf(stderr, "ERROR: .... - %s", strerror(e));
24
25 so:
26
27 1) all the error are reported to standard error
28 2) At the end of the message is printed the error as returned by the system.
29
30 The change is quite simple, I replaced every printf("some-error") to the line
31 above. I don't touched anything other.
32 I also integrated a missing "printf" on the basis of the Ben patch.
33
34 This patch leads the btrfs command to be more "user friendly" :-)
35
36 Regards
37 G.Baroncelli
38
39  btrfs-list.c |   40 ++++++++++++++++++++++--------
40  btrfs_cmds.c |   77 ++++++++++++++++++++++++++++++++++++++++-----------------
41  utils.c      |    6 ++++
42  3 files changed, 89 insertions(+), 34 deletions(-)
43
44 Signed-off-by: Chris Mason <chris.mason@oracle.com>
45 ---
46  btrfs-list.c |   40 ++++++++++++++++++++++--------
47  btrfs_cmds.c |   77 ++++++++++++++++++++++++++++++++++++++++-----------------
48  utils.c      |    6 ++++
49  3 files changed, 89 insertions(+), 34 deletions(-)
50
51 diff --git a/btrfs-list.c b/btrfs-list.c
52 index 93766a8..abcc2f4 100644
53 --- a/btrfs-list.c
54 +++ b/btrfs-list.c
55 @@ -265,7 +265,7 @@ static int resolve_root(struct root_lookup *rl, struct root_info *ri)
56  static int lookup_ino_path(int fd, struct root_info *ri)
57  {
58         struct btrfs_ioctl_ino_lookup_args args;
59 -       int ret;
60 +       int ret, e;
61  
62         if (ri->path)
63                 return 0;
64 @@ -275,9 +275,11 @@ static int lookup_ino_path(int fd, struct root_info *ri)
65         args.objectid = ri->dir_id;
66  
67         ret = ioctl(fd, BTRFS_IOC_INO_LOOKUP, &args);
68 +       e = errno;
69         if (ret) {
70 -               fprintf(stderr, "ERROR: Failed to lookup path for root %llu\n",
71 -                       (unsigned long long)ri->ref_tree);
72 +               fprintf(stderr, "ERROR: Failed to lookup path for root %llu - %s\n",
73 +                       (unsigned long long)ri->ref_tree,
74 +                       strerror(e));
75                 return ret;
76         }
77  
78 @@ -320,15 +322,18 @@ static u64 find_root_gen(int fd)
79         unsigned long off = 0;
80         u64 max_found = 0;
81         int i;
82 +       int e;
83  
84         memset(&ino_args, 0, sizeof(ino_args));
85         ino_args.objectid = BTRFS_FIRST_FREE_OBJECTID;
86  
87         /* this ioctl fills in ino_args->treeid */
88         ret = ioctl(fd, BTRFS_IOC_INO_LOOKUP, &ino_args);
89 +       e = errno;
90         if (ret) {
91 -               fprintf(stderr, "ERROR: Failed to lookup path for dirid %llu\n",
92 -                       (unsigned long long)BTRFS_FIRST_FREE_OBJECTID);
93 +               fprintf(stderr, "ERROR: Failed to lookup path for dirid %llu - %s\n",
94 +                       (unsigned long long)BTRFS_FIRST_FREE_OBJECTID,
95 +                       strerror(e));
96                 return 0;
97         }
98  
99 @@ -351,8 +356,10 @@ static u64 find_root_gen(int fd)
100  
101         while (1) {
102                 ret = ioctl(fd, BTRFS_IOC_TREE_SEARCH, &args);
103 +               e = errno;
104                 if (ret < 0) {
105 -                       fprintf(stderr, "ERROR: can't perform the search\n");
106 +                       fprintf(stderr, "ERROR: can't perform the search - %s\n",
107 +                               strerror(e));
108                         return 0;
109                 }
110                 /* the ioctl returns the number of item it found in nr_items */
111 @@ -407,14 +414,16 @@ static char *__ino_resolve(int fd, u64 dirid)
112         struct btrfs_ioctl_ino_lookup_args args;
113         int ret;
114         char *full;
115 +       int e;
116  
117         memset(&args, 0, sizeof(args));
118         args.objectid = dirid;
119  
120         ret = ioctl(fd, BTRFS_IOC_INO_LOOKUP, &args);
121 +       e = errno;
122         if (ret) {
123 -               fprintf(stderr, "ERROR: Failed to lookup path for dirid %llu\n",
124 -                       (unsigned long long)dirid);
125 +               fprintf(stderr, "ERROR: Failed to lookup path for dirid %llu - %s\n",
126 +                       (unsigned long long)dirid, strerror(e) );
127                 return ERR_PTR(ret);
128         }
129  
130 @@ -472,6 +481,7 @@ static char *ino_resolve(int fd, u64 ino, u64 *cache_dirid, char **cache_name)
131         struct btrfs_ioctl_search_header *sh;
132         unsigned long off = 0;
133         int namelen;
134 +       int e;
135  
136         memset(&args, 0, sizeof(args));
137  
138 @@ -490,8 +500,10 @@ static char *ino_resolve(int fd, u64 ino, u64 *cache_dirid, char **cache_name)
139         sk->nr_items = 1;
140  
141         ret = ioctl(fd, BTRFS_IOC_TREE_SEARCH, &args);
142 +       e = errno;
143         if (ret < 0) {
144 -               fprintf(stderr, "ERROR: can't perform the search\n");
145 +               fprintf(stderr, "ERROR: can't perform the search - %s\n",
146 +                       strerror(e));
147                 return NULL;
148         }
149         /* the ioctl returns the number of item it found in nr_items */
150 @@ -550,6 +562,7 @@ int list_subvols(int fd)
151         char *name;
152         u64 dir_id;
153         int i;
154 +       int e;
155  
156         root_lookup_init(&root_lookup);
157  
158 @@ -578,8 +591,10 @@ int list_subvols(int fd)
159  
160         while(1) {
161                 ret = ioctl(fd, BTRFS_IOC_TREE_SEARCH, &args);
162 +               e = errno;
163                 if (ret < 0) {
164 -                       fprintf(stderr, "ERROR: can't perform the search\n");
165 +                       fprintf(stderr, "ERROR: can't perform the search - %s\n",
166 +                               strerror(e));
167                         return ret;
168                 }
169                 /* the ioctl returns the number of item it found in nr_items */
170 @@ -747,6 +762,7 @@ int find_updated_files(int fd, u64 root_id, u64 oldest_gen)
171         u64 found_gen;
172         u64 max_found = 0;
173         int i;
174 +       int e;
175         u64 cache_dirid = 0;
176         u64 cache_ino = 0;
177         char *cache_dir_name = NULL;
178 @@ -773,8 +789,10 @@ int find_updated_files(int fd, u64 root_id, u64 oldest_gen)
179         max_found = find_root_gen(fd);
180         while(1) {
181                 ret = ioctl(fd, BTRFS_IOC_TREE_SEARCH, &args);
182 +               e = errno;
183                 if (ret < 0) {
184 -                       fprintf(stderr, "ERROR: can't perform the search\n");
185 +                       fprintf(stderr, "ERROR: can't perform the search- %s\n",
186 +                               strerror(e));
187                         return ret;
188                 }
189                 /* the ioctl returns the number of item it found in nr_items */
190 diff --git a/btrfs_cmds.c b/btrfs_cmds.c
191 index fffb423..775bfe1 100644
192 --- a/btrfs_cmds.c
193 +++ b/btrfs_cmds.c
194 @@ -156,6 +156,7 @@ int do_defrag(int ac, char **av)
195         int verbose = 0;
196         int fancy_ioctl = 0;
197         struct btrfs_ioctl_defrag_range_args range;
198 +       int e=0;
199  
200         optind = 1;
201         while(1) {
202 @@ -219,19 +220,21 @@ int do_defrag(int ac, char **av)
203                 }
204                 if (!fancy_ioctl) {
205                         ret = ioctl(fd, BTRFS_IOC_DEFRAG, NULL);
206 +                       e=errno;
207                 } else {
208                         ret = ioctl(fd, BTRFS_IOC_DEFRAG_RANGE, &range);
209                         if (ret && errno == ENOTTY) {
210 -                               fprintf(stderr, "defrag range ioctl not "
211 +                               fprintf(stderr, "ERROR: defrag range ioctl not "
212                                         "supported in this kernel, please try "
213                                         "without any options.\n");
214                                 errors++;
215 +                               close(fd);
216                                 break;
217                         }
218                 }
219                 if (ret) {
220 -                       fprintf(stderr, "ioctl failed on %s ret %d errno %d\n",
221 -                               av[i], ret, errno);
222 +                       fprintf(stderr, "ERROR: defrag failed on %s - %s\n",
223 +                               av[i], strerror(e));
224                         errors++;
225                 }
226                 close(fd);
227 @@ -310,7 +313,7 @@ int do_subvol_list(int argc, char **argv)
228  int do_clone(int argc, char **argv)
229  {
230         char    *subvol, *dst;
231 -       int     res, fd, fddst, len;
232 +       int     res, fd, fddst, len, e;
233         char    *newname;
234         char    *dstdir;
235  
236 @@ -377,12 +380,14 @@ int do_clone(int argc, char **argv)
237         args.fd = fd;
238         strncpy(args.name, newname, BTRFS_PATH_NAME_MAX);
239         res = ioctl(fddst, BTRFS_IOC_SNAP_CREATE, &args);
240 +       e = errno;
241  
242         close(fd);
243         close(fddst);
244  
245         if(res < 0 ){
246 -               fprintf( stderr, "ERROR: cannot snapshot '%s'\n",subvol);
247 +               fprintf( stderr, "ERROR: cannot snapshot '%s' - %s\n",
248 +                       subvol, strerror(e));
249                 return 11;
250         }
251  
252 @@ -392,7 +397,7 @@ int do_clone(int argc, char **argv)
253  
254  int do_delete_subvolume(int argc, char **argv)
255  {
256 -       int     res, fd, len;
257 +       int     res, fd, len, e;
258         struct btrfs_ioctl_vol_args     args;
259         char    *dname, *vname, *cpath;
260         char    *path = argv[1];
261 @@ -438,11 +443,13 @@ int do_delete_subvolume(int argc, char **argv)
262         printf("Delete subvolume '%s/%s'\n", dname, vname);
263         strncpy(args.name, vname, BTRFS_PATH_NAME_MAX);
264         res = ioctl(fd, BTRFS_IOC_SNAP_DESTROY, &args);
265 +       e = errno;
266  
267         close(fd);
268  
269         if(res < 0 ){
270 -               fprintf( stderr, "ERROR: cannot delete '%s/%s'\n",dname, vname);
271 +               fprintf( stderr, "ERROR: cannot delete '%s/%s' - %s\n",
272 +                       dname, vname, strerror(e));
273                 return 11;
274         }
275  
276 @@ -452,7 +459,7 @@ int do_delete_subvolume(int argc, char **argv)
277  
278  int do_create_subvol(int argc, char **argv)
279  {
280 -       int     res, fddst, len;
281 +       int     res, fddst, len, e;
282         char    *newname;
283         char    *dstdir;
284         struct btrfs_ioctl_vol_args     args;
285 @@ -492,11 +499,13 @@ int do_create_subvol(int argc, char **argv)
286         printf("Create subvolume '%s/%s'\n", dstdir, newname);
287         strncpy(args.name, newname, BTRFS_PATH_NAME_MAX);
288         res = ioctl(fddst, BTRFS_IOC_SUBVOL_CREATE, &args);
289 +       e = errno;
290  
291         close(fddst);
292  
293         if(res < 0 ){
294 -               fprintf( stderr, "ERROR: cannot create subvolume\n");
295 +               fprintf( stderr, "ERROR: cannot create subvolume - %s\n",
296 +                       strerror(e));
297                 return 11;
298         }
299  
300 @@ -506,7 +515,7 @@ int do_create_subvol(int argc, char **argv)
301  
302  int do_fssync(int argc, char **argv)
303  {
304 -       int fd, res;
305 +       int     fd, res, e;
306         char    *path = argv[1];
307  
308         fd = open_file_or_dir(path);
309 @@ -517,9 +526,11 @@ int do_fssync(int argc, char **argv)
310  
311         printf("FSSync '%s'\n", path);
312         res = ioctl(fd, BTRFS_IOC_SYNC);
313 +       e = errno;
314         close(fd);
315         if( res < 0 ){
316 -               fprintf(stderr, "ERROR: unable to fs-syncing '%s'\n", path);
317 +               fprintf(stderr, "ERROR: unable to fs-syncing '%s' - %s\n", 
318 +                       path, strerror(e));
319                 return 16;
320         }
321  
322 @@ -528,7 +539,7 @@ int do_fssync(int argc, char **argv)
323  
324  int do_scan(int argc, char **argv)
325  {
326 -       int     i, fd;
327 +       int     i, fd, e;
328         if(argc<=1){
329                 int ret;
330  
331 @@ -560,10 +571,12 @@ int do_scan(int argc, char **argv)
332                  * a btrfs filesystem from an I/O error !!!
333                  */
334                 ret = ioctl(fd, BTRFS_IOC_SCAN_DEV, &args);
335 +               e = errno;
336  
337                 if( ret < 0 ){
338                         close(fd);
339 -                       fprintf(stderr, "ERROR: unable to scan the device '%s'\n", argv[i]);
340 +                       fprintf(stderr, "ERROR: unable to scan the device '%s' - %s\n", 
341 +                               argv[i], strerror(e));
342                         return 11;
343                 }
344         }
345 @@ -577,7 +590,7 @@ int do_resize(int argc, char **argv)
346  {
347  
348         struct btrfs_ioctl_vol_args     args;
349 -       int     fd, res, len;
350 +       int     fd, res, len, e;
351         char    *amount=argv[1], *path=argv[2];
352  
353         fd = open_file_or_dir(path);
354 @@ -595,9 +608,11 @@ int do_resize(int argc, char **argv)
355         printf("Resize '%s' of '%s'\n", path, amount);
356         strncpy(args.name, amount, BTRFS_PATH_NAME_MAX);
357         res = ioctl(fd, BTRFS_IOC_RESIZE, &args);
358 +       e = errno;
359         close(fd);
360         if( res < 0 ){
361 -               fprintf(stderr, "ERROR: unable to resize '%s'\n", path);
362 +               fprintf(stderr, "ERROR: unable to resize '%s' - %s\n", 
363 +                       path, strerror(e));
364                 return 30;
365         }
366         return 0;
367 @@ -691,7 +706,7 @@ int do_add_volume(int nargs, char **args)
368  {
369  
370         char    *mntpnt = args[nargs-1];
371 -       int     i, fdmnt, ret=0;
372 +       int     i, fdmnt, ret=0, e;
373  
374  
375         fdmnt = open_file_or_dir(mntpnt);
376 @@ -738,8 +753,10 @@ int do_add_volume(int nargs, char **args)
377  
378                 strncpy(ioctl_args.name, args[i], BTRFS_PATH_NAME_MAX);
379                 res = ioctl(fdmnt, BTRFS_IOC_ADD_DEV, &ioctl_args);
380 +               e = errno;
381                 if(res<0){
382 -                       fprintf(stderr, "ERROR: error adding the device '%s'\n", args[i]);
383 +                       fprintf(stderr, "ERROR: error adding the device '%s' - %s\n", 
384 +                               args[i], strerror(e));
385                         ret++;
386                 }
387  
388 @@ -756,7 +773,7 @@ int do_add_volume(int nargs, char **args)
389  int do_balance(int argc, char **argv)
390  {
391  
392 -       int     fdmnt, ret=0;
393 +       int     fdmnt, ret=0, e;
394         struct btrfs_ioctl_vol_args args;
395         char    *path = argv[1];
396  
397 @@ -768,9 +785,11 @@ int do_balance(int argc, char **argv)
398  
399         memset(&args, 0, sizeof(args));
400         ret = ioctl(fdmnt, BTRFS_IOC_BALANCE, &args);
401 +       e = errno;
402         close(fdmnt);
403         if(ret<0){
404 -               fprintf(stderr, "ERROR: balancing '%s'\n", path);
405 +               fprintf(stderr, "ERROR: error during balancing '%s' - %s\n", 
406 +                       path, strerror(e));
407  
408                 return 19;
409         }
410 @@ -780,7 +799,7 @@ int do_remove_volume(int nargs, char **args)
411  {
412  
413         char    *mntpnt = args[nargs-1];
414 -       int     i, fdmnt, ret=0;
415 +       int     i, fdmnt, ret=0, e;
416  
417         fdmnt = open_file_or_dir(mntpnt);
418         if (fdmnt < 0) {
419 @@ -794,8 +813,10 @@ int do_remove_volume(int nargs, char **args)
420  
421                 strncpy(arg.name, args[i], BTRFS_PATH_NAME_MAX);
422                 res = ioctl(fdmnt, BTRFS_IOC_RM_DEV, &arg);
423 +               e = errno;
424                 if(res<0){
425 -                       fprintf(stderr, "ERROR: error removing the device '%s'\n", args[i]);
426 +                       fprintf(stderr, "ERROR: error removing the device '%s' - %s\n", 
427 +                               args[i], strerror(e));
428                         ret++;
429                 }
430         }
431 @@ -809,7 +830,7 @@ int do_remove_volume(int nargs, char **args)
432  
433  int do_set_default_subvol(int nargs, char **argv)
434  {
435 -       int     ret=0, fd;
436 +       int     ret=0, fd, e;
437         u64     objectid;
438         char    *path = argv[2];
439         char    *subvolid = argv[1];
440 @@ -826,9 +847,11 @@ int do_set_default_subvol(int nargs, char **argv)
441                 return 30;
442         }
443         ret = ioctl(fd, BTRFS_IOC_DEFAULT_SUBVOL, &objectid);
444 +       e = errno;
445         close(fd);
446         if( ret < 0 ){
447 -               fprintf(stderr, "ERROR: unable to set a new default subvolume\n");
448 +               fprintf(stderr, "ERROR: unable to set a new default subvolume - %s\n",
449 +                       strerror(e));
450                 return 30;
451         }
452         return 0;
453 @@ -840,6 +863,7 @@ int do_df_filesystem(int nargs, char **argv)
454         u64 count = 0, i;
455         int ret;
456         int fd;
457 +       int e;
458         char *path = argv[1];
459  
460         fd = open_file_or_dir(path);
461 @@ -856,7 +880,10 @@ int do_df_filesystem(int nargs, char **argv)
462         sargs->total_spaces = 0;
463  
464         ret = ioctl(fd, BTRFS_IOC_SPACE_INFO, sargs);
465 +       e = errno;
466         if (ret) {
467 +               fprintf(stderr, "ERROR: couldn't get space info on '%s' - %s\n",
468 +                       path, strerror(e));
469                 free(sargs);
470                 return ret;
471         }
472 @@ -874,7 +901,11 @@ int do_df_filesystem(int nargs, char **argv)
473         sargs->total_spaces = 0;
474  
475         ret = ioctl(fd, BTRFS_IOC_SPACE_INFO, sargs);
476 +       e = errno;
477         if (ret) {
478 +               fprintf(stderr, "ERROR: couldn't get space info on '%s' - %s\n",
479 +                       path, strerror(e));
480 +               close(fd);
481                 free(sargs);
482                 return ret;
483         }
484 diff --git a/utils.c b/utils.c
485 index d8c3dcc..2a15d86 100644
486 --- a/utils.c
487 +++ b/utils.c
488 @@ -821,6 +821,7 @@ void btrfs_register_one_device(char *fname)
489         struct btrfs_ioctl_vol_args args;
490         int fd;
491         int ret;
492 +       int e;
493  
494         fd = open("/dev/btrfs-control", O_RDONLY);
495         if (fd < 0) {
496 @@ -830,6 +831,11 @@ void btrfs_register_one_device(char *fname)
497         }
498         strncpy(args.name, fname, BTRFS_PATH_NAME_MAX);
499         ret = ioctl(fd, BTRFS_IOC_SCAN_DEV, &args);
500 +       e = errno;
501 +       if(ret<0){
502 +               fprintf(stderr, "ERROR: unable to scan the device '%s' - %s\n",
503 +                       fname, strerror(e));
504 +       }
505         close(fd);
506  }
507  
508 -- 
509 1.7.2.3
510