X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=cmds-fi-du.c;h=8a44665cee3b515dc92d881746ca665d7dea95ee;hb=0a0a03554aaf56a6e7245e74fa7d8b3c53f1c20f;hp=895c242e821c7a699ef0a34f8563d9a1c538f65c;hpb=cf8fd1a70884db0b31e312d0780611f262bb9b45;p=platform%2Fupstream%2Fbtrfs-progs.git diff --git a/cmds-fi-du.c b/cmds-fi-du.c index 895c242..8a44665 100644 --- a/cmds-fi-du.c +++ b/cmds-fi-du.c @@ -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,