Whamcloud - gitweb
LU-9223: Server on Linux 4.4: XATTR_NAME_POSIX_ACL_ACCESS
[fs/lustre-release.git] / lustre / mdd / mdd_trans.c
index 0254e99..6481ea1 100644 (file)
 #include <obd_class.h>
 #include <lprocfs_status.h>
 #include <lustre_mds.h>
+#include <lustre_barrier.h>
 
 #include "mdd_internal.h"
 
 struct thandle *mdd_trans_create(const struct lu_env *env,
                                  struct mdd_device *mdd)
 {
+       /* If blocked by the write barrier, then return "-EINPROGRESS"
+        * to the caller. Usually, such error will be forwarded to the
+        * client, and the expected behaviour is to re-try such modify
+        * RPC some time later until the barrier is thawed or expired. */
+       if (unlikely(!barrier_entry(mdd->mdd_bottom)))
+               return ERR_PTR(-EINPROGRESS);
+
         return mdd_child_ops(mdd)->dt_trans_create(env, mdd->mdd_child);
 }
 
@@ -63,6 +71,7 @@ int mdd_trans_stop(const struct lu_env *env, struct mdd_device *mdd,
 
        handle->th_result = result;
        rc = mdd_child_ops(mdd)->dt_trans_stop(env, mdd->mdd_child, handle);
+       barrier_exit(mdd->mdd_bottom);
 
        /* if operation failed, return \a result, otherwise return status of
         * dt_trans_stop */