diff --git a/core/file.hh b/core/file.hh index 87fa240c1f..d28f7e7fb6 100644 --- a/core/file.hh +++ b/core/file.hh @@ -56,6 +56,7 @@ public: virtual future read_dma(uint64_t pos, std::vector iov) = 0; virtual future<> flush(void) = 0; virtual future stat(void) = 0; + virtual future<> truncate(uint64_t length) = 0; virtual future<> discard(uint64_t offset, uint64_t length) = 0; virtual future size(void) = 0; virtual subscription list_directory(std::function (directory_entry de)> next) = 0; @@ -79,6 +80,7 @@ public: future read_dma(uint64_t pos, std::vector iov); future<> flush(void); future stat(void); + future<> truncate(uint64_t length); future<> discard(uint64_t offset, uint64_t length); future size(void); virtual subscription list_directory(std::function (directory_entry de)> next) override; @@ -87,6 +89,7 @@ public: class blockdev_file_impl : public posix_file_impl { public: blockdev_file_impl(int fd) : posix_file_impl(fd) {} + future<> truncate(uint64_t length) override; future<> discard(uint64_t offset, uint64_t length) override; future size(void) override; }; @@ -136,6 +139,10 @@ public: return _file_impl->stat(); } + future<> truncate(uint64_t length) { + return _file_impl->truncate(length); + } + future<> discard(uint64_t offset, uint64_t length) { return _file_impl->discard(offset, length); } diff --git a/core/reactor.cc b/core/reactor.cc index f449e08f6a..5cece7a7e3 100644 --- a/core/reactor.cc +++ b/core/reactor.cc @@ -424,6 +424,21 @@ posix_file_impl::stat(void) { }); } +future<> +posix_file_impl::truncate(uint64_t length) { + return engine()._thread_pool.submit>([this, length] { + return wrap_syscall(::ftruncate(_fd, length)); + }).then([] (syscall_result sr) { + sr.throw_if_error(); + return make_ready_future<>(); + }); +} + +future<> +blockdev_file_impl::truncate(uint64_t length) { + return make_ready_future<>(); +} + future<> posix_file_impl::discard(uint64_t offset, uint64_t length) { return engine()._thread_pool.submit>([this, offset, length] () mutable {