]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore/BlueFS: prevent read+write sharing
authorSage Weil <sage@redhat.com>
Thu, 10 Dec 2015 21:43:14 +0000 (16:43 -0500)
committerSage Weil <sage@redhat.com>
Fri, 1 Jan 2016 18:06:55 +0000 (13:06 -0500)
Signed-off-by: Sage Weil <sage@redhat.com>
src/os/bluestore/BlueFS.cc
src/os/bluestore/BlueFS.h

index 8e19e25eda77887fd94d15616c327e82e7093992..70c11612c285be2af25bc43ae3235ffbd4eba47c 100644 (file)
@@ -569,6 +569,7 @@ void BlueFS::_drop_link(FileRef file)
   --file->refs;
   if (file->refs == 0) {
     dout(20) << __func__ << " destroying " << file->fnode << dendl;
+    assert(file->num_reading.read() == 0);
     log_t.op_file_remove(file->fnode.ino);
     for (auto r : file->fnode.extents) {
       alloc[r.bdev]->release(r.offset, r.length);
@@ -588,6 +589,9 @@ int BlueFS::_read(
   Mutex::Locker l(h->lock);
   dout(10) << __func__ << " h " << h << " " << off << "~" << len
           << " from " << h->file->fnode << dendl;
+
+  h->file->num_reading.inc();
+
   if (!h->ignore_eof &&
       off + len > h->file->fnode.size) {
     if (off > h->file->fnode.size)
@@ -652,6 +656,7 @@ int BlueFS::_read(
 
   dout(20) << __func__ << " got " << ret << dendl;
   assert(!outbl || (int)outbl->length() == ret);
+  h->file->num_reading.dec();
   return ret;
 }
 
@@ -834,6 +839,7 @@ int BlueFS::_flush_range(FileWriter *h, uint64_t offset, uint64_t length)
           << " " << offset << "~" << length
           << " to " << h->file->fnode << dendl;
   assert(!h->file->deleted);
+  assert(h->file->num_readers.read() == 0);
 
   if (offset + length <= h->pos)
     return 0;
index c983f510d644ed3595c44ce0743a7c0ddd2d41ee..6919996e76ff91b191b9e6dccea0672a2aa5bb8c 100644 (file)
@@ -25,6 +25,7 @@ public:
     boost::intrusive::list_member_hook<> dirty_item;
 
     atomic_t num_readers, num_writers;
+    atomic_t num_reading;
 
     File()
       : RefCountedObject(0),
@@ -36,6 +37,7 @@ public:
     ~File() {
       assert(num_readers.read() == 0);
       assert(num_writers.read() == 0);
+      assert(num_reading.read() == 0);
     }
 
     friend void intrusive_ptr_add_ref(File *f) {