btrfs-progs: check: introduce function to check an extent
[platform/upstream/btrfs-progs.git] / cmds-fi-du.c
index 09d4a65..ec8e550 100644 (file)
@@ -83,7 +83,7 @@ static int add_shared_extent(u64 start, u64 len, struct rb_root *root)
 
        sh = calloc(1, sizeof(*sh));
        if (!sh)
-               return ENOMEM;
+               return -ENOMEM;
 
        sh->start = start;
        sh->last = (start + len - 1);
@@ -153,7 +153,7 @@ static u64 count_unique_bytes(struct rb_root *root, struct shared_extent *n)
 
 /*
  * What we want to do here is get a count of shared bytes within the
- * set of extents we have collected. Specifcally, we don't want to
+ * set of extents we have collected. Specifically, we don't want to
  * count any byte more than once, so just adding them up doesn't
  * work.
  *
@@ -233,7 +233,7 @@ static int mark_inode_seen(u64 ino, u64 subvol)
 
        si = calloc(1, sizeof(*si));
        if (!si)
-               return ENOMEM;
+               return -ENOMEM;
 
        si->i_ino = ino;
        si->i_subvol = subvol;
@@ -259,7 +259,7 @@ static int inode_seen(u64 ino, u64 subvol)
                else if (cmp > 0)
                        n = n->rb_right;
                else
-                       return EEXIST;
+                       return -EEXIST;
        }
        return 0;
 }
@@ -308,7 +308,7 @@ static int du_calc_file_space(int fd, struct rb_root *shared_extents,
                fiemap->fm_extent_count = count;
                rc = ioctl(fd, FS_IOC_FIEMAP, (unsigned long) fiemap);
                if (rc < 0) {
-                       ret = errno;
+                       ret = -errno;
                        goto out;
                }
 
@@ -389,8 +389,14 @@ static int du_walk_dir(struct du_dir_ctxt *ctxt, struct rb_root *shared_extents)
                                                  dirfd(dirstream),
                                                  shared_extents, &tot, &shr,
                                                  0);
-                               if (ret)
+                               if (ret == -ENOTTY) {
+                                       continue;
+                               } else if (ret) {
+                                       fprintf(stderr,
+                                               "failed to walk dir/file: %s :%s\n",
+                                               entry->d_name, strerror(-ret));
                                        break;
+                               }
 
                                ctxt->bytes_total += tot;
                                ctxt->bytes_shared += shr;
@@ -418,17 +424,15 @@ static int du_add_file(const char *filename, int dirfd,
        DIR *dirstream = NULL;
 
        ret = fstatat(dirfd, filename, &st, 0);
-       if (ret) {
-               ret = errno;
-               return ret;
-       }
+       if (ret)
+               return -errno;
 
        if (!S_ISREG(st.st_mode) && !S_ISDIR(st.st_mode))
                return 0;
 
        if (len > (path_max - pathp)) {
                error("path too long: %s %s", path, filename);
-               return ENAMETOOLONG;
+               return -ENAMETOOLONG;
        }
 
        pathtmp = pathp;
@@ -438,9 +442,9 @@ static int du_add_file(const char *filename, int dirfd,
                ret = sprintf(pathp, "/%s", filename);
        pathp += ret;
 
-       fd = open_file_or_dir(path, &dirstream);
+       fd = open_file_or_dir3(path, &dirstream, O_RDONLY);
        if (fd < 0) {
-               ret = fd;
+               ret = -errno;
                goto out;
        }
 
@@ -497,15 +501,16 @@ static int du_add_file(const char *filename, int dirfd,
                        if (is_dir)
                                set_shared = dir_set_shared;
 
-                       printf("%s\t%s\t%s\t%s\n",
+                       printf("%10s  %10s  %10s  %s\n",
                               pretty_size_mode(file_total, unit_mode),
                               pretty_size_mode(excl, unit_mode),
                               pretty_size_mode(set_shared, unit_mode),
                               path);
                } else {
-                       printf("%s\t%s\t\t\t%s\n",
+                       printf("%10s  %10s  %10s  %s\n",
                               pretty_size_mode(file_total, unit_mode),
-                              pretty_size_mode(excl, unit_mode), path);
+                              pretty_size_mode(excl, unit_mode),
+                              "-", path);
                }
        }
 
@@ -526,8 +531,8 @@ out:
 const char * const cmd_filesystem_du_usage[] = {
        "btrfs filesystem du [options] <path> [<path>..]",
        "Summarize disk usage of each file.",
+       "-s|--summarize     display only a total for each argument",
        HELPINFO_UNITS_LONG,
-       "-s                 display only a total for each argument",
        NULL
 };
 
@@ -538,7 +543,6 @@ int cmd_filesystem_du(int argc, char **argv)
 
        unit_mode = get_unit_mode_from_arg(&argc, argv, 1);
 
-       optind = 1;
        while (1) {
                static const struct option long_options[] = {
                        { "summarize", no_argument, NULL, 's'},
@@ -560,13 +564,14 @@ int cmd_filesystem_du(int argc, char **argv)
        if (check_argc_min(argc - optind, 1))
                usage(cmd_filesystem_du_usage);
 
-       printf("total\texclusive\tset shared\tfilename\n");
+       printf("%10s  %10s  %10s  %s\n", "Total", "Exclusive", "Set shared",
+                       "Filename");
 
        for (i = optind; i < argc; i++) {
                ret = du_add_file(argv[i], AT_FDCWD, NULL, NULL, NULL, 1);
                if (ret) {
                        error("cannot check space of '%s': %s", argv[i],
-                                       strerror(ret));
+                                       strerror(-ret));
                        err = 1;
                }