From 74c708367bb01ec5f80b31e239f8868e9b065800 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Sun, 31 Mar 2013 21:05:49 -0700 Subject: [PATCH 1/3] client: fix use-after-free on session close and cond signals Move the signal into the closed method, before we deallocate the MetaSession, so that other callers catch it too. Signed-off-by: Sage Weil --- src/client/Client.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index e81e60cca69..18fd7aae4f4 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -1512,6 +1512,7 @@ void Client::_closed_mds_session(MetaSession *s) { s->state = MetaSession::STATE_CLOSED; messenger->mark_down(s->con); + signal_cond_list(s->waiting_for_open); mount_cond.Signal(); remove_session_caps(s); kick_requests(s, true); @@ -1545,7 +1546,6 @@ void Client::handle_client_session(MClientSession *m) case CEPH_SESSION_CLOSE: _closed_mds_session(session); - signal_cond_list(session->waiting_for_open); break; case CEPH_SESSION_RENEWCAPS: From c01e2e42f368ca003e03debe9a7bd5f12eb79d2c Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Sun, 31 Mar 2013 21:40:42 -0700 Subject: [PATCH 2/3] client: do sync read when 'client oc = false' Signed-off-by: Sage Weil --- src/client/Client.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 18fd7aae4f4..74647fb8dda 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -5631,7 +5631,8 @@ int Client::_read(Fh *f, int64_t offset, uint64_t size, bufferlist *bl) movepos = true; } - if (!conf->client_debug_force_sync_read && (have & CEPH_CAP_FILE_CACHE)) { + if (!conf->client_debug_force_sync_read && + (cct->_conf->client_oc && (have & CEPH_CAP_FILE_CACHE))) { if (f->flags & O_RSYNC) { _flush_range(in, offset, size); From 267ce0d90b8f3afaaddfdc0556c9bafbf4628426 Mon Sep 17 00:00:00 2001 From: Josh Durgin Date: Mon, 1 Apr 2013 11:09:52 -0700 Subject: [PATCH 3/3] librados: don't use lockdep for AioCompletionImpl This is a quick workaround for the next branch. A more complete fix will be done for the master branch. This does not affect correctness, just what qa runs with lockdep enabled do. Signed-off-by: Josh Durgin Reviewed-by: Sage Weil --- src/librados/AioCompletionImpl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/librados/AioCompletionImpl.h b/src/librados/AioCompletionImpl.h index 619e7471605..b3e1e8a16e2 100644 --- a/src/librados/AioCompletionImpl.h +++ b/src/librados/AioCompletionImpl.h @@ -47,7 +47,7 @@ struct librados::AioCompletionImpl { tid_t aio_write_seq; xlist::item aio_write_list_item; - AioCompletionImpl() : lock("AioCompletionImpl lock"), + AioCompletionImpl() : lock("AioCompletionImpl lock", false, false), ref(1), rval(0), released(false), ack(false), safe(false), callback_complete(0), callback_safe(0), callback_arg(0), is_read(false), pbl(0), buf(0), maxlen(0),