return r;
}
+int BlueStore::zap_device(CephContext* cct, const string& dev, uint64_t gap_size)
+{
+ string path; // dummy var for dout
+ dout(5)<< __func__ << " " << dev << dendl;
+ auto * _bdev =
+ BlockDevice::create(cct, dev, nullptr, nullptr, nullptr, nullptr);
+ int r = _bdev->open(dev);
+ if (r < 0)
+ goto fail;
+ if (!gap_size) {
+ gap_size = _bdev->get_block_size();
+ }
+ if (p2align(gap_size, _bdev->get_block_size()) != gap_size) {
+ derr << __func__
+ << " zapping size has to be aligned with device block size: 0x"
+ << std::hex << gap_size << " vs. 0x" << _bdev->get_block_size()
+ << std::dec << dendl;
+ return -EINVAL;
+ }
+ for (auto off : bdev_label_positions) {
+ uint64_t end = std::min(off + gap_size, _bdev->get_size());
+ if (end > off) {
+ uint64_t l = end - off;
+ bufferlist bl;
+ bl.append_zero(l);
+ dout(10) << __func__ << " writing 0x"
+ << std::hex << off << "~" << l
+ << std::dec << " to " << dev
+ << dendl;
+ r = _bdev->write(off, bl, false);
+ if (r < 0) {
+ derr << __func__ << " error writing 0x"
+ << std::hex << off << "~" << l
+ << std::dec << " to " << dev
+ << " : " << cpp_strerror(r) << dendl;
+ break;
+ }
+ } else {
+ break;
+ }
+ }
+
+fail_close:
+ _bdev->close();
+
+fail:
+ return r;
+}
+
void BlueStore::set_cache_shards(unsigned num)
{
dout(10) << __func__ << " " << num << dendl;
std::string get_device_path(unsigned id);
int dump_bluefs_sizes(std::ostream& out);
+ static int zap_device(CephContext* cct, const std::string& dev, uint64_t gap_size);
public:
int statfs(struct store_statfs_t *buf,
string new_sharding = empty_sharding;
string resharding_ctrl;
int log_level = 30;
+ uint64_t zap_size = 0;
bool fsck_deep = false;
po::options_description po_options("Options");
po_options.add_options()
("yes-i-really-really-mean-it", "additional confirmation for dangerous commands")
("sharding", po::value<string>(&new_sharding), "new sharding to apply")
("resharding-ctrl", po::value<string>(&resharding_ctrl), "gives control over resharding procedure details")
+ ("zap-size", po::value<uint64_t>(&zap_size), "size of a block written when zapping device")
;
po::options_description po_positional("Positional options");
po_positional.add_options()
"free-fragmentation, "
"bluefs-stats, "
"reshard, "
- "show-sharding")
+ "show-sharding, "
+ "zap-device"
+)
;
po::options_description po_all("All options");
po_all.add(po_options).add(po_positional);
exit(EXIT_FAILURE);
}
}
+ if (action == "zap-device") {
+ if (devs.empty()) {
+ cerr << "must specify device(s) with --dev option" << std::endl;
+ exit(EXIT_FAILURE);
+ }
+ if (!vm.count("yes-i-really-really-mean-it")) {
+ cerr << "zap-osd is a DESTRUCTIVE operation, it causes OSD data loss, "
+ << "please confirm with --yes-i-really-really-mean-it option"
+ << std::endl;
+ exit(EXIT_FAILURE);
+ }
+ }
if (action == "restore_cfb") {
#ifndef CEPH_BLUESTORE_TOOL_RESTORE_ALLOCATION
exit(EXIT_FAILURE);
}
cout << sharding << std::endl;
+ } else if (action == "zap-device") {
+ for(auto& dev : devs) {
+ int r = BlueStore::zap_device(cct.get(), dev, zap_size);
+ if (r < 0) {
+ cerr << "error from zap: " << cpp_strerror(r) << std::endl;
+ exit(EXIT_FAILURE);
+ }
+ }
} else {
cerr << "unrecognized action " << action << std::endl;
return 1;