From: Goffredo Baroncelli <kreij...@inwind.it> When ino = BTRFS_EMPTY_SUBVOL_DIR_OBJECTID, the item is not referred to any file-tree. So lookup_path_rootid() doesn't return any sensate value.
Signed-off-by: Goffredo Baroncelli <kreij...@inwind.it> --- cmds-fi-du.c | 25 ++++++++++++++++--------- ctree.h | 2 ++ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/cmds-fi-du.c b/cmds-fi-du.c index 4bf6af3e..013f8dfd 100644 --- a/cmds-fi-du.c +++ b/cmds-fi-du.c @@ -433,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; @@ -462,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; + /* + * 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, diff --git a/ctree.h b/ctree.h index 48ae8903..2fc67b06 100644 --- a/ctree.h +++ b/ctree.h @@ -138,6 +138,8 @@ struct btrfs_free_space_ctl; */ #define BTRFS_DEV_ITEMS_OBJECTID 1ULL +#define BTRFS_EMPTY_SUBVOL_DIR_OBJECTID 2 + /* * the max metadata block size. This limit is somewhat artificial, * but the memmove costs go through the roof for larger blocks. -- 2.14.1 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html