summaryrefslogtreecommitdiff
path: root/cmds-fi-du.c
diff options
context:
space:
mode:
Diffstat (limited to 'cmds-fi-du.c')
-rw-r--r--cmds-fi-du.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/cmds-fi-du.c b/cmds-fi-du.c
index f106f45b..8a44665c 100644
--- a/cmds-fi-du.c
+++ b/cmds-fi-du.c
@@ -403,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,
@@ -432,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;
@@ -461,16 +461,24 @@ static int du_add_file(const char *filename, int dirfd,
goto out;
}
- ret = lookup_path_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,