1 #pragma once 2 3 #include "erase.hpp" 4 #include "util.hpp" 5 6 #include <stdplus/fd/create.hpp> 7 #include <stdplus/fd/managed.hpp> 8 9 #include <chrono> 10 #include <span> 11 #include <string> 12 13 namespace estoraged 14 { 15 using stdplus::fd::Fd; 16 17 class Pattern : public Erase 18 { 19 public: 20 /** @brief Creates a pattern erase object. 21 * 22 * @param[in] inDevPath - the linux device path for the block device. 23 */ 24 Pattern(std::string_view inDevPath) : Erase(inDevPath) 25 {} 26 27 /** @brief writes an uncompressible random pattern to the drive, using 28 * default parameters. It also throws errors accordingly. 29 */ 30 void writePattern() 31 { 32 stdplus::fd::Fd&& fd = 33 stdplus::fd::open(devPath, stdplus::fd::OpenAccess::WriteOnly); 34 writePattern(util::findSizeOfBlockDevice(devPath), fd); 35 } 36 37 /** @brief writes an uncompressible random pattern to the drive 38 * and throws errors accordingly. 39 * 40 * @param[in] bytes - Size of the block device 41 * @param[in] fd - the stdplus file descriptor 42 */ 43 void writePattern(uint64_t driveSize, Fd& fd); 44 45 /** @brief verifies the uncompressible random pattern is on the drive, using 46 * default parameters. It also throws errors accordingly. 47 */ 48 void verifyPattern() 49 { 50 stdplus::fd::Fd&& fd = 51 stdplus::fd::open(devPath, stdplus::fd::OpenAccess::ReadOnly); 52 verifyPattern(util::findSizeOfBlockDevice(devPath), fd); 53 } 54 55 /** @brief verifies the uncompressible random pattern is on the drive 56 * and throws errors accordingly. 57 * 58 * @param[in] bytes - Size of the block device 59 * @param[in] fd - the stdplus file descriptor 60 */ 61 void verifyPattern(uint64_t driveSize, Fd& fd); 62 63 private: 64 static constexpr uint32_t seed = 0x6a656272; 65 static constexpr size_t blockSize = 4096; 66 static constexpr size_t blockSizeUsing32 = blockSize / sizeof(uint32_t); 67 static constexpr size_t maxRetry = 32; 68 static constexpr std::chrono::duration delay = std::chrono::milliseconds(1); 69 }; 70 71 } // namespace estoraged 72