Whamcloud - gitweb
LU-5285 mdt: reconstruct to handle non-existing objects
[fs/lustre-release.git] / lustre / mdt / mdt_handler.c
index f64795f..2e4e8c0 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);
@@ -1899,19 +1903,20 @@ static int mdt_device_sync(const struct lu_env *env, struct mdt_device *mdt)
 /* this should sync this object */
 static int mdt_object_sync(struct mdt_thread_info *info)
 {
-        struct md_object *next;
-        int rc;
-        ENTRY;
+       struct md_object *next;
+       int rc;
+       ENTRY;
 
-        if (!mdt_object_exists(info->mti_object)) {
-                CWARN("Non existing object  "DFID"!\n",
-                      PFID(mdt_object_fid(info->mti_object)));
-                RETURN(-ESTALE);
-        }
-        next = mdt_object_child(info->mti_object);
-        rc = mo_object_sync(info->mti_env, next);
+       if (!mdt_object_exists(info->mti_object)) {
+               CWARN("%s: non existing object "DFID": rc = %d\n",
+                     mdt_obd_name(info->mti_mdt),
+                     PFID(mdt_object_fid(info->mti_object)), -ESTALE);
+               RETURN(-ESTALE);
+       }
+       next = mdt_object_child(info->mti_object);
+       rc = mo_object_sync(info->mti_env, next);
 
-        RETURN(rc);
+       RETURN(rc);
 }
 
 static int mdt_sync(struct tgt_session_info *tsi)
@@ -2195,12 +2200,13 @@ struct mdt_object *mdt_object_find(const struct lu_env *env,
 static void mdt_device_commit_async(const struct lu_env *env,
                                     struct mdt_device *mdt)
 {
-        struct dt_device *dt = mdt->mdt_bottom;
-        int rc;
+       struct dt_device *dt = mdt->mdt_bottom;
+       int rc;
 
-        rc = dt->dd_ops->dt_commit_async(env, dt);
-        if (unlikely(rc != 0))
-                CWARN("async commit start failed with rc = %d", rc);
+       rc = dt->dd_ops->dt_commit_async(env, dt);
+       if (unlikely(rc != 0))
+               CWARN("%s: async commit start failed: rc = %d\n",
+                     mdt_obd_name(mdt), rc);
 }
 
 /**
@@ -2275,10 +2281,11 @@ int mdt_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc,
         if (lock->l_req_mode == LCK_COS && lock->l_blocking_lock != NULL) {
                 struct lu_env env;
 
-                rc = lu_env_init(&env, LCT_LOCAL);
-                if (unlikely(rc != 0))
-                        CWARN("lu_env initialization failed with rc = %d,"
-                              "cannot start asynchronous commit\n", rc);
+               rc = lu_env_init(&env, LCT_LOCAL);
+               if (unlikely(rc != 0))
+                       CWARN("%s: lu_env initialization failed, cannot "
+                             "start asynchronous commit: rc = %d\n",
+                             obd->obd_name, rc);
                 else
                         mdt_device_commit_async(&env, mdt);
                 lu_env_fini(&env);
@@ -2875,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);
@@ -3807,7 +3819,7 @@ static void mdt_stack_pre_fini(const struct lu_env *env,
        lustre_cfg_bufs_set_string(bufs, 1, NULL);
        lcfg = lustre_cfg_new(LCFG_PRE_CLEANUP, bufs);
        if (!lcfg) {
-               CERROR("%s:Cannot alloc lcfg!\n", mdt_obd_name(m));
+               CERROR("%s: cannot alloc lcfg\n", mdt_obd_name(m));
                return;
        }
        top->ld_ops->ldo_process_config(env, top, lcfg);
@@ -4898,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;
@@ -5172,13 +5186,13 @@ static int mdt_obd_disconnect(struct obd_export *exp)
         LASSERT(exp);
         class_export_get(exp);
 
-        rc = server_disconnect_export(exp);
-        if (rc != 0)
-                CDEBUG(D_IOCTL, "server disconnect error: %d\n", rc);
+       rc = server_disconnect_export(exp);
+       if (rc != 0)
+               CDEBUG(D_IOCTL, "server disconnect error: rc = %d\n", rc);
 
-        rc = mdt_export_cleanup(exp);
-        class_export_put(exp);
-        RETURN(rc);
+       rc = mdt_export_cleanup(exp);
+       class_export_put(exp);
+       RETURN(rc);
 }
 
 /* FIXME: Can we avoid using these two interfaces? */
@@ -5491,7 +5505,7 @@ static int mdt_fid2path(struct mdt_thread_info *info,
 
        if (rc < 0) {
                mdt_object_put(info->mti_env, obj);
-               CDEBUG(D_IOCTL, "nonlocal object "DFID": %d\n",
+               CDEBUG(D_IOCTL, "nonlocal object "DFID": rc = %d\n",
                       PFID(&fp->gf_fid), rc);
                RETURN(rc);
        }
@@ -5539,7 +5553,7 @@ int mdt_get_info(struct tgt_session_info *tsi)
 
        key = req_capsule_client_get(tsi->tsi_pill, &RMF_GETINFO_KEY);
        if (key == NULL) {
-               CDEBUG(D_IOCTL, "No GETINFO key");
+               CDEBUG(D_IOCTL, "No GETINFO key\n");
                RETURN(err_serious(-EFAULT));
        }
        keylen = req_capsule_get_size(tsi->tsi_pill, &RMF_GETINFO_KEY,
@@ -5547,7 +5561,8 @@ int mdt_get_info(struct tgt_session_info *tsi)
 
        vallen = req_capsule_client_get(tsi->tsi_pill, &RMF_GETINFO_VALLEN);
        if (vallen == NULL) {
-               CDEBUG(D_IOCTL, "Unable to get RMF_GETINFO_VALLEN buffer");
+               CDEBUG(D_IOCTL, "%s: cannot get RMF_GETINFO_VALLEN buffer\n",
+                               tgt_name(tsi->tsi_tgt));
                RETURN(err_serious(-EFAULT));
        }
 
@@ -5559,7 +5574,8 @@ int mdt_get_info(struct tgt_session_info *tsi)
 
        valout = req_capsule_server_get(tsi->tsi_pill, &RMF_GETINFO_VAL);
        if (valout == NULL) {
-               CDEBUG(D_IOCTL, "Unable to get get-info RPC out buffer");
+               CDEBUG(D_IOCTL, "%s: cannot get get-info RPC out buffer\n",
+                               tgt_name(tsi->tsi_tgt));
                RETURN(err_serious(-EFAULT));
        }
 
@@ -5873,13 +5889,13 @@ void mdt_enable_cos(struct mdt_device *mdt, int val)
 
         mdt->mdt_opts.mo_cos = !!val;
         rc = lu_env_init(&env, LCT_LOCAL);
-        if (unlikely(rc != 0)) {
-                CWARN("lu_env initialization failed with rc = %d,"
-                      "cannot sync\n", rc);
-                return;
-        }
-        mdt_device_sync(&env, mdt);
-        lu_env_fini(&env);
+       if (unlikely(rc != 0)) {
+               CWARN("%s: lu_env initialization failed, cannot "
+                     "sync: rc = %d\n", mdt_obd_name(mdt), rc);
+               return;
+       }
+       mdt_device_sync(&env, mdt);
+       lu_env_fini(&env);
 }
 
 /**