From ebd616e42f9e3862e2240ff751523dd74174909a Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Sat, 12 Oct 2024 11:18:22 +0300 Subject: [PATCH] Extract clear_osd_superblock() --- src/disk_tool/disk_tool.h | 1 + src/disk_tool/disk_tool_udev.cpp | 52 ++++++++++++++++++-------------- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/disk_tool/disk_tool.h b/src/disk_tool/disk_tool.h index 9bdb8ffc..2774c4fb 100644 --- a/src/disk_tool/disk_tool.h +++ b/src/disk_tool/disk_tool.h @@ -116,6 +116,7 @@ struct disk_tool_t int systemd_start_stop_osds(const std::vector & cmd, const std::vector & devices); int pre_exec_osd(std::string device); int purge_devices(const std::vector & devices); + int clear_osd_superblock(const std::string & dev); json11::Json read_osd_superblock(std::string device, bool expect_exist = true, bool ignore_nonref = false); uint32_t write_osd_superblock(std::string device, json11::Json params); diff --git a/src/disk_tool/disk_tool_udev.cpp b/src/disk_tool/disk_tool_udev.cpp index f362620f..606b7ee7 100644 --- a/src/disk_tool/disk_tool_udev.cpp +++ b/src/disk_tool/disk_tool_udev.cpp @@ -382,6 +382,34 @@ int disk_tool_t::pre_exec_osd(std::string device) return 0; } +int disk_tool_t::clear_osd_superblock(const std::string & dev) +{ + uint8_t *buf = (uint8_t*)memalign_or_die(MEM_ALIGNMENT, 4096); + int fd = -1, r = open(dev.c_str(), O_DIRECT|O_RDWR); + if (r >= 0) + { + fd = r; + r = read_blocking(fd, buf, 4096); + if (r == 4096) + { + // Clear magic and CRC + memset(buf, 0, 12); + r = lseek64(fd, 0, 0); + if (r == 0) + { + r = write_blocking(fd, buf, 4096); + if (r == 4096) + r = 0; + } + } + } + if (fd >= 0) + close(fd); + free(buf); + buf = NULL; + return r; +} + int disk_tool_t::purge_devices(const std::vector & devices) { std::set osd_numbers; @@ -440,7 +468,6 @@ int disk_tool_t::purge_devices(const std::vector & devices) return 1; } // Destroy OSD superblocks - uint8_t *buf = (uint8_t*)memalign_or_die(MEM_ALIGNMENT, 4096); for (auto & sb: superblocks) { for (auto dev_type: std::vector{ "data", "meta", "journal" }) @@ -448,26 +475,7 @@ int disk_tool_t::purge_devices(const std::vector & devices) auto dev = sb["real_"+dev_type+"_device"].string_value(); if (dev != "") { - int fd = -1, r = open(dev.c_str(), O_DIRECT|O_RDWR); - if (r >= 0) - { - fd = r; - r = read_blocking(fd, buf, 4096); - if (r == 4096) - { - // Clear magic and CRC - memset(buf, 0, 12); - r = lseek64(fd, 0, 0); - if (r == 0) - { - r = write_blocking(fd, buf, 4096); - if (r == 4096) - r = 0; - } - } - } - if (fd >= 0) - close(fd); + int r = clear_osd_superblock(dev); if (r != 0) { fprintf(stderr, "Failed to clear OSD %ju %s device %s superblock: %s\n", @@ -517,7 +525,5 @@ int disk_tool_t::purge_devices(const std::vector & devices) } } } - free(buf); - buf = NULL; return 0; }