]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/newstore: rebuild buffers to be page-aligned for O_DIRECT
authorSage Weil <sage@redhat.com>
Thu, 16 Apr 2015 21:08:55 +0000 (14:08 -0700)
committerSage Weil <sage@redhat.com>
Tue, 1 Sep 2015 17:39:38 +0000 (13:39 -0400)
Signed-off-by: Sage Weil <sage@redhat.com>
src/os/newstore/NewStore.cc
src/os/newstore/NewStore.h

index 9959a6795b5d0e81694720d8d35fcdf8fb9c39af..750f6dd6782d67680c8d8f0895f14fb3996c2911 100644 (file)
@@ -2290,6 +2290,11 @@ int NewStore::_do_wal_transaction(wal_transaction_t& wt)
            (p->length & ~CEPH_PAGE_MASK) == 0) {
          dout(20) << __func__ << " page-aligned, using O_DIRECT" << dendl;
          flags |= O_DIRECT;
+         if (!p->data.is_page_aligned()) {
+           dout(20) << __func__ << " rebuilding buffer to be page-aligned"
+                    << dendl;
+           p->data.rebuild();
+         }
        }
        int fd = _open_fid(p->fid, flags);
        if (fd < 0)
@@ -2982,11 +2987,12 @@ int NewStore::_do_write_all_overlays(TransContext *txc,
 int NewStore::_do_write(TransContext *txc,
                        OnodeRef o,
                        uint64_t offset, uint64_t length,
-                       const bufferlist& bl,
+                       bufferlist& bl,
                        uint32_t fadvise_flags)
 {
   int fd = -1;
   int r = 0;
+  unsigned flags;
 
   dout(20) << __func__ << " have " << o->onode.size
           << " bytes in " << o->onode.data_map.size()
@@ -3025,17 +3031,22 @@ int NewStore::_do_write(TransContext *txc,
     goto out;
   }
 
+  flags = O_RDWR;
+  if (g_conf->newstore_o_direct &&
+      (offset & ~CEPH_PAGE_MASK) == 0 &&
+      (length & ~CEPH_PAGE_MASK) == 0) {
+    dout(20) << __func__ << " page-aligned, can use O_DIRECT" << dendl;
+    flags |= O_DIRECT;
+    if (!bl.is_page_aligned()) {
+      dout(20) << __func__ << " rebuilding buffer to be page-aligned" << dendl;
+      bl.rebuild();
+    }
+  }
+
   if (o->onode.size <= offset ||
       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];
@@ -3180,7 +3191,7 @@ int NewStore::_write(TransContext *txc,
                     CollectionRef& c,
                     const ghobject_t& oid,
                     uint64_t offset, size_t length,
-                    const bufferlist& bl,
+                    bufferlist& bl,
                     uint32_t fadvise_flags)
 {
   dout(15) << __func__ << " " << c->cid << " " << oid
index 0fcd66e188ef4d9d7bbbb8135021fab82ec09b38..ba12cc6e3ecdc4f45761e0f1c69eec14659c53a6 100644 (file)
@@ -600,7 +600,7 @@ private:
             CollectionRef& c,
             const ghobject_t& oid,
             uint64_t offset, size_t len,
-            const bufferlist& bl,
+            bufferlist& bl,
             uint32_t fadvise_flags);
   int _do_overlay_clear(TransContext *txc,
                        OnodeRef o);
@@ -618,7 +618,7 @@ private:
   int _do_write(TransContext *txc,
                OnodeRef o,
                uint64_t offset, uint64_t length,
-               const bufferlist& bl,
+               bufferlist& bl,
                uint32_t fadvise_flags);
   int _touch(TransContext *txc,
             CollectionRef& c,