📄 mgc_request.c
字号:
struct client_obd *cli = &obd->u.cli; int rc = 0; ENTRY; LASSERT(cli->cl_mgc_vfsmnt != NULL); if (cli->cl_mgc_configs_dir != NULL) { struct lvfs_run_ctxt saved; push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); l_dput(cli->cl_mgc_configs_dir); cli->cl_mgc_configs_dir = NULL; pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); class_decref(obd); } cli->cl_mgc_vfsmnt = NULL; if (obd->obd_fsops) fsfilt_put_ops(obd->obd_fsops); up(&cli->cl_mgc_sem); RETURN(rc);}static atomic_t mgc_count = ATOMIC_INIT(0);static int mgc_precleanup(struct obd_device *obd, enum obd_cleanup_stage stage){ int rc = 0; ENTRY; switch (stage) { case OBD_CLEANUP_EARLY: break; case OBD_CLEANUP_EXPORTS: if (atomic_dec_and_test(&mgc_count)) { /* Kick the requeue waitq - cld's should all be stopping */ spin_lock(&config_list_lock); rq_state |= RQ_STOP; spin_unlock(&config_list_lock); cfs_waitq_signal(&rq_waitq); } break; case OBD_CLEANUP_SELF_EXP: rc = obd_llog_finish(obd, 0); if (rc != 0) CERROR("failed to cleanup llogging subsystems\n"); break; case OBD_CLEANUP_OBD: break; } RETURN(rc);}static int mgc_cleanup(struct obd_device *obd){ struct client_obd *cli = &obd->u.cli; int rc; ENTRY; LASSERT(cli->cl_mgc_vfsmnt == NULL); /* COMPAT_146 - old config logs may have added profiles we don't know about */ if (obd->obd_type->typ_refcnt <= 1) /* Only for the last mgc */ class_del_profiles(); lprocfs_obd_cleanup(obd); ptlrpcd_decref(); rc = client_obd_cleanup(obd); RETURN(rc);}static int mgc_setup(struct obd_device *obd, obd_count len, void *buf){ struct lprocfs_static_vars lvars; int rc; ENTRY; ptlrpcd_addref(); rc = client_obd_setup(obd, len, buf); if (rc) GOTO(err_decref, rc); rc = obd_llog_init(obd, obd, 0, NULL, NULL); if (rc) { CERROR("failed to setup llogging subsystems\n"); GOTO(err_cleanup, rc); } lprocfs_mgc_init_vars(&lvars); lprocfs_obd_setup(obd, lvars.obd_vars); spin_lock(&config_list_lock); atomic_inc(&mgc_count); if (atomic_read(&mgc_count) == 1) { rq_state &= ~RQ_STOP; cfs_waitq_init(&rq_waitq); } spin_unlock(&config_list_lock); RETURN(rc);err_cleanup: client_obd_cleanup(obd);err_decref: ptlrpcd_decref(); RETURN(rc);}/* based on ll_mdc_blocking_ast */static int mgc_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc, void *data, int flag){ struct lustre_handle lockh; struct config_llog_data *cld = (struct config_llog_data *)data; int rc = 0; ENTRY; switch (flag) { case LDLM_CB_BLOCKING: /* mgs wants the lock, give it up... */ LDLM_DEBUG(lock, "MGC blocking CB"); ldlm_lock2handle(lock, &lockh); rc = ldlm_cli_cancel(&lockh); break; case LDLM_CB_CANCELING: { /* We've given up the lock, prepare ourselves to update. */ LDLM_DEBUG(lock, "MGC cancel CB"); CDEBUG(D_MGC, "Lock res "LPX64" (%.8s)\n", lock->l_resource->lr_name.name[0], (char *)&lock->l_resource->lr_name.name[0]); if (!cld) { CERROR("missing data, won't requeue\n"); break; } /* Are we done with this log? */ if (cld->cld_stopping) { CDEBUG(D_MGC, "log %s: stopping, won't requeue\n", cld->cld_logname); config_log_put(cld); break; } /* Make sure not to re-enqueue when the mgc is stopping (we get called from client_disconnect_export) */ if (!lock->l_conn_export || !lock->l_conn_export->exp_obd->u.cli.cl_conn_count) { CDEBUG(D_MGC, "log %s: disconnecting, won't requeue\n", cld->cld_logname); config_log_put(cld); break; } /* Did we fail to get the lock? */ if (lock->l_req_mode != lock->l_granted_mode) { CDEBUG(D_MGC, "log %s: original grant failed, will " "requeue later\n", cld->cld_logname); /* Try to re-enqueue later */ rc = mgc_requeue_add(cld, 1); break; } /* Re-enqueue now */ rc = mgc_requeue_add(cld, 0); break; } default: LBUG(); } if (rc) { CERROR("%s CB failed %d:\n", flag == LDLM_CB_BLOCKING ? "blocking" : "cancel", rc); LDLM_ERROR(lock, "MGC ast"); } RETURN(rc);}/* Take a config lock so we can get cancel notifications */static int mgc_enqueue(struct obd_export *exp, struct lov_stripe_md *lsm, __u32 type, ldlm_policy_data_t *policy, __u32 mode, int *flags, void *bl_cb, void *cp_cb, void *gl_cb, void *data, __u32 lvb_len, void *lvb_swabber, struct lustre_handle *lockh){ struct config_llog_data *cld = (struct config_llog_data *)data; struct ldlm_enqueue_info einfo = { type, mode, mgc_blocking_ast, ldlm_completion_ast, NULL, data}; int rc; ENTRY; CDEBUG(D_MGC, "Enqueue for %s (res "LPX64")\n", cld->cld_logname, cld->cld_resid.name[0]); /* We can only drop this config log ref when we drop the lock */ if (config_log_get(cld)) RETURN(ELDLM_LOCK_ABORTED); /* We need a callback for every lockholder, so don't try to ldlm_lock_match (see rev 1.1.2.11.2.47) */ rc = ldlm_cli_enqueue(exp, NULL, &einfo, cld->cld_resid, NULL, flags, NULL, 0, NULL, lockh, 0); /* A failed enqueue should still call the mgc_blocking_ast, where it will be requeued if needed ("grant failed"). */ RETURN(rc);}static int mgc_cancel(struct obd_export *exp, struct lov_stripe_md *md, __u32 mode, struct lustre_handle *lockh){ ENTRY; ldlm_lock_decref(lockh, mode); RETURN(0);}#if 0static int mgc_iocontrol(unsigned int cmd, struct obd_export *exp, int len, void *karg, void *uarg){ struct obd_device *obd = exp->exp_obd; struct obd_ioctl_data *data = karg; struct llog_ctxt *ctxt; struct lvfs_run_ctxt saved; int rc; ENTRY;#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) MOD_INC_USE_COUNT;#else if (!try_module_get(THIS_MODULE)) { CERROR("Can't get module. Is it alive?"); return -EINVAL; }#endif switch (cmd) { /* REPLicator context */ case OBD_IOC_PARSE: { CERROR("MGC parsing llog %s\n", data->ioc_inlbuf1); ctxt = llog_get_context(exp->exp_obd, LLOG_CONFIG_REPL_CTXT); rc = class_config_parse_llog(ctxt, data->ioc_inlbuf1, NULL); GOTO(out, rc); }#ifdef __KERNEL__ case OBD_IOC_LLOG_INFO: case OBD_IOC_LLOG_PRINT: { ctxt = llog_get_context(obd, LLOG_CONFIG_REPL_CTXT); rc = llog_ioctl(ctxt, cmd, data); GOTO(out, rc); }#endif /* ORIGinator context */ case OBD_IOC_DUMP_LOG: { ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT); push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); rc = class_config_dump_llog(ctxt, data->ioc_inlbuf1, NULL); pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); if (rc) RETURN(rc); GOTO(out, rc); } default: CERROR("mgc_ioctl(): unrecognised ioctl %#x\n", cmd); GOTO(out, rc = -ENOTTY); }out:#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) MOD_DEC_USE_COUNT;#else module_put(THIS_MODULE);#endif return rc;}#endif/* Send target_reg message to MGS */static int mgc_target_register(struct obd_export *exp, struct mgs_target_info *mti){ struct ptlrpc_request *req; struct mgs_target_info *req_mti, *rep_mti; int size[] = { sizeof(struct ptlrpc_body), sizeof(*req_mti) }; int rep_size[] = { sizeof(struct ptlrpc_body), sizeof(*mti) }; int rc; ENTRY; req = ptlrpc_prep_req(class_exp2cliimp(exp), LUSTRE_MGS_VERSION, MGS_TARGET_REG, 2, size, NULL); if (!req) RETURN(-ENOMEM); req_mti = lustre_msg_buf(req->rq_reqmsg, REQ_REC_OFF, sizeof(*req_mti)); if (!req_mti) RETURN(-ENOMEM); memcpy(req_mti, mti, sizeof(*req_mti)); ptlrpc_req_set_repsize(req, 2, rep_size); CDEBUG(D_MGC, "register %s\n", mti->mti_svname); rc = ptlrpc_queue_wait(req); if (!rc) { rep_mti = lustre_swab_repbuf(req, REPLY_REC_OFF, sizeof(*rep_mti), lustre_swab_mgs_target_info); memcpy(mti, rep_mti, sizeof(*rep_mti)); CDEBUG(D_MGC, "register %s got index = %d\n", mti->mti_svname, mti->mti_stripe_index); } ptlrpc_req_finished(req); RETURN(rc);}/* Send parameter to MGS*/static int mgc_set_mgs_param(struct obd_export *exp, struct mgs_send_param *msp){ struct ptlrpc_request *req; struct mgs_send_param *req_msp, *rep_msp; int size[] = { sizeof(struct ptlrpc_body), sizeof(*req_msp) }; int rep_size[] = { sizeof(struct ptlrpc_body), sizeof(*msp) }; int rc; ENTRY; req = ptlrpc_prep_req(class_exp2cliimp(exp), LUSTRE_MGS_VERSION, MGS_SET_INFO, 2, size, NULL); if (!req) RETURN(-ENOMEM); req_msp = lustre_msg_buf(req->rq_reqmsg, REQ_REC_OFF, sizeof(*req_msp)); if (!req_msp) RETURN(-ENOMEM); memcpy(req_msp, msp, sizeof(*req_msp)); ptlrpc_req_set_repsize(req, 2, rep_size); rc = ptlrpc_queue_wait(req); if (!rc) { rep_msp = lustre_swab_repbuf(req, REPLY_REC_OFF, sizeof(*rep_msp), NULL); memcpy(msp, rep_msp, sizeof(*rep_msp)); } ptlrpc_req_finished(req); RETURN(rc);}int mgc_set_info_async(struct obd_export *exp, obd_count keylen, void *key, obd_count vallen, void *val, struct ptlrpc_request_set *set){ struct obd_import *imp = class_exp2cliimp(exp); int rc = -EINVAL; ENTRY; /* Try to "recover" the initial connection; i.e. retry */ if (KEY_IS(KEY_INIT_RECOV)) { if (vallen != sizeof(int)) RETURN(-EINVAL); spin_lock(&imp->imp_lock); imp->imp_initial_recov = *(int *)val; spin_unlock(&imp->imp_lock); CDEBUG(D_HA, "%s: set imp_initial_recov = %d\n", exp->exp_obd->obd_name, imp->imp_initial_recov); RETURN(0); } /* Turn off initial_recov after we try all backup servers once */ if (KEY_IS(KEY_INIT_RECOV_BACKUP)) { int value; if (vallen != sizeof(int)) RETURN(-EINVAL); value = *(int *)val; spin_lock(&imp->imp_lock); imp->imp_initial_recov_bk = value > 0; /* Even after the initial connection, give up all comms if nobody answers the first time. */ imp->imp_recon_bk = 1; spin_unlock(&imp->imp_lock); CDEBUG(D_MGC, "InitRecov %s %d/%d:d%d:i%d:r%d:or%d:%s\n", imp->imp_obd->obd_name, value, imp->imp_initial_recov, imp->imp_deactive, imp->imp_invalid, imp->imp_replayable, imp->imp_obd->obd_replayable, ptlrpc_import_state_name(imp->imp_state)); /* Resurrect if we previously died */ if (imp->imp_invalid || value > 1) ptlrpc_reconnect_import(imp); RETURN(0); } /* FIXME move this to mgc_process_config */ if (KEY_IS("register_target")) { struct mgs_target_info *mti; if (vallen != sizeof(struct mgs_target_info)) RETURN(-EINVAL); mti = (struct mgs_target_info *)val; CDEBUG(D_MGC, "register_target %s %#x\n", mti->mti_svname, mti->mti_flags); rc = mgc_target_register(exp, mti); RETURN(rc); } if (KEY_IS("set_fs")) { struct super_block *sb = (struct super_block *)val; struct lustre_sb_info *lsi; if (vallen != sizeof(struct super_block)) RETURN(-EINVAL); lsi = s2lsi(sb); rc = mgc_fs_setup(exp->exp_obd, sb, lsi->lsi_srv_mnt); if (rc) { CERROR("set_fs got %d\n", rc); } RETURN(rc); } if (KEY_IS("clear_fs")) { if (vallen != 0) RETURN(-EINVAL); rc = mgc_fs_cleanup(exp->exp_obd); if (rc) { CERROR("clear_fs got %d\n", rc);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -