0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-06-02 10:08:56 +02:00

ircd::fs: Add write_options.alignment; padding out to alignment for aio write.

This commit is contained in:
Jason Volk 2018-10-31 17:00:17 -07:00
parent 88be871149
commit 6b6106499f
3 changed files with 44 additions and 1 deletions

View file

@ -44,6 +44,9 @@ struct ircd::fs::write_opts
/// Offset in the file to start the write from.
off_t offset {0};
/// Alignment requirement.
size_t alignment {0};
/// Request priority (this option may be improved, avoid for now)
int16_t priority {0};

View file

@ -13,6 +13,12 @@
#include <ircd/asio.h>
#include "aio.h"
namespace ircd::fs
{
extern char _zero_pads_[4096];
static size_t _zero_pads_required(const size_t &buf_size, const size_t &alignment);
}
//
// request::fsync
//
@ -132,6 +138,10 @@ ircd::fs::aio::request::write::write(const int &fd,
const_cast<char *>(buffer::data(buf)),
buffer::size(buf)
},
{
_zero_pads_,
_zero_pads_required(buffer::size(buf), opts.alignment)
},
}}
{
aio_reqprio = opts.priority;
@ -177,6 +187,36 @@ ircd::fs::prefetch__aio(const fd &fd,
}
//
// internal util
//
decltype(ircd::fs::_zero_pads_)
__attribute__((aligned(512)))
ircd::fs::_zero_pads_
{
0
};
size_t
ircd::fs::_zero_pads_required(const size_t &buf_size,
const size_t &alignment)
{
if(!alignment || buf_size == alignment)
return 0;
if(unlikely(alignment > sizeof(_zero_pads_)))
throw error
{
make_error_code(std::errc::invalid_argument),
"Alignment %zu exceeds maximum of %zu",
alignment,
sizeof(_zero_pads_)
};
return alignment - (buf_size % alignment);
}
//
// aio
//

View file

@ -94,7 +94,7 @@ struct ircd::fs::aio::request::read
struct ircd::fs::aio::request::write
:request
{
std::array<struct iovec, 1> iov;
std::array<struct iovec, 2> iov;
write(const int &fd, const const_buffer &, const write_opts &);
};