btrfs-progs: mkfs: add uuid and otime to ROOT_ITEM of, FS_TREE
[platform/upstream/btrfs-progs.git] / cmds-fi-du.c
index 895c242..8a44665 100644 (file)
@@ -40,6 +40,8 @@
 #include "rbtree.h"
 
 #include "interval_tree_generic.h"
+#include "help.h"
+#include "fsfeatures.h"
 
 static int summarize = 0;
 static unsigned unit_mode = UNITS_RAW;
@@ -116,7 +118,7 @@ static void cleanup_shared_extents(struct rb_root *root)
        }
 }
 
-#define dprintf(...)
+#define dbgprintf(...)
 
 /*
  * Find all extents which overlap 'n', calculate the space
@@ -128,7 +130,7 @@ static u64 count_unique_bytes(struct rb_root *root, struct shared_extent *n)
        u64 wstart = n->start;
        u64 wlast = n->last;
 
-       dprintf("Count overlaps:");
+       dbgprintf("Count overlaps:");
 
        do {
                /*
@@ -141,7 +143,7 @@ static u64 count_unique_bytes(struct rb_root *root, struct shared_extent *n)
                if (wlast < n->last)
                        wlast = n->last;
 
-               dprintf(" (%llu, %llu)", n->start, n->last);
+               dbgprintf(" (%llu, %llu)", n->start, n->last);
 
                tmp = n;
                n = extent_tree_iter_next(n, wstart, wlast);
@@ -150,7 +152,7 @@ static u64 count_unique_bytes(struct rb_root *root, struct shared_extent *n)
                free(tmp);
        } while (n);
 
-       dprintf("; wstart: %llu wlast: %llu total: %llu\n", wstart,
+       dbgprintf("; wstart: %llu wlast: %llu total: %llu\n", wstart,
                wlast, wlast - wstart + 1);
 
        return wlast - wstart + 1;
@@ -401,6 +403,7 @@ static int du_walk_dir(struct du_dir_ctxt *ctxt, struct rb_root *shared_extents)
                                                  shared_extents, &tot, &shr,
                                                  0);
                                if (ret == -ENOTTY) {
+                                       ret = 0;
                                        continue;
                                } else if (ret) {
                                        fprintf(stderr,
@@ -430,7 +433,6 @@ static int du_add_file(const char *filename, int dirfd,
        u64 file_total = 0;
        u64 file_shared = 0;
        u64 dir_set_shared = 0;
-       u64 subvol;
        int fd;
        DIR *dirstream = NULL;
 
@@ -459,16 +461,24 @@ static int du_add_file(const char *filename, int dirfd,
                goto out;
        }
 
-       ret = lookup_ino_rootid(fd, &subvol);
-       if (ret)
-               goto out_close;
+       /*
+        * If st.st_ino == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID ==2, there is no any
+        * related tree
+        */
+       if (st.st_ino != BTRFS_EMPTY_SUBVOL_DIR_OBJECTID) {
+               u64 subvol;
 
-       if (inode_seen(st.st_ino, subvol))
-               goto out_close;
+               ret = lookup_path_rootid(fd, &subvol);
+               if (ret)
+                       goto out_close;
 
-       ret = mark_inode_seen(st.st_ino, subvol);
-       if (ret)
-               goto out_close;
+               if (inode_seen(st.st_ino, subvol))
+                       goto out_close;
+
+               ret = mark_inode_seen(st.st_ino, subvol);
+               if (ret)
+                       goto out_close;
+       }
 
        if (S_ISREG(st.st_mode)) {
                ret = du_calc_file_space(fd, shared_extents, &file_total,