X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmgs%2Fmgs_handler.c;h=cdbc8d14a8f53d3c9a38ccca0844bbfbdbdad60b;hb=1dce0d2706dfe8ae4d85c33d251c9320eb484088;hp=1efe1ab90bed8abc0d45a9b1415fc1c976571e91;hpb=3192e52a89946f12fd36d28a686c169d01d36e64;p=fs%2Flustre-release.git diff --git a/lustre/mgs/mgs_handler.c b/lustre/mgs/mgs_handler.c index 1efe1ab..cdbc8d1 100644 --- a/lustre/mgs/mgs_handler.c +++ b/lustre/mgs/mgs_handler.c @@ -50,7 +50,8 @@ /* Establish a connection to the MGS.*/ static int mgs_connect(const struct lu_env *env, struct lustre_handle *conn, struct obd_device *obd, - struct obd_uuid *cluuid, struct obd_connect_data *data) + struct obd_uuid *cluuid, struct obd_connect_data *data, + void *localdata) { struct obd_export *exp; int rc; @@ -67,12 +68,19 @@ static int mgs_connect(const struct lu_env *env, exp->exp_flvr.sf_rpc = SPTLRPC_FLVR_NULL; + mgs_counter_incr(exp, LPROC_MGS_CONNECT); + if (data != NULL) { data->ocd_connect_flags &= MGS_CONNECT_SUPPORTED; exp->exp_connect_flags = data->ocd_connect_flags; data->ocd_version = LUSTRE_VERSION_CODE; } + if ((exp->exp_connect_flags & OBD_CONNECT_FID) == 0) { + CWARN("MGS requires FID support, but client not\n"); + rc = -EBADE; + } + if (rc) { class_disconnect(exp); } else { @@ -88,7 +96,9 @@ static int mgs_disconnect(struct obd_export *exp) ENTRY; LASSERT(exp); + class_export_get(exp); + mgs_counter_incr(exp, LPROC_MGS_DISCONNECT); /* Disconnect early so that clients can't keep using export */ rc = class_disconnect(exp); @@ -116,6 +126,32 @@ static int mgs_disconnect(struct obd_export *exp) static int mgs_cleanup(struct obd_device *obd); static int mgs_handle(struct ptlrpc_request *req); +static int mgs_llog_init(struct obd_device *obd, struct obd_llog_group *olg, + struct obd_device *tgt, int count, + struct llog_catid *logid, struct obd_uuid *uuid) +{ + int rc; + ENTRY; + + LASSERT(olg == &obd->obd_olg); + rc = llog_setup(obd, olg, LLOG_CONFIG_ORIG_CTXT, obd, 0, NULL, + &llog_lvfs_ops); + RETURN(rc); +} + +static int mgs_llog_finish(struct obd_device *obd, int count) +{ + struct llog_ctxt *ctxt; + int rc = 0; + ENTRY; + + ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT); + if (ctxt) + rc = llog_cleanup(ctxt); + + RETURN(rc); +} + /* Start the MGS obd */ static int mgs_setup(struct obd_device *obd, struct lustre_cfg *lcfg) { @@ -141,7 +177,7 @@ static int mgs_setup(struct obd_device *obd, struct lustre_cfg *lcfg) GOTO(err_put, rc = PTR_ERR(obd->obd_fsops)); /* namespace for mgs llog */ - obd->obd_namespace = ldlm_namespace_new("MGS", LDLM_NAMESPACE_SERVER, + obd->obd_namespace = ldlm_namespace_new(obd ,"MGS", LDLM_NAMESPACE_SERVER, LDLM_NAMESPACE_MODEST); if (obd->obd_namespace == NULL) GOTO(err_ops, rc = -ENOMEM); @@ -159,12 +195,7 @@ static int mgs_setup(struct obd_device *obd, struct lustre_cfg *lcfg) GOTO(err_ns, rc); } - rc = llog_start_commit_thread(); - if (rc < 0) - GOTO(err_fs, rc); - - rc = llog_setup(obd, NULL, LLOG_CONFIG_ORIG_CTXT, obd, 0, NULL, - &llog_lvfs_ops); + rc = obd_llog_init(obd, &obd->obd_olg, obd, 0, NULL, NULL); if (rc) GOTO(err_fs, rc); @@ -187,7 +218,7 @@ static int mgs_setup(struct obd_device *obd, struct lustre_cfg *lcfg) if (!mgs->mgs_service) { CERROR("failed to start service\n"); - GOTO(err_fs, rc = -ENOMEM); + GOTO(err_llog, rc = -ENOMEM); } rc = ptlrpc_start_threads(obd, mgs->mgs_service); @@ -208,11 +239,13 @@ static int mgs_setup(struct obd_device *obd, struct lustre_cfg *lcfg) err_thread: ptlrpc_unregister_service(mgs->mgs_service); +err_llog: + obd_llog_finish(obd, 0); err_fs: /* No extra cleanup needed for llog_init_commit_thread() */ mgs_fs_cleanup(obd); err_ns: - ldlm_namespace_free(obd->obd_namespace, 0); + ldlm_namespace_free(obd->obd_namespace, NULL, 0); obd->obd_namespace = NULL; err_ops: fsfilt_put_ops(obd->obd_fsops); @@ -232,7 +265,6 @@ static int mgs_precleanup(struct obd_device *obd, enum obd_cleanup_stage stage) case OBD_CLEANUP_EXPORTS: break; case OBD_CLEANUP_SELF_EXP: - llog_cleanup(llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT)); rc = obd_llog_finish(obd, 0); break; case OBD_CLEANUP_OBD: @@ -241,17 +273,9 @@ static int mgs_precleanup(struct obd_device *obd, enum obd_cleanup_stage stage) RETURN(rc); } -static int mgs_ldlm_nsfree(void *data) -{ - struct ldlm_namespace *ns = (struct ldlm_namespace *)data; - int rc; - ENTRY; - - ptlrpc_daemonize("ll_mgs_nsfree"); - rc = ldlm_namespace_free(ns, 1 /* obd_force should always be on */); - RETURN(rc); -} - +/** + * Performs cleanup procedures for passed \a obd given it is mgs obd. + */ static int mgs_cleanup(struct obd_device *obd) { struct mgs_obd *mgs = &obd->u.mgs; @@ -265,21 +289,14 @@ static int mgs_cleanup(struct obd_device *obd) ptlrpc_unregister_service(mgs->mgs_service); mgs_cleanup_fsdb_list(obd); - - lprocfs_obd_cleanup(obd); - mgs->mgs_proc_live = NULL; - + lproc_mgs_cleanup(obd); mgs_fs_cleanup(obd); server_put_mount(obd->obd_name, mgs->mgs_vfsmnt); mgs->mgs_sb = NULL; - /* Free the namespace in it's own thread, so that if the - ldlm_cancel_handler put the last mgs obd ref, we won't - deadlock here. */ - cfs_kernel_thread(mgs_ldlm_nsfree, obd->obd_namespace, - CLONE_VM | CLONE_FILES); - + ldlm_namespace_free(obd->obd_namespace, NULL, 1); + obd->obd_namespace = NULL; fsfilt_put_ops(obd->obd_fsops); @@ -353,13 +370,12 @@ static int mgs_handle_target_reg(struct ptlrpc_request *req) struct obd_device *obd = req->rq_export->exp_obd; struct lustre_handle lockh; struct mgs_target_info *mti, *rep_mti; - int rep_size[] = { sizeof(struct ptlrpc_body), sizeof(*mti) }; int rc = 0, lockrc; ENTRY; - mti = lustre_swab_reqbuf(req, REQ_REC_OFF, sizeof(*mti), - lustre_swab_mgs_target_info); + mgs_counter_incr(req->rq_export, LPROC_MGS_TARGET_REG); + mti = req_capsule_client_get(&req->rq_pill, &RMF_MGS_TARGET_INFO); if (!(mti->mti_flags & (LDD_F_WRITECONF | LDD_F_UPGRADE14 | LDD_F_UPDATE))) { /* We're just here as a startup ping. */ @@ -449,11 +465,13 @@ out: out_nolock: CDEBUG(D_MGS, "replying with %s, index=%d, rc=%d\n", mti->mti_svname, mti->mti_stripe_index, rc); - lustre_pack_reply(req, 2, rep_size, NULL); + rc = req_capsule_server_pack(&req->rq_pill); + if (rc) + RETURN(rc); + /* send back the whole mti in the reply */ - rep_mti = lustre_msg_buf(req->rq_repmsg, REPLY_REC_OFF, - sizeof(*rep_mti)); - memcpy(rep_mti, mti, sizeof(*rep_mti)); + rep_mti = req_capsule_server_get(&req->rq_pill, &RMF_MGS_TARGET_INFO); + *rep_mti = *mti; /* Flush logs to disk */ fsfilt_sync(obd, obd->u.mgs.mgs_sb); @@ -465,14 +483,14 @@ static int mgs_set_info_rpc(struct ptlrpc_request *req) struct obd_device *obd = req->rq_export->exp_obd; struct mgs_send_param *msp, *rep_msp; struct lustre_handle lockh; - int rep_size[] = { sizeof(struct ptlrpc_body), sizeof(*msp) }; int lockrc, rc; struct lustre_cfg_bufs bufs; struct lustre_cfg *lcfg; char fsname[MTI_NAME_MAXLEN]; ENTRY; - msp = lustre_swab_reqbuf(req, REQ_REC_OFF, sizeof(*msp), NULL); + msp = req_capsule_client_get(&req->rq_pill, &RMF_MGS_SEND_PARAM); + LASSERT(msp); /* Construct lustre_cfg structure to pass to function mgs_setparam */ lustre_cfg_bufs_reset(&bufs, NULL); @@ -500,20 +518,39 @@ static int mgs_set_info_rpc(struct ptlrpc_request *req) } lustre_cfg_free(lcfg); - lustre_pack_reply(req, 2, rep_size, NULL); - rep_msp = lustre_msg_buf(req->rq_repmsg, REPLY_REC_OFF, - sizeof(*rep_msp)); - memcpy(rep_msp, msp, sizeof(*rep_msp)); - + rc = req_capsule_server_pack(&req->rq_pill); + if (rc == 0) { + rep_msp = req_capsule_server_get(&req->rq_pill, &RMF_MGS_SEND_PARAM); + rep_msp = msp; + } RETURN(rc); } +/* Called whenever a target cleans up. */ +/* XXX - Currently unused */ +static int mgs_handle_target_del(struct ptlrpc_request *req) +{ + ENTRY; + mgs_counter_incr(req->rq_export, LPROC_MGS_TARGET_DEL); + RETURN(0); +} + +/* XXX - Currently unused */ +static int mgs_handle_exception(struct ptlrpc_request *req) +{ + ENTRY; + mgs_counter_incr(req->rq_export, LPROC_MGS_EXCEPTION); + RETURN(0); +} + +/* TODO: handle requests in a similar way as MDT: see mdt_handle_common() */ int mgs_handle(struct ptlrpc_request *req) { int fail = OBD_FAIL_MGS_ALL_REPLY_NET; int opc, rc = 0; ENTRY; + req_capsule_init(&req->rq_pill, req, RCL_SERVER); OBD_FAIL_TIMEOUT(OBD_FAIL_MGS_SLOW_REQUEST_NET, 2); LASSERT(current->journal_info == NULL); @@ -530,6 +567,8 @@ int mgs_handle(struct ptlrpc_request *req) switch (opc) { case MGS_CONNECT: DEBUG_REQ(D_MGS, req, "connect"); + /* MGS and MDS have same request format for connect */ + req_capsule_set(&req->rq_pill, &RQF_MDS_CONNECT); rc = target_handle_connect(req); if (!rc && (lustre_msg_get_conn_cnt(req->rq_reqmsg) > 1)) /* Make clients trying to reconnect after a MGS restart @@ -539,23 +578,33 @@ int mgs_handle(struct ptlrpc_request *req) break; case MGS_DISCONNECT: DEBUG_REQ(D_MGS, req, "disconnect"); + /* MGS and MDS have same request format for disconnect */ + req_capsule_set(&req->rq_pill, &RQF_MDS_DISCONNECT); rc = target_handle_disconnect(req); req->rq_status = rc; /* superfluous? */ break; + case MGS_EXCEPTION: + DEBUG_REQ(D_MGS, req, "exception"); + rc = mgs_handle_exception(req); + break; case MGS_TARGET_REG: DEBUG_REQ(D_MGS, req, "target add"); + req_capsule_set(&req->rq_pill, &RQF_MGS_TARGET_REG); rc = mgs_handle_target_reg(req); break; case MGS_TARGET_DEL: DEBUG_REQ(D_MGS, req, "target del"); - //rc = mgs_handle_target_del(req); + rc = mgs_handle_target_del(req); break; case MGS_SET_INFO: + DEBUG_REQ(D_MGS, req, "set_info"); + req_capsule_set(&req->rq_pill, &RQF_MGS_SET_INFO); rc = mgs_set_info_rpc(req); break; case LDLM_ENQUEUE: DEBUG_REQ(D_MGS, req, "enqueue"); + req_capsule_set(&req->rq_pill, &RQF_LDLM_ENQUEUE); rc = ldlm_handle_enqueue(req, ldlm_server_completion_ast, ldlm_server_blocking_ast, NULL); break; @@ -568,6 +617,7 @@ int mgs_handle(struct ptlrpc_request *req) case OBD_PING: DEBUG_REQ(D_INFO, req, "ping"); + req_capsule_set(&req->rq_pill, &RQF_OBD_PING); rc = target_handle_ping(req); break; case OBD_LOG_CANCEL: @@ -577,14 +627,19 @@ int mgs_handle(struct ptlrpc_request *req) case LLOG_ORIGIN_HANDLE_CREATE: DEBUG_REQ(D_MGS, req, "llog_init"); + req_capsule_set(&req->rq_pill, &RQF_LLOG_ORIGIN_HANDLE_CREATE); rc = llog_origin_handle_create(req); break; case LLOG_ORIGIN_HANDLE_NEXT_BLOCK: DEBUG_REQ(D_MGS, req, "llog next block"); + req_capsule_set(&req->rq_pill, + &RQF_LLOG_ORIGIN_HANDLE_NEXT_BLOCK); rc = llog_origin_handle_next_block(req); break; case LLOG_ORIGIN_HANDLE_READ_HEADER: DEBUG_REQ(D_MGS, req, "llog read header"); + req_capsule_set(&req->rq_pill, + &RQF_LLOG_ORIGIN_HANDLE_READ_HEADER); rc = llog_origin_handle_read_header(req); break; case LLOG_ORIGIN_HANDLE_CLOSE: @@ -593,6 +648,7 @@ int mgs_handle(struct ptlrpc_request *req) break; case LLOG_CATINFO: DEBUG_REQ(D_MGS, req, "llog catinfo"); + req_capsule_set(&req->rq_pill, &RQF_LLOG_CATINFO); rc = llog_catinfo(req); break; default: @@ -685,13 +741,12 @@ out_free: } case OBD_IOC_DUMP_LOG: { - struct llog_ctxt *ctxt = - llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT); + struct llog_ctxt *ctxt; + 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); + llog_ctxt_put(ctxt); RETURN(rc); } @@ -699,12 +754,13 @@ out_free: case OBD_IOC_LLOG_CHECK: case OBD_IOC_LLOG_INFO: case OBD_IOC_LLOG_PRINT: { - struct llog_ctxt *ctxt = - llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT); + struct llog_ctxt *ctxt; + ctxt = llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT); push_ctxt(&saved, &ctxt->loc_exp->exp_obd->obd_lvfs_ctxt, NULL); rc = llog_ioctl(ctxt, cmd, data); pop_ctxt(&saved, &ctxt->loc_exp->exp_obd->obd_lvfs_ctxt, NULL); + llog_ctxt_put(ctxt); RETURN(rc); } @@ -726,6 +782,8 @@ static struct obd_ops mgs_obd_ops = { .o_cleanup = mgs_cleanup, .o_destroy_export = mgs_destroy_export, .o_iocontrol = mgs_iocontrol, + .o_llog_init = mgs_llog_init, + .o_llog_finish = mgs_llog_finish }; static int __init mgs_init(void)