OPTION(newstore_overlay_max_length, OPT_INT, 65536)
OPTION(newstore_overlay_max, OPT_INT, 32)
OPTION(newstore_open_by_handle, OPT_BOOL, true)
+OPTION(newstore_o_direct, OPT_BOOL, true)
OPTION(filestore_omap_backend, OPT_STR, "leveldb")
{
dout(20) << __func__ << " write " << p->fid << " "
<< p->offset << "~" << p->length << dendl;
- int fd = _open_fid(p->fid, O_RDWR);
+ unsigned flags = O_RDWR;
+ if (g_conf->newstore_o_direct &&
+ (p->offset & ~CEPH_PAGE_MASK) == 0 &&
+ (p->length & ~CEPH_PAGE_MASK) == 0) {
+ dout(20) << __func__ << " page-aligned, using O_DIRECT" << dendl;
+ flags |= O_DIRECT;
+ }
+ int fd = _open_fid(p->fid, flags);
if (fd < 0)
return fd;
int r = ::lseek64(fd, p->offset, SEEK_SET);
o->onode.size == 0 ||
o->onode.data_map.empty()) {
_do_overlay_clear(txc, o);
+ unsigned flags = O_RDWR;
+ if (g_conf->newstore_o_direct &&
+ (offset & ~CEPH_PAGE_MASK) == 0 &&
+ (length & ~CEPH_PAGE_MASK) == 0) {
+ dout(20) << __func__ << " page-aligned, using O_DIRECT" << dendl;
+ flags |= O_DIRECT;
+ }
if (o->onode.data_map.empty()) {
// create
fragment_t &f = o->onode.data_map[0];
f.offset = 0;
f.length = MAX(offset + length, o->onode.size);
- fd = _create_fid(txc, &f.fid, O_RDWR);
+ fd = _create_fid(txc, &f.fid, flags);
if (fd < 0) {
r = fd;
goto out;
// append (possibly with gap)
assert(o->onode.data_map.size() == 1);
fragment_t &f = o->onode.data_map.rbegin()->second;
- fd = _open_fid(f.fid, O_RDWR);
+ fd = _open_fid(f.fid, flags);
if (fd < 0) {
r = fd;
goto out;