diff --git a/src/dwarfs/metadata_v2.cpp b/src/dwarfs/metadata_v2.cpp index d9f58457..6a06df82 100644 --- a/src/dwarfs/metadata_v2.cpp +++ b/src/dwarfs/metadata_v2.cpp @@ -588,9 +588,6 @@ void metadata_::dump( os << "modes: " << meta_.modes().size() << std::endl; os << "names: " << meta_.names().size() << std::endl; os << "symlinks: " << meta_.symlinks().size() << std::endl; - // TODO: this isn't useful: - os << "hardlinks: " << std::accumulate(nlinks_.begin(), nlinks_.end(), 0) - << std::endl; if (auto dev = meta_.devices()) { os << "devices: " << dev->size() << std::endl; } @@ -1028,6 +1025,11 @@ int metadata_::statvfs(struct ::statvfs* stbuf) const { stbuf->f_bsize = meta_.block_size(); stbuf->f_frsize = 1UL; stbuf->f_blocks = meta_.total_fs_size(); + if (!options_.enable_nlink) { + if (auto ths = meta_.total_hardlink_size()) { + stbuf->f_blocks += *ths; + } + } stbuf->f_files = inode_count_; stbuf->f_flag = ST_RDONLY; stbuf->f_namemax = PATH_MAX; diff --git a/src/dwarfs/scanner.cpp b/src/dwarfs/scanner.cpp index 6afce64f..05c2e472 100644 --- a/src/dwarfs/scanner.cpp +++ b/src/dwarfs/scanner.cpp @@ -722,6 +722,7 @@ void scanner_::scan(filesystem_writer& fsw, mv2.timestamp_base = ge_data.get_timestamp_base(); mv2.block_size = UINT32_C(1) << cfg_.block_size_bits; mv2.total_fs_size = prog.original_size; + mv2.total_hardlink_size_ref() = prog.hardlink_size; mv2.options_ref() = fsopts; auto [schema, data] = metadata_v2::freeze(mv2); diff --git a/test/dwarfs.cpp b/test/dwarfs.cpp index a05cd9e6..9e7f6501 100644 --- a/test/dwarfs.cpp +++ b/test/dwarfs.cpp @@ -254,7 +254,7 @@ void basic_end_to_end_test(std::string const& compressor, EXPECT_EQ(1 << block_size_bits, vfsbuf.f_bsize); EXPECT_EQ(1, vfsbuf.f_frsize); - EXPECT_EQ(2056934, vfsbuf.f_blocks); + EXPECT_EQ(enable_nlink ? 2056934 : 2080390, vfsbuf.f_blocks); EXPECT_EQ(9 + 2 * with_devices + with_specials, vfsbuf.f_files); EXPECT_EQ(ST_RDONLY, vfsbuf.f_flag); EXPECT_GT(vfsbuf.f_namemax, 0); diff --git a/thrift/metadata.thrift b/thrift/metadata.thrift index 86bf38e2..d04c91c0 100644 --- a/thrift/metadata.thrift +++ b/thrift/metadata.thrift @@ -232,6 +232,9 @@ struct metadata { */ 20: optional list shared_files_table, + // total file system size (without hardlinks) + 21: optional UInt64 total_hardlink_size, + // TODO: add timestamp // 21: optional UInt64 timestamp, }