From fc9411313f919faa69119190eb2be0c41e460d32 Mon Sep 17 00:00:00 2001 From: tappro Date: Wed, 25 Oct 2006 19:00:33 +0000 Subject: [PATCH] - fix mds-mds connection. There was missed IBITS, ACL connetion flags and missed ibits_known field - remove second connection to the mdc0 from seq client, use the same export as mdc_device does. --- lustre/cmm/mdc_device.c | 34 +++++++++++++++++++++++++----- lustre/mdt/mdt_handler.c | 55 +++++++----------------------------------------- 2 files changed, 37 insertions(+), 52 deletions(-) diff --git a/lustre/cmm/mdc_device.c b/lustre/cmm/mdc_device.c index dada5be..af9b1b7 100644 --- a/lustre/cmm/mdc_device.c +++ b/lustre/cmm/mdc_device.c @@ -58,6 +58,18 @@ static int mdc_obd_update(struct obd_device *host, LASSERT(mc != NULL); CDEBUG(D_CONFIG, "notify %s ev=%d\n", watched->obd_name, ev); + if (ev == OBD_NOTIFY_OCD) { + struct obd_connect_data *conn_data = + &watched->u.cli.cl_import->imp_connect_data; + /* + * Update exp_connect_flags. + */ + mc->mc_desc.cl_exp->exp_connect_flags = + conn_data->ocd_connect_flags; + CDEBUG(D_INFO, "Update connect_flags: "LPX64"\n", + conn_data->ocd_connect_flags); + } + RETURN(rc); } /* MDC OBD is set up already and connected to the proper MDS @@ -72,6 +84,7 @@ static int mdc_obd_add(const struct lu_env *env, const char *uuid_str = lustre_cfg_string(cfg, 1); const char *index = lustre_cfg_string(cfg, 2); const char *mdc_uuid_str = lustre_cfg_string(cfg, 4); + struct lu_site *ls = mdc2lu_dev(mc)->ld_site; char *p; int rc = 0; @@ -106,10 +119,17 @@ static int mdc_obd_add(const struct lu_env *env, OBD_ALLOC_PTR(ocd); if (!ocd) RETURN(-ENOMEM); - /* The connection between MDS must be local */ - ocd->ocd_connect_flags = OBD_CONNECT_LCL_CLIENT | + /* + * The connection between MDS must be local, + * IBITS are needed for rename_lock (INODELOCK_UPDATE) + */ + ocd->ocd_ibits_known = MDS_INODELOCK_UPDATE; + ocd->ocd_connect_flags = OBD_CONNECT_VERSION | + OBD_CONNECT_ACL | + OBD_CONNECT_LCL_CLIENT | OBD_CONNECT_MDS_CAPA | - OBD_CONNECT_OSS_CAPA; + OBD_CONNECT_OSS_CAPA | + OBD_CONNECT_IBITS; rc = obd_connect(env, conn, mdc, &mdc->obd_uuid, ocd); OBD_FREE_PTR(ocd); if (rc) { @@ -117,7 +137,10 @@ static int mdc_obd_add(const struct lu_env *env, mdc->obd_name, rc); } else { desc->cl_exp = class_conn2export(conn); - + /* set seq controller export for MDC0 if exists */ + if (mc->mc_num == 0) + ls->ls_control_exp = + class_export_get(desc->cl_exp); rc = obd_fid_init(desc->cl_exp); if (rc) CERROR("fid init error %d \n", rc); @@ -127,6 +150,7 @@ static int mdc_obd_add(const struct lu_env *env, mdc->obd_upcall.onu_upcall = mdc_obd_update; } } + if (rc) { obd_disconnect(desc->cl_exp); desc->cl_exp = NULL; @@ -158,7 +182,7 @@ static int mdc_obd_del(const struct lu_env *env, struct mdc_device *mc, mdc_obd->obd_force = mdt_obd->obd_force; mdc_obd->obd_fail = 0; } - + rc = obd_fid_fini(desc->cl_exp); if (rc) CERROR("Fid fini error %d\n", rc); diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 48e3e1f..bf4e8fd 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -2792,28 +2792,6 @@ out_seq_fini: return rc; } - -static int mdt_md_connect(const struct lu_env *env, - struct lustre_handle *conn, - struct obd_device *mdc) -{ - struct obd_connect_data *ocd; - int rc; - - OBD_ALLOC_PTR(ocd); - if (!ocd) - RETURN(-ENOMEM); - /* The connection between MDS must be local */ - ocd->ocd_connect_flags = OBD_CONNECT_LCL_CLIENT | - OBD_CONNECT_MDS_CAPA | - OBD_CONNECT_OSS_CAPA; - rc = obd_connect(env, conn, mdc, &mdc->obd_uuid, ocd); - - OBD_FREE_PTR(ocd); - - RETURN(rc); -} - /* * Init client sequence manager which is used by local MDS to talk to sequence * controller on remote node. @@ -2863,20 +2841,8 @@ static int mdt_seq_init_cli(const struct lu_env *env, CERROR("target %s not set up\n", mdc->obd_name); rc = -EINVAL; } else { - struct lustre_handle conn = {0, }; - - CDEBUG(D_CONFIG, "connect to controller %s(%s)\n", - mdc->obd_name, mdc->obd_uuid.uuid); - - rc = mdt_md_connect(env, &conn, mdc); - if (rc) { - CERROR("target %s connect error %d\n", - mdc->obd_name, rc); - } else { - ls->ls_control_exp = class_conn2export(&conn); - + LASSERT(ls->ls_control_exp); OBD_ALLOC_PTR(ls->ls_client_seq); - if (ls->ls_client_seq != NULL) { char *prefix; @@ -2903,7 +2869,6 @@ static int mdt_seq_init_cli(const struct lu_env *env, rc = seq_server_set_cli(ls->ls_server_seq, ls->ls_client_seq, env); - } } RETURN(rc); @@ -2912,7 +2877,6 @@ static int mdt_seq_init_cli(const struct lu_env *env, static void mdt_seq_fini_cli(struct mdt_device *m) { struct lu_site *ls; - int rc; ENTRY; @@ -2923,11 +2887,7 @@ static void mdt_seq_fini_cli(struct mdt_device *m) NULL, NULL); if (ls && ls->ls_control_exp) { - rc = obd_disconnect(ls->ls_control_exp); - if (rc) { - CERROR("failure to disconnect " - "obd: %d\n", rc); - } + class_export_put(ls->ls_control_exp); ls->ls_control_exp = NULL; } EXIT; @@ -3715,11 +3675,12 @@ static int mdt_process_config(const struct lu_env *env, * Add mdc hook to get first MDT uuid and connect it to * ls->controller to use for seq manager. */ - rc = mdt_seq_init_cli(env, mdt_dev(d), cfg); - if (rc) { - CERROR("can't initialize controller export, " - "rc %d\n", rc); - } + rc = next->ld_ops->ldo_process_config(env, next, cfg); + if (rc) + CERROR("Can't add mdc, rc %d\n", rc); + else + rc = mdt_seq_init_cli(env, mdt_dev(d), cfg); + break; default: /* others are passed further */ rc = next->ld_ops->ldo_process_config(env, next, cfg); -- 1.8.3.1