xref: /openbmc/estoraged/include/zero.hpp (revision 04c28fad)
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 
11 namespace estoraged
12 {
13 
14 using stdplus::fd::Fd;
15 
16 class Zero : public Erase
17 {
18   public:
19     /** @brief Creates a zero erase object.
20      *
21      *  @param[in] inDevPath - the linux device path for the block device.
22      */
Zero(std::string_view inDevPath)23     Zero(std::string_view inDevPath) : Erase(inDevPath) {}
24     /** @brief writes zero to the drive
25      * and throws errors accordingly.
26      *  @param[in] driveSize - the size of the block device in bytes
27      *  @param[in] fd - the stdplus file descriptor
28      */
29     void writeZero(uint64_t driveSize, Fd& fd);
30 
31     /** @brief writes zero to the drive using default parameters,
32      * and throws errors accordingly.
33      */
writeZero()34     void writeZero()
35     {
36         stdplus::fd::Fd&& fd =
37             stdplus::fd::open(devPath, stdplus::fd::OpenAccess::WriteOnly);
38         writeZero(util::findSizeOfBlockDevice(devPath), fd);
39     }
40 
41     /** @brief verifies the drive has only zeros on it,
42      * and throws errors accordingly.
43      *  @param[in] driveSize - the size of the block device in bytes
44      *  @param[in] fd - the stdplus file descriptor
45      */
46     void verifyZero(uint64_t driveSize, Fd& fd);
47 
48     /** @brief verifies the drive has only zeros on it,
49      * using the default parameters. It also throws errors accordingly.
50      */
verifyZero()51     void verifyZero()
52     {
53         stdplus::fd::Fd&& fd =
54             stdplus::fd::open(devPath, stdplus::fd::OpenAccess::ReadOnly);
55         verifyZero(util::findSizeOfBlockDevice(devPath), fd);
56     }
57 
58   private:
59     /* @brief the size of the blocks in bytes used for write and verify.
60      * 32768 was also tested. It had almost identical performance.
61      */
62     static constexpr size_t blockSize = 4096;
63     static constexpr size_t maxRetry = 32;
64     static constexpr std::chrono::duration delay = std::chrono::milliseconds(1);
65 };
66 
67 } // namespace estoraged
68