⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mgc_request.c

📁 lustre 1.6.5 source code
💻 C
📖 第 1 页 / 共 3 页
字号:
        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 + -