From 5ba1c068a2c4222dfa5e443d06a9b0a408383268 Mon Sep 17 00:00:00 2001 From: Sandeep Patil Date: Thu, 17 Jan 2019 15:57:40 -0800 Subject: [PATCH] fiemap_writer: Add PinStatus check for fiemap writes. Note that the check needs the kernel built with latest f2fs. Bug: 122138114 Test: fiemap_writer_test /dev/block/sda21 \ --gtest_filter=VerifyBlockWritesF2fs.CheckWrites Change-Id: I0afbc14241f74ed368438a64afbdb97e3376f1f6 Signed-off-by: Sandeep Patil --- fs_mgr/libfiemap_writer/fiemap_writer.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/fs_mgr/libfiemap_writer/fiemap_writer.cpp b/fs_mgr/libfiemap_writer/fiemap_writer.cpp index 4a0d4b58d..71b39a929 100644 --- a/fs_mgr/libfiemap_writer/fiemap_writer.cpp +++ b/fs_mgr/libfiemap_writer/fiemap_writer.cpp @@ -304,7 +304,6 @@ static bool PinFile(int file_fd, const std::string& file_path, uint32_t fs_type) return true; } -#if 0 static bool IsFilePinned(int file_fd, const std::string& file_path, uint32_t fs_type) { if (fs_type == EXT4_SUPER_MAGIC) { // No pinning necessary for ext4. The blocks, once allocated, are expected @@ -345,7 +344,6 @@ static bool IsFilePinned(int file_fd, const std::string& file_path, uint32_t fs_ } return moved_blocks_nr == 0; } -#endif static void LogExtent(uint32_t num, const struct fiemap_extent& ext) { LOG(INFO) << "Extent #" << num; @@ -477,13 +475,15 @@ FiemapUniquePtr FiemapWriter::Open(const std::string& file_path, uint64_t file_s if (create) { if (!AllocateFile(file_fd, abs_path, blocksz, file_size)) { + LOG(ERROR) << "Failed to allocate file: " << abs_path << " of size: " << file_size + << " bytes"; cleanup(abs_path, create); return nullptr; } } // f2fs may move the file blocks around. - if (!PinFile(file_fd, file_path, fs_type)) { + if (!PinFile(file_fd, abs_path, fs_type)) { cleanup(abs_path, create); LOG(ERROR) << "Failed to pin the file in storage"; return nullptr; @@ -538,13 +538,11 @@ bool FiemapWriter::Write(off64_t off, uint8_t* buffer, uint64_t size) { return false; } -#if 0 - // TODO(b/122138114): check why this fails. if (!IsFilePinned(file_fd_, file_path_, fs_type_)) { LOG(ERROR) << "Failed write: file " << file_path_ << " is not pinned"; return false; } -#endif + // find extents that must be written to and then write one at a time. uint32_t num_extent = 1; uint32_t buffer_offset = 0;