]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
Merge PR #19833 into master
authorPatrick Donnelly <pdonnell@redhat.com>
Tue, 30 Jan 2018 23:17:54 +0000 (15:17 -0800)
committerPatrick Donnelly <pdonnell@redhat.com>
Tue, 30 Jan 2018 23:17:54 +0000 (15:17 -0800)
* refs/pull/19833/head:
common: add C_SaferCond ctor with name argument
Client: use C_SaferCond for "_flush_range"
client: use C_SaferCond for _fallocate and ll_write_block
client: use C_SaferCond for _sync_fs and _fsync
client: use C_SaferCond in Client::_write
client: use C_SaferCond for _read_sync
client: use C_SaferCond in _read_async
client: use C_SaferCond for "Client::_read"

Reviewed-by: Patrick Donnelly <pdonnell@redhat.com>
1  2 
src/client/Client.cc

index 0b8256b43fa958fe5317f0b41c5c3b65604f3047,147ee1beaf10b38c93b253e011498078cf3a646b..de6064dda8d0b2bd9b8b41c345d86761dbebda6b
@@@ -8832,21 -8828,17 +8819,17 @@@ success
  done:
    // done!
  
-   if (onuninline) {
+   if (nullptr != onuninline) {
      client_lock.Unlock();
-     uninline_flock.Lock();
-     while (!uninline_done)
-       uninline_cond.Wait(uninline_flock);
-     uninline_flock.Unlock();
+     int ret = onuninline->wait();
      client_lock.Lock();
-     if (uninline_ret >= 0 || uninline_ret == -ECANCELED) {
+     if (ret >= 0 || ret == -ECANCELED) {
        in->inline_data.clear();
        in->inline_version = CEPH_INLINE_NONE;
 -      mark_caps_dirty(in, CEPH_CAP_FILE_WR);
 +      in->mark_caps_dirty(CEPH_CAP_FILE_WR);
        check_caps(in, 0);
      } else
-       r = uninline_ret;
+       r = ret;
    }
  
    if (have)
@@@ -10082,16 -10035,14 +10026,14 @@@ int Client::test_dentry_handling(bool c
  
  int Client::_sync_fs()
  {
 -  ldout(cct, 10) << "_sync_fs" << dendl;
 +  ldout(cct, 10) << __func__ << dendl;
  
    // flush file data
-   Mutex lock("Client::_fsync::lock");
-   Cond cond;
-   bool flush_done = false;
-   if (cct->_conf->client_oc)
-     objectcacher->flush_all(new C_SafeCond(&lock, &cond, &flush_done));
-   else
-     flush_done = true;
+   std::unique_ptr<C_SaferCond> cond = nullptr; 
+   if (cct->_conf->client_oc) {
+     cond.reset(new C_SaferCond("Client::_sync_fs:lock"));
+     objectcacher->flush_all(cond.get());
+   }
  
    // flush caps
    flush_caps_sync();
@@@ -12956,20 -12879,14 +12876,14 @@@ int Client::_fallocate(Fh *fh, int mode
        }
        in->mtime = ceph_clock_now();
        in->change_attr++;
 -      mark_caps_dirty(in, CEPH_CAP_FILE_WR);
 +      in->mark_caps_dirty(CEPH_CAP_FILE_WR);
      } else {
        if (in->inline_version < CEPH_INLINE_NONE) {
-         onuninline = new C_SafeCond(&uninline_flock,
-                                     &uninline_cond,
-                                     &uninline_done,
-                                     &uninline_ret);
-         uninline_data(in, onuninline);
+         onuninline.reset(new C_SaferCond("Client::_fallocate_uninline_data flock"));
+         uninline_data(in, onuninline.get());
        }
  
-       Mutex flock("Client::_punch_hole flock");
-       Cond cond;
-       bool done = false;
-       Context *onfinish = new C_SafeCond(&flock, &cond, &done);
+       C_SaferCond onfinish("Client::_punch_hole flock");
  
        unsafe_sync_write++;
        get_cap_ref(in, CEPH_CAP_FILE_BUFFER);
                  in->snaprealm->get_snap_context(),
                  offset, length,
                  ceph::real_clock::now(),
-                 0, true, onfinish);
+                 0, true, &onfinish);
        in->mtime = ceph_clock_now();
        in->change_attr++;
 -      mark_caps_dirty(in, CEPH_CAP_FILE_WR);
 +      in->mark_caps_dirty(CEPH_CAP_FILE_WR);
  
        client_lock.Unlock();
-       flock.Lock();
-       while (!done)
-         cond.Wait(flock);
-       flock.Unlock();
+       onfinish.wait();
        client_lock.Lock();
        _sync_write_commit(in);
      }
      }
    }
  
-   if (onuninline) {
+   if (nullptr != onuninline) {
      client_lock.Unlock();
-     uninline_flock.Lock();
-     while (!uninline_done)
-       uninline_cond.Wait(uninline_flock);
-     uninline_flock.Unlock();
+     int ret = onuninline->wait();
      client_lock.Lock();
  
-     if (uninline_ret >= 0 || uninline_ret == -ECANCELED) {
+     if (ret >= 0 || ret == -ECANCELED) {
        in->inline_data.clear();
        in->inline_version = CEPH_INLINE_NONE;
 -      mark_caps_dirty(in, CEPH_CAP_FILE_WR);
 +      in->mark_caps_dirty(CEPH_CAP_FILE_WR);
        check_caps(in, 0);
      } else
-       r = uninline_ret;
+       r = ret;
    }
  
    put_cap_ref(in, CEPH_CAP_FILE_WR);