]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: enforce write ordering with snapshot
authorJason Dillaman <dillaman@redhat.com>
Sat, 14 Feb 2015 06:24:44 +0000 (01:24 -0500)
committerJosh Durgin <jdurgin@redhat.com>
Mon, 16 Feb 2015 22:27:25 +0000 (14:27 -0800)
The md_lock is now held for reading when scheduling write/discards.
Since snap_create now holds the lock for writing and flushes all
pending IO, write/discard operations will now be consistent for a
given request across objects.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/AioRequest.cc
src/librbd/AioRequest.h
src/librbd/internal.cc

index 35ba2e6bd896878020ac5ebc65827449be7a1f74..ceacc6f0e8a6eb739769a844ce7ba13cf9abd136 100644 (file)
@@ -246,9 +246,6 @@ namespace librbd {
       m_state(LIBRBD_AIO_WRITE_FLAT), m_snap_seq(snapc.seq.val),
       m_entire_object(NULL)
   {
-    m_io_ctx.dup(ictx->data_ctx);
-    m_io_ctx.snap_set_read(CEPH_NOSNAP);
-
     m_object_image_extents = objectx;
     m_parent_overlap = object_overlap;
   }
index a5da41edbefd5dbba916f0dba9585c3c7837079e..ae8c855038a6b470463639ec9f06bbdbcaff045e 100644 (file)
@@ -192,8 +192,6 @@ namespace librbd {
     }
 
   private:
-    librados::IoCtx m_io_ctx;
-
     bool send_pre();
     bool send_post();
     void send_write();
index 7d6593bb01c1d73a1ab889d2169c42b9a861a985..542ad434dc358d3608c44505ff686ffda71893bf 100644 (file)
@@ -3264,6 +3264,9 @@ reprotect_and_return_err:
       return r;
     }
 
+    RWLock::RLocker owner_locker(ictx->owner_lock);
+    RWLock::RLocker md_locker(ictx->md_lock);
+
     ictx->snap_lock.get_read();
     snapid_t snap_id = ictx->snap_id;
     ::SnapContext snapc = ictx->snapc;
@@ -3282,7 +3285,6 @@ reprotect_and_return_err:
     c->get();
     c->init_time(ictx, AIO_TYPE_WRITE);
 
-    RWLock::RLocker l(ictx->owner_lock);
     if (ictx->image_watcher->is_lock_supported() &&
        !ictx->image_watcher->is_lock_owner()) {
       c->put();
@@ -3358,6 +3360,9 @@ reprotect_and_return_err:
       return r;
     }
 
+    RWLock::RLocker owner_locker(ictx->owner_lock);
+    RWLock::RLocker md_locker(ictx->md_lock);
+
     // TODO: check for snap
     ictx->snap_lock.get_read();
     snapid_t snap_id = ictx->snap_id;
@@ -3375,7 +3380,6 @@ reprotect_and_return_err:
     c->get();
     c->init_time(ictx, AIO_TYPE_DISCARD);
 
-    RWLock::RLocker l(ictx->owner_lock);
     if (ictx->image_watcher->is_lock_supported() &&
        !ictx->image_watcher->is_lock_owner()) {
       c->put();