diff --git a/src/disk_tool/disk_tool.cpp b/src/disk_tool/disk_tool.cpp index c5a4eab9..f98f2b5e 100644 --- a/src/disk_tool/disk_tool.cpp +++ b/src/disk_tool/disk_tool.cpp @@ -200,6 +200,7 @@ static const char *help_text = " --device_size 0 Set device size\n" " --format text Result format: json, options, env, or text\n" "\n" + "Default I/O mode for commands involving disk I/O is O_DIRECT. If you don't want it, add --io cached.\n" "Use vitastor-disk --help for command details or vitastor-disk --help --all for all details.\n" ; diff --git a/src/disk_tool/disk_tool_journal.cpp b/src/disk_tool/disk_tool_journal.cpp index 0b4d608b..275908d5 100644 --- a/src/disk_tool/disk_tool_journal.cpp +++ b/src/disk_tool/disk_tool_journal.cpp @@ -18,7 +18,7 @@ int disk_tool_t::dump_journal() printf("[\n"); if (all) { - dsk.journal_fd = open(dsk.journal_device.c_str(), O_DIRECT|O_RDONLY); + dsk.journal_fd = open(dsk.journal_device.c_str(), (options["io"] == "cached" ? 0 : O_DIRECT) | O_RDONLY); if (dsk.journal_fd < 0) { fprintf(stderr, "Failed to open journal device %s: %s\n", dsk.journal_device.c_str(), strerror(errno)); @@ -121,7 +121,7 @@ int disk_tool_t::dump_journal() int disk_tool_t::process_journal(std::function block_fn) { - dsk.journal_fd = open(dsk.journal_device.c_str(), O_DIRECT|O_RDONLY); + dsk.journal_fd = open(dsk.journal_device.c_str(), (options["io"] == "cached" ? 0 : O_DIRECT) | O_RDONLY); if (dsk.journal_fd < 0) { fprintf(stderr, "Failed to open journal device %s: %s\n", dsk.journal_device.c_str(), strerror(errno)); diff --git a/src/disk_tool/disk_tool_meta.cpp b/src/disk_tool/disk_tool_meta.cpp index 74debae2..0fa9ff9a 100644 --- a/src/disk_tool/disk_tool_meta.cpp +++ b/src/disk_tool/disk_tool_meta.cpp @@ -14,7 +14,7 @@ int disk_tool_t::process_meta(std::function fprintf(stderr, "Invalid metadata block size: is not a multiple of %d\n", DIRECT_IO_ALIGNMENT); return 1; } - dsk.meta_fd = open(dsk.meta_device.c_str(), O_DIRECT|O_RDONLY); + dsk.meta_fd = open(dsk.meta_device.c_str(), (options["io"] == "cached" ? 0 : O_DIRECT) | O_RDONLY); if (dsk.meta_fd < 0) { fprintf(stderr, "Failed to open metadata device %s: %s\n", dsk.meta_device.c_str(), strerror(errno)); diff --git a/src/disk_tool/disk_tool_resize.cpp b/src/disk_tool/disk_tool_resize.cpp index cc7bd0fa..60104967 100644 --- a/src/disk_tool/disk_tool_resize.cpp +++ b/src/disk_tool/disk_tool_resize.cpp @@ -257,7 +257,7 @@ int disk_tool_t::resize_copy_data() iodepth = 32; } ringloop = new ring_loop_t(iodepth < RINGLOOP_DEFAULT_SIZE ? RINGLOOP_DEFAULT_SIZE : iodepth); - dsk.data_fd = open(dsk.data_device.c_str(), O_DIRECT|O_RDWR); + dsk.data_fd = open(dsk.data_device.c_str(), (options["io"] == "cached" ? 0 : O_DIRECT) | O_RDWR); if (dsk.data_fd < 0) { fprintf(stderr, "Failed to open data device %s: %s\n", dsk.data_device.c_str(), strerror(errno)); @@ -452,7 +452,7 @@ int disk_tool_t::resize_rewrite_journal() int disk_tool_t::resize_write_new_journal() { - new_journal_fd = open(new_journal_device.c_str(), O_DIRECT|O_RDWR); + new_journal_fd = open(new_journal_device.c_str(), (options["io"] == "cached" ? 0 : O_DIRECT) | O_RDWR); if (new_journal_fd < 0) { fprintf(stderr, "Failed to open new journal device %s: %s\n", new_journal_device.c_str(), strerror(errno)); @@ -521,7 +521,7 @@ int disk_tool_t::resize_rewrite_meta() int disk_tool_t::resize_write_new_meta() { - new_meta_fd = open(new_meta_device.c_str(), O_DIRECT|O_RDWR); + new_meta_fd = open(new_meta_device.c_str(), (options["io"] == "cached" ? 0 : O_DIRECT) | O_RDWR); if (new_meta_fd < 0) { fprintf(stderr, "Failed to open new metadata device %s: %s\n", new_meta_device.c_str(), strerror(errno)); diff --git a/src/disk_tool/disk_tool_udev.cpp b/src/disk_tool/disk_tool_udev.cpp index e1f7d4b5..701e125a 100644 --- a/src/disk_tool/disk_tool_udev.cpp +++ b/src/disk_tool/disk_tool_udev.cpp @@ -122,7 +122,7 @@ uint32_t disk_tool_t::write_osd_superblock(std::string device, json11::Json para sb->size = sb_size; memcpy(sb->json_data, json_data.c_str(), json_data.size()); sb->crc32c = crc32c(0, &sb->size, sb->size - ((uint8_t*)&sb->size - buf)); - int fd = open(device.c_str(), O_DIRECT|O_RDWR); + int fd = open(device.c_str(), (options["io"] == "cached" ? 0 : O_DIRECT) | O_RDWR); if (fd < 0) { fprintf(stderr, "Failed to open device %s: %s\n", device.c_str(), strerror(errno)); @@ -150,7 +150,7 @@ json11::Json disk_tool_t::read_osd_superblock(std::string device, bool expect_ex json11::Json osd_params; std::string json_err; std::string real_device, device_type, real_data, real_meta, real_journal; - int r, fd = open(device.c_str(), O_DIRECT|O_RDWR); + int r, fd = open(device.c_str(), (options["io"] == "cached" ? 0 : O_DIRECT) | O_RDWR); if (fd < 0) { fprintf(stderr, "Failed to open device %s: %s\n", device.c_str(), strerror(errno)); @@ -385,7 +385,7 @@ int disk_tool_t::pre_exec_osd(std::string device) 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); + int fd = -1, r = open(dev.c_str(), (options["io"] == "cached" ? 0 : O_DIRECT) | O_RDWR); if (r >= 0) { fd = r;