X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosp%2Fosp_dev.c;h=73efec39454fdf1d39067f25aa6f650771dc25a5;hp=6c3ad4fc6b94d90f985916baf94713a0bca99ae2;hb=4f53536d002c13886210b672b657795baa067144;hpb=b1f01a709ffe66d82f13ad421d319432d235c05b diff --git a/lustre/osp/osp_dev.c b/lustre/osp/osp_dev.c index 6c3ad4f..73efec3 100644 --- a/lustre/osp/osp_dev.c +++ b/lustre/osp/osp_dev.c @@ -850,6 +850,27 @@ out: } /** + * Determine if the lock needs to be cancelled + * + * Determine if the unused lock should be cancelled before replay, see + * (ldlm_cancel_no_wait_policy()). Currently, only inode bits lock exists + * between MDTs. + * + * \param[in] lock lock to be checked. + * + * \retval 1 if the lock needs to be cancelled before replay. + * \retval 0 if the lock does not need to be cancelled before + * replay. + */ +static int osp_cancel_weight(struct ldlm_lock *lock) +{ + if (lock->l_resource->lr_type != LDLM_IBITS) + RETURN(0); + + RETURN(1); +} + +/** * Initialize OSP device according to the parameters in the configuration * log \a cfg. * @@ -1063,6 +1084,8 @@ static int osp_init0(const struct lu_env *env, struct osp_device *osp, GOTO(out_precreat, rc); } + ns_register_cancel(obd->obd_namespace, osp_cancel_weight); + /* * Initiate connect to OST */ @@ -1316,6 +1339,9 @@ static int osp_obd_connect(const struct lu_env *env, struct obd_export **exp, if (rc) { CERROR("%s: can't connect obd: rc = %d\n", obd->obd_name, rc); GOTO(out, rc); + } else { + osp->opd_obd->u.cli.cl_seq->lcs_exp = + class_export_get(osp->opd_exp); } ptlrpc_pinger_add_import(imp); @@ -1433,26 +1459,6 @@ out: } /** - * Prepare fid client. - * - * This function prepares the FID client for the OSP. It will check and assign - * the export (to MDT0) for its FID client, so OSP can allocate super sequence - * or lookup sequence in FLDB of MDT0. - * - * \param[in] osp OSP device - */ -static void osp_prepare_fid_client(struct osp_device *osp) -{ - LASSERT(osp->opd_obd->u.cli.cl_seq != NULL); - if (osp->opd_obd->u.cli.cl_seq->lcs_exp != NULL) - return; - - LASSERT(osp->opd_exp != NULL); - osp->opd_obd->u.cli.cl_seq->lcs_exp = - class_export_get(osp->opd_exp); -} - -/** * Implementation of obd_ops::o_import_event * * This function is called when some related import event happens. It will @@ -1500,7 +1506,6 @@ static int osp_import_event(struct obd_device *obd, struct obd_import *imp, case IMP_EVENT_ACTIVE: d->opd_imp_active = 1; - osp_prepare_fid_client(d); if (d->opd_got_disconnected) d->opd_new_connection = 1; d->opd_imp_connected = 1; @@ -1665,8 +1670,7 @@ static int osp_fid_alloc(const struct lu_env *env, struct obd_export *exp, LASSERT(osp->opd_obd->u.cli.cl_seq != NULL); /* Sigh, fid client is not ready yet */ - if (osp->opd_obd->u.cli.cl_seq->lcs_exp == NULL) - RETURN(-ENOTCONN); + LASSERT(osp->opd_obd->u.cli.cl_seq->lcs_exp != NULL); RETURN(seq_client_alloc_fid(env, seq, fid)); }