X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmdt%2Fmdt_hsm_cdt_client.c;h=9d0335c2752fc227e928c0dacaf1b4e0f02b791a;hp=83626272b2885d75cea95a87150e30557928c9a5;hb=ccabce23bd9e366c345c852f565766a799f61238;hpb=8e357d93ccc26e85e6ddf53360df72b47a254852 diff --git a/lustre/mdt/mdt_hsm_cdt_client.c b/lustre/mdt/mdt_hsm_cdt_client.c index 8362627..9d0335c 100644 --- a/lustre/mdt/mdt_hsm_cdt_client.c +++ b/lustre/mdt/mdt_hsm_cdt_client.c @@ -23,6 +23,7 @@ * (C) Copyright 2012 Commissariat a l'energie atomique et aux energies * alternatives * + * Copyright (c) 2013, 2017, Intel Corporation. */ /* * lustre/mdt/mdt_hsm_cdt_client.c @@ -36,7 +37,6 @@ #define DEBUG_SUBSYSTEM S_MDS #include -#include #include #include #include @@ -154,7 +154,8 @@ static int hsm_find_compatible(const struct lu_env *env, struct mdt_device *mdt, hcdcb.cdt = &mdt->mdt_coordinator; hcdcb.hal = hal; - rc = cdt_llog_process(env, mdt, hsm_find_compatible_cb, &hcdcb); + rc = cdt_llog_process(env, mdt, hsm_find_compatible_cb, &hcdcb, 0, 0, + READ); RETURN(rc); } @@ -199,8 +200,8 @@ static bool hsm_action_is_needed(struct hsm_action_item *hai, int hal_an, is_needed = true; break; } - CDEBUG(D_HSM, "fid="DFID" action=%s rq_flags="LPX64 - " extent="LPX64"-"LPX64" hsm_flags=%X %s\n", + CDEBUG(D_HSM, "fid="DFID" action=%s rq_flags=%#llx" + " extent=%#llx-%#llx hsm_flags=%X %s\n", PFID(&hai->hai_fid), hsm_copytool_action2name(hai->hai_action), rq_flags, hai->hai_extent.offset, hai->hai_extent.length, @@ -256,8 +257,7 @@ hsm_action_permission(struct mdt_thread_info *mti, int rc; ENTRY; - if (hsma != HSMA_RESTORE && - exp_connect_flags(mti->mti_exp) & OBD_CONNECT_RDONLY) + if (hsma != HSMA_RESTORE && mdt_rdonly(mti->mti_exp)) RETURN(-EROFS); if (md_capable(uc, CFS_CAP_SYS_ADMIN)) @@ -281,47 +281,21 @@ hsm_action_permission(struct mdt_thread_info *mti, RETURN(*mask & (1UL << hsma) ? 0 : -EPERM); } -/* - * Coordinator external API - */ - -/** - * register a list of requests - * \param mti [IN] - * \param hal [IN] list of requests - * \param compound_id [OUT] id of the compound request - * \retval 0 success - * \retval -ve failure - * in case of restore, caller must hold layout lock - */ -int mdt_hsm_add_actions(struct mdt_thread_info *mti, - struct hsm_action_list *hal, __u64 *compound_id) +/* Process a single HAL. hsm_find_compatible has already been called + * on it. */ +static int mdt_hsm_register_hal(struct mdt_thread_info *mti, + struct mdt_device *mdt, + struct coordinator *cdt, + struct hsm_action_list *hal) { - struct mdt_device *mdt = mti->mti_mdt; - struct coordinator *cdt = &mdt->mdt_coordinator; struct hsm_action_item *hai; struct mdt_object *obj = NULL; - int rc = 0, i; + int rc, i; struct md_hsm mh; bool is_restore = false; - ENTRY; - - /* no coordinator started, so we cannot serve requests */ - if (cdt->cdt_state == CDT_STOPPED) - RETURN(-EAGAIN); + __u64 compound_id; - if (!hal_is_sane(hal)) - RETURN(-EINVAL); - - *compound_id = atomic_inc_return(&cdt->cdt_compound_id); - - /* search for compatible request, if found hai_cookie is set - * to the request cookie - * it is also used to set the cookie for cancel request by FID - */ - rc = hsm_find_compatible(mti->mti_env, mdt, hal); - if (rc) - GOTO(out, rc); + compound_id = atomic_inc_return(&cdt->cdt_compound_id); hai = hai_first(hal); for (i = 0; i < hal->hal_count; i++, hai = hai_next(hai)) { @@ -446,12 +420,27 @@ int mdt_hsm_add_actions(struct mdt_thread_info *mti, mdt_object_put(mti->mti_env, obj); mutex_lock(&cdt->cdt_restore_lock); + if (unlikely((cdt->cdt_state == CDT_STOPPED) || + (cdt->cdt_state == CDT_STOPPING))) { + mutex_unlock(&cdt->cdt_restore_lock); + mdt_object_unlock(mti, NULL, &crh->crh_lh, 1); + OBD_SLAB_FREE_PTR(crh, mdt_hsm_cdt_kmem); + GOTO(out, rc = -EAGAIN); + } list_add_tail(&crh->crh_list, &cdt->cdt_restore_hdl); mutex_unlock(&cdt->cdt_restore_lock); } record: + /* + * Wait here to catch the 2nd RESTORE request to the same FID. + * Normally layout lock protects against adding such request. + * But when cdt is stopping it cancel all locks via + * ldlm_resource_clean and protections may not work. + * See LU-9266 and sanity-hsm_407 for details. + */ + OBD_FAIL_TIMEOUT(OBD_FAIL_MDS_HSM_CDT_DELAY, cfs_fail_val); /* record request */ - rc = mdt_agent_record_add(mti->mti_env, mdt, *compound_id, + rc = mdt_agent_record_add(mti->mti_env, mdt, compound_id, archive_id, flags, hai); if (rc) GOTO(out, rc); @@ -463,47 +452,55 @@ record: rc = 0; GOTO(out, rc); -out: - /* if work has been added, wake up coordinator */ - if (rc == 0 || rc == -ENODATA) - mdt_hsm_cdt_wakeup(mdt); +out: return rc; } +/* + * Coordinator external API + */ + /** - * get running action on a FID list or from cookie + * register a list of requests * \param mti [IN] - * \param hal [IN/OUT] requests + * \param hal [IN] list of requests * \retval 0 success * \retval -ve failure + * in case of restore, caller must hold layout lock */ -int mdt_hsm_get_running(struct mdt_thread_info *mti, +int mdt_hsm_add_actions(struct mdt_thread_info *mti, struct hsm_action_list *hal) { struct mdt_device *mdt = mti->mti_mdt; struct coordinator *cdt = &mdt->mdt_coordinator; - struct hsm_action_item *hai; - int i; + int rc; ENTRY; - hai = hai_first(hal); - for (i = 0; i < hal->hal_count; i++, hai = hai_next(hai)) { - struct cdt_agent_req *car; + /* no coordinator started, so we cannot serve requests */ + if (cdt->cdt_state == CDT_STOPPED) + RETURN(-EAGAIN); - if (!fid_is_sane(&hai->hai_fid)) - RETURN(-EINVAL); + if (!hal_is_sane(hal)) + RETURN(-EINVAL); - car = mdt_cdt_find_request(cdt, 0, &hai->hai_fid); - if (car == NULL) { - hai->hai_cookie = 0; - hai->hai_action = HSMA_NONE; - } else { - *hai = *car->car_hai; - mdt_cdt_put_request(car); - } - } - RETURN(0); + /* search for compatible request, if found hai_cookie is set + * to the request cookie + * it is also used to set the cookie for cancel request by FID + */ + rc = hsm_find_compatible(mti->mti_env, mdt, hal); + if (rc) + GOTO(out, rc); + + rc = mdt_hsm_register_hal(mti, mdt, cdt, hal); + + GOTO(out, rc); +out: + /* if work has been added, signal the coordinator */ + if (rc == 0 || rc == -ENODATA) + mdt_hsm_cdt_event(cdt); + + return rc; } /** @@ -581,7 +578,7 @@ int mdt_hsm_get_actions(struct mdt_thread_info *mti, for (i = 0; i < hal->hal_count; i++, hai = hai_next(hai)) { struct cdt_agent_req *car; - car = mdt_cdt_find_request(cdt, hai->hai_cookie, NULL); + car = mdt_cdt_find_request(cdt, hai->hai_cookie); if (car == NULL) { hai->hai_cookie = 0; } else { @@ -599,4 +596,3 @@ int mdt_hsm_get_actions(struct mdt_thread_info *mti, RETURN(0); } -