Whamcloud - gitweb
LU-5370 mdt: return -MDT_EREMOTE_OPEN for remote open
[fs/lustre-release.git] / lustre / mdt / mdt_handler.c
index 1ef1862..413c4ae 100644 (file)
@@ -683,13 +683,17 @@ int mdt_attr_get_complex(struct mdt_thread_info *info,
        const struct lu_env *env = info->mti_env;
        struct md_object    *next = mdt_object_child(o);
        struct lu_buf       *buf = &info->mti_buf;
-       u32                  mode = lu_object_attr(&next->mo_lu);
        int                  need = ma->ma_need;
        int                  rc = 0, rc2;
+       u32                  mode;
        ENTRY;
 
        ma->ma_valid = 0;
 
+       if (mdt_object_exists(o) == 0)
+               GOTO(out, rc = -ENOENT);
+       mode = lu_object_attr(&next->mo_lu);
+
        if (need & MA_INODE) {
                ma->ma_need = MA_INODE;
                rc = mo_attr_get(env, next, ma);
@@ -2878,6 +2882,11 @@ static int mdt_tgt_connect(struct tgt_session_info *tsi)
 
        ENTRY;
 
+       if (OBD_FAIL_CHECK(OBD_FAIL_TGT_DELAY_CONDITIONAL) &&
+           cfs_fail_val ==
+           tsi2mdt_info(tsi)->mti_mdt->mdt_seq_site.ss_node_id)
+               schedule_timeout_and_set_state(TASK_UNINTERRUPTIBLE, HZ * 3);
+
        rc = tgt_connect(tsi);
        if (rc != 0)
                RETURN(rc);
@@ -3339,7 +3348,7 @@ static int mdt_intent_reint(enum mdt_it_code opcode,
 
        /* the open lock or the lock for cross-ref object should be
         * returned to the client */
-       if (rc == -EREMOTE || mdt_get_disposition(rep, DISP_OPEN_LOCK)) {
+       if (rc == -MDT_EREMOTE_OPEN || mdt_get_disposition(rep, DISP_OPEN_LOCK)) {
                LASSERT(lustre_handle_is_used(&lhc->mlh_reg_lh));
                rep->lock_policy_res2 = 0;
                rc = mdt_intent_lock_replace(info, lockp, lhc, flags);
@@ -4901,12 +4910,14 @@ static int mdt_connect_internal(struct obd_export *exp,
        data->ocd_connect_flags &= MDT_CONNECT_SUPPORTED;
        data->ocd_ibits_known &= MDS_INODELOCK_FULL;
 
-       /* If no known bits (which should not happen, probably,
-          as everybody should support LOOKUP and UPDATE bits at least)
-          revert to compat mode with plain locks. */
-       if (!data->ocd_ibits_known &&
-           data->ocd_connect_flags & OBD_CONNECT_IBITS)
-               data->ocd_connect_flags &= ~OBD_CONNECT_IBITS;
+       if (!(data->ocd_connect_flags & OBD_CONNECT_MDS_MDS) &&
+           !(data->ocd_connect_flags & OBD_CONNECT_IBITS)) {
+               CWARN("%s: client %s does not support ibits lock, either "
+                     "very old or an invalid client: flags "LPX64"\n",
+                     mdt_obd_name(mdt), exp->exp_client_uuid.uuid,
+                     data->ocd_connect_flags);
+               return -EBADE;
+       }
 
        if (!mdt->mdt_opts.mo_acl)
                data->ocd_connect_flags &= ~OBD_CONNECT_ACL;