From 0fc7529c01e601c786d77e590aaf674ade8dd99e Mon Sep 17 00:00:00 2001 From: Joe Thornber Date: Mon, 14 Oct 2019 09:21:38 +0100 Subject: [PATCH] [cache_repair, thin_repair] fix bug introduced in recent patch I hadn't realised that check_file_exists() also checked that it was a regular file, which we don't want for the couple of uses I recently added. This patch adds an optional arg must_be_regular_file, and defaults it to true, preserving the original behaviour. The recent additions have this set to false. --- base/file_utils.cc | 4 ++-- base/file_utils.h | 2 +- caching/cache_repair.cc | 2 +- thin-provisioning/thin_repair.cc | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/base/file_utils.cc b/base/file_utils.cc index ba8957c..7883cfe 100644 --- a/base/file_utils.cc +++ b/base/file_utils.cc @@ -66,13 +66,13 @@ file_utils::file_exists(string const &path) { } void -file_utils::check_file_exists(string const &file) { +file_utils::check_file_exists(string const &file, bool must_be_regular_file) { struct stat info; int r = ::stat(file.c_str(), &info); if (r) throw runtime_error("Couldn't stat file"); - if (!S_ISREG(info.st_mode)) + if (must_be_regular_file && !S_ISREG(info.st_mode)) throw runtime_error("Not a regular file"); } diff --git a/base/file_utils.h b/base/file_utils.h index 2ee20ab..3edcc9e 100644 --- a/base/file_utils.h +++ b/base/file_utils.h @@ -10,7 +10,7 @@ namespace file_utils { int open_file(std::string const &path, int flags); bool file_exists(std::string const &path); - void check_file_exists(std::string const &file); + void check_file_exists(std::string const &file, bool must_be_regular_file = true); int create_block_file(std::string const &path, off_t file_size); int open_block_file(std::string const &path, off_t min_size, bool writeable, bool excl = true); uint64_t get_file_length(std::string const &file); diff --git a/caching/cache_repair.cc b/caching/cache_repair.cc index bc365c9..8a837a8 100644 --- a/caching/cache_repair.cc +++ b/caching/cache_repair.cc @@ -32,7 +32,7 @@ namespace { int repair(string const &old_path, string const &new_path) { bool metadata_touched = false; try { - file_utils::check_file_exists(new_path); + file_utils::check_file_exists(new_path, false); metadata_touched = true; metadata_dump(open_metadata_for_read(old_path), output_emitter(new_path), diff --git a/thin-provisioning/thin_repair.cc b/thin-provisioning/thin_repair.cc index 6f464e2..0673753 100644 --- a/thin-provisioning/thin_repair.cc +++ b/thin-provisioning/thin_repair.cc @@ -22,7 +22,7 @@ namespace { try { // block size gets updated by the restorer block_manager<>::ptr new_bm = open_bm(new_path, block_manager<>::READ_WRITE); - file_utils::check_file_exists(old_path); + file_utils::check_file_exists(old_path, false); metadata_touched = true; metadata::ptr new_md(new metadata(new_bm, metadata::CREATE, 128, 0)); emitter::ptr e = create_restore_emitter(new_md);