From 7349d7a5f4c305f5ba350858cc810ab79ca81bb4 Mon Sep 17 00:00:00 2001 From: Timo Weingärtner Date: Mon, 28 Nov 2011 01:11:16 +0100 Subject: forget/dont't memorize inode in to_link if st_nlink == 1 Might have caused data loss if inode number is reallocted to a file inside the tree(s) being scanned. Also saves a little bit of memory. --- hadori.C | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'hadori.C') diff --git a/hadori.C b/hadori.C index fcdebd4..4ac0684 100644 --- a/hadori.C +++ b/hadori.C @@ -56,6 +56,8 @@ void handle_file(std::string const & path, struct stat const & s) { inode const & target = kept.find(to_link[s.st_ino])->second; debug << "another link to inode " << s.st_ino << " that we merge with " << target << std::endl; do_link(target, path); + if (s.st_nlink == 1) + to_link.erase(s.st_ino); return; } inode f(path, s); @@ -78,7 +80,8 @@ void handle_file(std::string const & path, struct stat const & s) { if (!compare(candidate, f)) continue; verbose << "linking " << candidate << " to " << path << std::endl; - to_link.insert(std::make_pair(s.st_ino, it->second)); + if (s.st_nlink > 1) + to_link.insert(std::make_pair(s.st_ino, it->second)); if (not config.count("dry-run")) do_link(candidate, path); return; -- cgit v1.2.3