blob: e8c61ee3138204e9f787c95af01cb5d5895b0447 [file] [log] [blame]
John Edward Broadbent7f2ab642021-11-11 21:00:38 -08001#pragma once
2
3#include "erase.hpp"
John Edward Broadbenta6e3b992022-03-17 14:33:15 -07004#include "util.hpp"
John Edward Broadbent7f2ab642021-11-11 21:00:38 -08005
6#include <stdplus/fd/create.hpp>
7#include <stdplus/fd/managed.hpp>
8
John Edward Broadbentd6071fc2022-03-31 19:33:21 -07009#include <chrono>
John Edward Broadbent7f2ab642021-11-11 21:00:38 -080010#include <span>
11#include <string>
12
John Edward Broadbentd3bfa7b2022-01-13 17:41:32 -080013namespace estoraged
14{
John Edward Broadbentd6071fc2022-03-31 19:33:21 -070015using stdplus::fd::Fd;
John Edward Broadbent7f2ab642021-11-11 21:00:38 -080016
17class 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
John Edward Broadbentd6071fc2022-03-31 19:33:21 -070027 /** @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
John Edward Broadbent7f2ab642021-11-11 21:00:38 -080037 /** @brief writes an uncompressible random pattern to the drive
38 * and throws errors accordingly.
39 *
40 * @param[in] bytes - Size of the block device
John Edward Broadbentd6071fc2022-03-31 19:33:21 -070041 * @param[in] fd - the stdplus file descriptor
John Edward Broadbent7f2ab642021-11-11 21:00:38 -080042 */
John Edward Broadbentd6071fc2022-03-31 19:33:21 -070043 void writePattern(uint64_t driveSize, Fd& fd);
John Edward Broadbenta6e3b992022-03-17 14:33:15 -070044
John Edward Broadbentd6071fc2022-03-31 19:33:21 -070045 /** @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 }
John Edward Broadbent7f2ab642021-11-11 21:00:38 -080054
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
John Edward Broadbentd6071fc2022-03-31 19:33:21 -070059 * @param[in] fd - the stdplus file descriptor
John Edward Broadbent7f2ab642021-11-11 21:00:38 -080060 */
John Edward Broadbentd6071fc2022-03-31 19:33:21 -070061 void verifyPattern(uint64_t driveSize, Fd& fd);
John Edward Broadbenta6e3b992022-03-17 14:33:15 -070062
John Edward Broadbentd6071fc2022-03-31 19:33:21 -070063 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);
John Edward Broadbent7f2ab642021-11-11 21:00:38 -080069};
John Edward Broadbentd3bfa7b2022-01-13 17:41:32 -080070
71} // namespace estoraged