X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmdt%2Fmdt_handler.c;h=66b0eb4f4fbab9bc06654a0803943215f308077c;hb=a1ef13bca025e09e10ce2d6e007013d0e187e6eb;hp=f6d5a5826a5e9fe20de8d8eea8c883ed7cddd326;hpb=633b0534dbf0e5e3176b74aa6ca54129946bfbc9;p=fs%2Flustre-release.git diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index f6d5a58..66b0eb4 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -1899,19 +1899,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 +2196,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 +2277,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 +2878,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 +3815,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 +4906,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 +5182,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? */ @@ -5331,44 +5341,21 @@ static int mdt_path_current(struct mdt_thread_info *info, if (IS_ERR(mdt_obj)) GOTO(out, rc = PTR_ERR(mdt_obj)); - if (mdt_object_remote(mdt_obj)) { + if (!mdt_object_exists(mdt_obj)) { mdt_object_put(info->mti_env, mdt_obj); - GOTO(remote_out, rc = -EREMOTE); - } - - lmv_buf.lb_buf = info->mti_xattr_buf; - lmv_buf.lb_len = sizeof(info->mti_xattr_buf); - - /* Check if it is slave stripes */ - rc = mo_xattr_get(info->mti_env, mdt_object_child(mdt_obj), - &lmv_buf, XATTR_NAME_LMV); - if (rc > 0) { - union lmv_mds_md *lmm = lmv_buf.lb_buf; - - /* For slave stripes, get its master */ - if (le32_to_cpu(lmm->lmv_magic) == LMV_MAGIC_STRIPE) { - struct lmv_mds_md_v1 *lmm1 = &lmm->lmv_md_v1; - - fid_le_to_cpu(tmpfid, &lmm1->lmv_master_fid); - if (!fid_is_sane(tmpfid)) { - mdt_object_put(info->mti_env, mdt_obj); - GOTO(out, rc = -EINVAL); - } - mdt_object_put(info->mti_env, mdt_obj); - pli->pli_fids[pli->pli_fidcount] = *tmpfid; - continue; - } + GOTO(out, rc = -ENOENT); } - if (!mdt_object_exists(mdt_obj)) { + if (mdt_object_remote(mdt_obj)) { mdt_object_put(info->mti_env, mdt_obj); - GOTO(out, rc = -ENOENT); + GOTO(remote_out, rc = -EREMOTE); } rc = mdt_links_read(info, mdt_obj, &ldata); - mdt_object_put(info->mti_env, mdt_obj); - if (rc != 0) + if (rc != 0) { + mdt_object_put(info->mti_env, mdt_obj); GOTO(out, rc); + } leh = buf->lb_buf; lee = (struct link_ea_entry *)(leh + 1); /* link #0 */ @@ -5389,6 +5376,26 @@ static int mdt_path_current(struct mdt_thread_info *info, pli->pli_linkno++; } + lmv_buf.lb_buf = info->mti_xattr_buf; + lmv_buf.lb_len = sizeof(info->mti_xattr_buf); + /* Check if it is slave stripes */ + rc = mo_xattr_get(info->mti_env, mdt_object_child(mdt_obj), + &lmv_buf, XATTR_NAME_LMV); + mdt_object_put(info->mti_env, mdt_obj); + if (rc > 0) { + union lmv_mds_md *lmm = lmv_buf.lb_buf; + + /* For slave stripes, get its master */ + if (le32_to_cpu(lmm->lmv_magic) == LMV_MAGIC_STRIPE) { + pli->pli_fids[pli->pli_fidcount] = *tmpfid; + continue; + } + } else if (rc < 0 && rc != -ENODATA) { + GOTO(out, rc); + } + + rc = 0; + /* Pack the name in the end of the buffer */ ptr -= tmpname->ln_namelen; if (ptr - 1 <= pli->pli_path) @@ -5494,7 +5501,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); } @@ -5542,7 +5549,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, @@ -5550,7 +5557,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)); } @@ -5562,7 +5570,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)); } @@ -5876,13 +5885,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); } /**