--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2012 Red Hat
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation. See file COPYING.
+ *
+ */
+
+
+#include "MDSRank.h"
+
+#include "MDSContext.h"
+
+#include "common/dout.h"
+#define dout_context g_ceph_context
+#define dout_subsys ceph_subsys_mds
+
+void MDSInternalContextBase::complete(int r) {
+ MDSRank *mds = get_mds();
+
+ dout(10) << "MDSInternalContextBase::complete: " << typeid(*this).name() << dendl;
+ assert(mds != NULL);
+ assert(mds->mds_lock.is_locked_by_me());
+ MDSContext::complete(r);
+}
+
+
+MDSRank *MDSInternalContext::get_mds() {
+ return mds;
+}
+
+MDSRank *MDSInternalContextWrapper::get_mds()
+{
+ return mds;
+}
+
+void MDSInternalContextWrapper::finish(int r)
+{
+ fin->complete(r);
+}
+
+void MDSIOContextBase::complete(int r) {
+ MDSRank *mds = get_mds();
+
+ dout(10) << "MDSIOContextBase::complete: " << typeid(*this).name() << dendl;
+ assert(mds != NULL);
+ Mutex::Locker l(mds->mds_lock);
+ if (mds->is_daemon_stopping()) {
+ dout(4) << "MDSIOContextBase::complete: dropping for stopping "
+ << typeid(*this).name() << dendl;
+ return;
+ }
+
+ if (r == -EBLACKLISTED) {
+ derr << "MDSIOContextBase: blacklisted! Restarting..." << dendl;
+ mds->respawn();
+ } else {
+ MDSContext::complete(r);
+ }
+}
+
+void MDSLogContextBase::complete(int r) {
+ MDLog *mdlog = get_mds()->mdlog;
+ uint64_t safe_pos = write_pos;
+ pre_finish(r);
+ // MDSContextBase::complete() free this
+ MDSIOContextBase::complete(r);
+ mdlog->set_safe_pos(safe_pos);
+}
+
+MDSRank *MDSIOContext::get_mds() {
+ return mds;
+}
+
+MDSRank *MDSIOContextWrapper::get_mds() {
+ return mds;
+}
+
+void MDSIOContextWrapper::finish(int r)
+{
+ fin->complete(r);
+}
+
+void C_IO_Wrapper::complete(int r)
+{
+ if (async) {
+ async = false;
+ get_mds()->finisher->queue(this, r);
+ } else {
+ MDSIOContext::complete(r);
+ }
+}
+
+MDSRank *MDSInternalContextGather::get_mds()
+{
+ derr << "Forbidden call to MDSInternalContextGather::get_mds by " << typeid(*this).name() << dendl;
+ ceph_abort();
+}
+