X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmdt%2Fmdt_handler.c;h=bd23719ee7b7cd28225cf17888c2f94f359974d6;hp=08612087a85afee24f593e0a8e2158890847abf1;hb=78e16f885cd76bfe8e2ed3d2a15995959eee7a6f;hpb=de9df2fd1623f37a2258c037706892a00159921d diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 0861208..bd23719 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -135,21 +135,25 @@ int mdt_get_disposition(struct ldlm_reply *rep, int flag) } void mdt_clear_disposition(struct mdt_thread_info *info, - struct ldlm_reply *rep, int flag) + struct ldlm_reply *rep, int flag) { - if (info) - info->mti_opdata &= ~flag; - if (rep) - rep->lock_policy_res1 &= ~flag; + if (info) { + info->mti_opdata &= ~flag; + tgt_opdata_clear(info->mti_env, flag); + } + if (rep) + rep->lock_policy_res1 &= ~flag; } void mdt_set_disposition(struct mdt_thread_info *info, - struct ldlm_reply *rep, int flag) + struct ldlm_reply *rep, int flag) { - if (info) - info->mti_opdata |= flag; - if (rep) - rep->lock_policy_res1 |= flag; + if (info) { + info->mti_opdata |= flag; + tgt_opdata_set(info->mti_env, flag); + } + if (rep) + rep->lock_policy_res1 |= flag; } void mdt_lock_reg_init(struct mdt_lock_handle *lh, ldlm_mode_t lm) @@ -160,27 +164,28 @@ void mdt_lock_reg_init(struct mdt_lock_handle *lh, ldlm_mode_t lm) lh->mlh_type = MDT_REG_LOCK; } -void mdt_lock_pdo_init(struct mdt_lock_handle *lh, ldlm_mode_t lm, - const char *name, int namelen) +void mdt_lock_pdo_init(struct mdt_lock_handle *lh, ldlm_mode_t lock_mode, + const struct lu_name *lname) { - lh->mlh_reg_mode = lm; - lh->mlh_rreg_mode = lm; - lh->mlh_type = MDT_PDO_LOCK; + lh->mlh_reg_mode = lock_mode; + lh->mlh_rreg_mode = lock_mode; + lh->mlh_type = MDT_PDO_LOCK; - if (name != NULL && (name[0] != '\0')) { - LASSERT(namelen > 0); - lh->mlh_pdo_hash = full_name_hash(name, namelen); + if (lu_name_is_valid(lname)) { + lh->mlh_pdo_hash = full_name_hash(lname->ln_name, + lname->ln_namelen); /* XXX Workaround for LU-2856 - * Zero is a valid return value of full_name_hash, but several - * users of mlh_pdo_hash assume a non-zero hash value. We - * therefore map zero onto an arbitrary, but consistent - * value (1) to avoid problems further down the road. */ - if (unlikely(!lh->mlh_pdo_hash)) + * + * Zero is a valid return value of full_name_hash, but + * several users of mlh_pdo_hash assume a non-zero + * hash value. We therefore map zero onto an + * arbitrary, but consistent value (1) to avoid + * problems further down the road. */ + if (unlikely(lh->mlh_pdo_hash == 0)) lh->mlh_pdo_hash = 1; - } else { - LASSERT(namelen == 0); - lh->mlh_pdo_hash = 0ull; - } + } else { + lh->mlh_pdo_hash = 0; + } } static void mdt_lock_pdo_mode(struct mdt_thread_info *info, struct mdt_object *o, @@ -1217,8 +1222,6 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info, struct md_object *next = mdt_object_child(parent); struct lu_fid *child_fid = &info->mti_tmp_fid1; struct lu_name *lname = NULL; - const char *name = NULL; - int namelen = 0; struct mdt_lock_handle *lhp = NULL; struct ldlm_lock *lock; struct ldlm_res_id *res_id; @@ -1233,43 +1236,40 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info, lustre_msg_get_flags(req->rq_reqmsg) & MSG_RESENT)); LASSERT(parent != NULL); - name = req_capsule_client_get(info->mti_pill, &RMF_NAME); - if (name == NULL) - RETURN(err_serious(-EFAULT)); - namelen = req_capsule_get_size(info->mti_pill, &RMF_NAME, - RCL_CLIENT) - 1; - if (!info->mti_cross_ref) { - /* - * XXX: Check for "namelen == 0" is for getattr by fid - * (OBD_CONNECT_ATTRFID), otherwise do not allow empty name, - * that is the name must contain at least one character and - * the terminating '\0' - */ - if (namelen == 0) { - reqbody = req_capsule_client_get(info->mti_pill, - &RMF_MDT_BODY); - if (unlikely(reqbody == NULL)) - RETURN(err_serious(-EFAULT)); - - if (unlikely(!fid_is_sane(&reqbody->fid2))) - RETURN(err_serious(-EINVAL)); - - name = NULL; - CDEBUG(D_INODE, "getattr with lock for "DFID"/"DFID", " - "ldlm_rep = %p\n", - PFID(mdt_object_fid(parent)), - PFID(&reqbody->fid2), ldlm_rep); - } else { - lname = mdt_name(info->mti_env, (char *)name, namelen); - CDEBUG(D_INODE, "getattr with lock for "DFID"/%s, " - "ldlm_rep = %p\n", PFID(mdt_object_fid(parent)), - name, ldlm_rep); - } - } + lname = &info->mti_name; + mdt_name_unpack(info->mti_pill, &RMF_NAME, lname, MNF_FIX_ANON); + + if (!info->mti_cross_ref) { + /* + * XXX: Check for anonymous name is for getattr by fid + * (OBD_CONNECT_ATTRFID), otherwise do not allow empty name, + * that is the name must contain at least one character and + * the terminating '\0'. + */ + if (!lu_name_is_valid(lname)) { + reqbody = req_capsule_client_get(info->mti_pill, + &RMF_MDT_BODY); + if (unlikely(reqbody == NULL)) + RETURN(err_serious(-EFAULT)); + + if (unlikely(!fid_is_sane(&reqbody->fid2))) + RETURN(err_serious(-EINVAL)); + + CDEBUG(D_INODE, "getattr with lock for "DFID"/"DFID", " + "ldlm_rep = %p\n", + PFID(mdt_object_fid(parent)), + PFID(&reqbody->fid2), ldlm_rep); + } else { + CDEBUG(D_INODE, "getattr with lock for "DFID"/"DNAME", " + "ldlm_rep = %p\n", PFID(mdt_object_fid(parent)), + PNAME(lname), ldlm_rep); + } + } + mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_EXECD); - if (unlikely(!mdt_object_exists(parent)) && lname) { + if (unlikely(!mdt_object_exists(parent)) && lu_name_is_valid(lname)) { LU_OBJECT_DEBUG(D_INODE, info->mti_env, &parent->mot_obj, "Parent doesn't exist!\n"); @@ -1279,7 +1279,8 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info, "Parent "DFID" is on remote server\n", PFID(mdt_object_fid(parent))); } - if (lname) { + + if (lu_name_is_valid(lname)) { rc = mdt_raw_lookup(info, parent, lname, ldlm_rep); if (rc != 0) { if (rc > 0) @@ -1305,21 +1306,30 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info, LDLM_LOCK_PUT(lock); rc = 0; } else { - mdt_lock_handle_init(lhc); - mdt_lock_reg_init(lhc, LCK_PR); + mdt_lock_handle_init(lhc); + mdt_lock_reg_init(lhc, LCK_PR); - /* - * Object's name is on another MDS, no lookup lock is - * needed here but update is. - */ - child_bits &= ~MDS_INODELOCK_LOOKUP; + /* + * Object's name is on another MDS, no lookup or layout + * lock is needed here but update lock is. + */ + child_bits &= ~(MDS_INODELOCK_LOOKUP | + MDS_INODELOCK_LAYOUT); child_bits |= MDS_INODELOCK_PERM | MDS_INODELOCK_UPDATE; rc = mdt_object_lock(info, child, lhc, child_bits, - MDT_LOCAL_LOCK); - } + MDT_LOCAL_LOCK); + } if (rc == 0) { /* Finally, we can get attr for child. */ + if (!mdt_object_exists(child)) { + LU_OBJECT_DEBUG(D_INFO, info->mti_env, + &child->mot_obj, + "remote object doesn't exist.\n"); + mdt_object_unlock(info, child, lhc, 1); + RETURN(-ENOENT); + } + mdt_set_capainfo(info, 0, mdt_object_fid(child), BYPASS_CAPA); rc = mdt_getattr_internal(info, child, 0); @@ -1329,11 +1339,11 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info, RETURN(rc); } - if (lname) { - /* step 1: lock parent only if parent is a directory */ + if (lu_name_is_valid(lname)) { + /* step 1: lock parent only if parent is a directory */ if (S_ISDIR(lu_object_attr(&parent->mot_obj))) { - lhp = &info->mti_lh[MDT_LH_PARENT]; - mdt_lock_pdo_init(lhp, LCK_PR, name, namelen); + lhp = &info->mti_lh[MDT_LH_PARENT]; + mdt_lock_pdo_init(lhp, LCK_PR, lname); rc = mdt_object_lock(info, parent, lhp, MDS_INODELOCK_UPDATE, MDT_LOCAL_LOCK); @@ -1358,11 +1368,22 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info, mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_POS); } - /* - *step 3: find the child object by fid & lock it. - * regardless if it is local or remote. - */ - child = mdt_object_find(info->mti_env, info->mti_mdt, child_fid); + /* + *step 3: find the child object by fid & lock it. + * regardless if it is local or remote. + * + *Note: LU-3240 (commit 762f2114d282a98ebfa4dbbeea9298a8088ad24e) + * set parent dir fid the same as child fid in getattr by fid case + * we should not lu_object_find() the object again, could lead + * to hung if there is a concurrent unlink destroyed the object. + */ + if (lu_fid_eq(mdt_object_fid(parent), child_fid)) { + mdt_object_get(info->mti_env, parent); + child = parent; + } else { + child = mdt_object_find(info->mti_env, info->mti_mdt, + child_fid); + } if (unlikely(IS_ERR(child))) GOTO(out_parent, rc = PTR_ERR(child)); @@ -1433,7 +1454,7 @@ relock: if (!OBD_FAIL_CHECK(OBD_FAIL_MDS_NO_LL_GETATTR) && exp_connect_layout(info->mti_exp) && S_ISREG(lu_object_attr(&child->mot_obj)) && - ldlm_rep != NULL) { + !mdt_object_remote(child) && ldlm_rep != NULL) { /* try to grant layout lock for regular file. */ try_layout = true; } @@ -2265,11 +2286,13 @@ static int mdt_object_lock0(struct mdt_thread_info *info, struct mdt_object *o, if (mdt_object_remote(o)) { if (locality == MDT_CROSS_LOCK) { - ibits &= ~(MDS_INODELOCK_UPDATE | MDS_INODELOCK_PERM); + ibits &= ~(MDS_INODELOCK_UPDATE | MDS_INODELOCK_PERM | + MDS_INODELOCK_LAYOUT); ibits |= MDS_INODELOCK_LOOKUP; } else { LASSERTF(!(ibits & - (MDS_INODELOCK_UPDATE | MDS_INODELOCK_PERM)), + (MDS_INODELOCK_UPDATE | MDS_INODELOCK_PERM | + MDS_INODELOCK_LAYOUT)), "%s: wrong bit "LPX64" for remote obj "DFID"\n", mdt_obd_name(info->mti_mdt), ibits, PFID(mdt_object_fid(o))); @@ -2626,7 +2649,6 @@ void mdt_thread_info_init(struct ptlrpc_request *req, info->mti_mdt = NULL; info->mti_env = req->rq_svc_thread->t_env; info->mti_transno = lustre_msg_get_transno(req->rq_reqmsg); - info->mti_mos = NULL; memset(&info->mti_attr, 0, sizeof(info->mti_attr)); info->mti_big_buf = LU_BUF_NULL; @@ -3376,97 +3398,201 @@ static int mdt_intent_policy(struct ldlm_namespace *ns, RETURN(rc); } -static int mdt_seq_fini(const struct lu_env *env, - struct mdt_device *m) +static void mdt_deregister_seq_exp(struct mdt_device *mdt) { - return seq_site_fini(env, mdt_seq_site(m)); + struct seq_server_site *ss = mdt_seq_site(mdt); + + if (ss->ss_node_id == 0) + return; + + if (ss->ss_client_seq != NULL) { + lustre_deregister_lwp_item(&ss->ss_client_seq->lcs_exp); + ss->ss_client_seq->lcs_exp = NULL; + } + + if (ss->ss_server_fld != NULL) { + lustre_deregister_lwp_item(&ss->ss_server_fld->lsf_control_exp); + ss->ss_server_fld->lsf_control_exp = NULL; + } } -static int mdt_seq_init(const struct lu_env *env, - const char *uuid, - struct mdt_device *m) +static void mdt_seq_fini_cli(struct mdt_device *mdt) { - struct seq_server_site *ss; - char *prefix; - int rc; + struct seq_server_site *ss = mdt_seq_site(mdt); + + if (ss == NULL) + return; + + if (ss->ss_server_seq == NULL) + seq_server_set_cli(NULL, ss->ss_server_seq, NULL); + + return; +} + +static int mdt_seq_fini(const struct lu_env *env, struct mdt_device *mdt) +{ + mdt_seq_fini_cli(mdt); + mdt_deregister_seq_exp(mdt); + + return seq_site_fini(env, mdt_seq_site(mdt)); +} + +/** + * It will retrieve its FLDB entries from MDT0, and it only happens + * when upgrading existent FS to 2.6 or when local FLDB is corrupted, + * and it needs to refresh FLDB from the MDT0. + **/ +static int mdt_register_lwp_callback(void *data) +{ + struct lu_env env; + struct mdt_device *mdt = data; + struct lu_server_fld *fld = mdt_seq_site(mdt)->ss_server_fld; + int rc; ENTRY; - ss = mdt_seq_site(m); + LASSERT(mdt_seq_site(mdt)->ss_node_id != 0); - /* - * This is sequence-controller node. Init seq-controller server on local - * MDT. - */ - if (ss->ss_node_id == 0) { - LASSERT(ss->ss_control_seq == NULL); + if (!likely(fld->lsf_new)) + RETURN(0); - OBD_ALLOC_PTR(ss->ss_control_seq); - if (ss->ss_control_seq == NULL) - RETURN(-ENOMEM); + rc = lu_env_init(&env, LCT_MD_THREAD); + if (rc) { + CERROR("%s: cannot init env: rc = %d\n", mdt_obd_name(mdt), rc); + RETURN(rc); + } - rc = seq_server_init(ss->ss_control_seq, - m->mdt_bottom, uuid, - LUSTRE_SEQ_CONTROLLER, - ss, - env); + rc = fld_update_from_controller(&env, fld); + if (rc != 0) { + CERROR("%s: cannot update controller: rc = %d\n", + mdt_obd_name(mdt), rc); + GOTO(out, rc); + } +out: + lu_env_fini(&env); + RETURN(rc); +} - if (rc) - GOTO(out_seq_fini, rc); +static int mdt_register_seq_exp(struct mdt_device *mdt) +{ + struct seq_server_site *ss = mdt_seq_site(mdt); + char *lwp_name = NULL; + int rc; - OBD_ALLOC_PTR(ss->ss_client_seq); - if (ss->ss_client_seq == NULL) - GOTO(out_seq_fini, rc = -ENOMEM); + if (ss->ss_node_id == 0) + return 0; - OBD_ALLOC(prefix, MAX_OBD_NAME + 5); - if (prefix == NULL) { - OBD_FREE_PTR(ss->ss_client_seq); - GOTO(out_seq_fini, rc = -ENOMEM); - } + OBD_ALLOC(lwp_name, MAX_OBD_NAME); + if (lwp_name == NULL) + GOTO(out_free, rc = -ENOMEM); - snprintf(prefix, MAX_OBD_NAME + 5, "ctl-%s", - uuid); + rc = tgt_name2lwpname(mdt_obd_name(mdt), lwp_name); + if (rc != 0) + GOTO(out_free, rc); - /* - * Init seq-controller client after seq-controller server is - * ready. Pass ss->ss_control_seq to it for direct talking. - */ - rc = seq_client_init(ss->ss_client_seq, NULL, - LUSTRE_SEQ_METADATA, prefix, - ss->ss_control_seq); - OBD_FREE(prefix, MAX_OBD_NAME + 5); + rc = lustre_register_lwp_item(lwp_name, &ss->ss_client_seq->lcs_exp, + NULL, NULL); + if (rc != 0) + GOTO(out_free, rc); + + rc = lustre_register_lwp_item(lwp_name, + &ss->ss_server_fld->lsf_control_exp, + mdt_register_lwp_callback, mdt); + if (rc != 0) { + lustre_deregister_lwp_item(&ss->ss_client_seq->lcs_exp); + ss->ss_client_seq->lcs_exp = NULL; + GOTO(out_free, rc); + } +out_free: + if (lwp_name != NULL) + OBD_FREE(lwp_name, MAX_OBD_NAME); + + return rc; +} + +/* + * Init client sequence manager which is used by local MDS to talk to sequence + * controller on remote node. + */ +static int mdt_seq_init_cli(const struct lu_env *env, struct mdt_device *mdt) +{ + struct seq_server_site *ss = mdt_seq_site(mdt); + int rc; + char *prefix; + ENTRY; + + /* check if this is adding the first MDC and controller is not yet + * initialized. */ + OBD_ALLOC_PTR(ss->ss_client_seq); + if (ss->ss_client_seq == NULL) + RETURN(-ENOMEM); + + OBD_ALLOC(prefix, MAX_OBD_NAME + 5); + if (prefix == NULL) { + OBD_FREE_PTR(ss->ss_client_seq); + ss->ss_client_seq = NULL; + RETURN(-ENOMEM); + } + + /* Note: seq_client_fini will be called in seq_site_fini */ + snprintf(prefix, MAX_OBD_NAME + 5, "ctl-%s", mdt_obd_name(mdt)); + rc = seq_client_init(ss->ss_client_seq, NULL, LUSTRE_SEQ_METADATA, + prefix, ss->ss_node_id == 0 ? ss->ss_control_seq : + NULL); + OBD_FREE(prefix, MAX_OBD_NAME + 5); + if (rc != 0) { + OBD_FREE_PTR(ss->ss_client_seq); + ss->ss_client_seq = NULL; + RETURN(rc); + } + rc = seq_server_set_cli(env, ss->ss_server_seq, ss->ss_client_seq); + + RETURN(rc); +} + +static int mdt_seq_init(const struct lu_env *env, struct mdt_device *mdt) +{ + struct seq_server_site *ss; + int rc; + ENTRY; + + ss = mdt_seq_site(mdt); + /* init sequence controller server(MDT0) */ + if (ss->ss_node_id == 0) { + OBD_ALLOC_PTR(ss->ss_control_seq); + if (ss->ss_control_seq == NULL) + RETURN(-ENOMEM); + + rc = seq_server_init(env, ss->ss_control_seq, mdt->mdt_bottom, + mdt_obd_name(mdt), LUSTRE_SEQ_CONTROLLER, + ss); if (rc) GOTO(out_seq_fini, rc); } - /* Init seq-server on local MDT */ - LASSERT(ss->ss_server_seq == NULL); - + /* Init normal sequence server */ OBD_ALLOC_PTR(ss->ss_server_seq); if (ss->ss_server_seq == NULL) GOTO(out_seq_fini, rc = -ENOMEM); - rc = seq_server_init(ss->ss_server_seq, - m->mdt_bottom, uuid, - LUSTRE_SEQ_SERVER, - ss, - env); + rc = seq_server_init(env, ss->ss_server_seq, mdt->mdt_bottom, + mdt_obd_name(mdt), LUSTRE_SEQ_SERVER, ss); if (rc) - GOTO(out_seq_fini, rc = -ENOMEM); + GOTO(out_seq_fini, rc); - /* Assign seq-controller client to local seq-server. */ - if (ss->ss_node_id == 0) { - LASSERT(ss->ss_client_seq != NULL); + /* init seq client for seq server to talk to seq controller(MDT0) */ + rc = mdt_seq_init_cli(env, mdt); + if (rc != 0) + GOTO(out_seq_fini, rc); - rc = seq_server_set_cli(ss->ss_server_seq, - ss->ss_client_seq, - env); - } + if (ss->ss_node_id != 0) + /* register controler export through lwp */ + rc = mdt_register_seq_exp(mdt); EXIT; out_seq_fini: if (rc) - mdt_seq_fini(env, m); + mdt_seq_fini(env, mdt); return rc; } @@ -3504,7 +3630,7 @@ static int mdt_fld_init(const struct lu_env *env, RETURN(rc = -ENOMEM); rc = fld_server_init(env, ss->ss_server_fld, m->mdt_bottom, uuid, - ss->ss_node_id, LU_SEQ_RANGE_MDT); + LU_SEQ_RANGE_MDT); if (rc) { OBD_FREE_PTR(ss->ss_server_fld); ss->ss_server_fld = NULL; @@ -3687,7 +3813,7 @@ static int mdt_stack_init(const struct lu_env *env, struct mdt_device *mdt, strcpy(name, dev); p = strstr(name, "-MDT"); if (p == NULL) - GOTO(cleanup_mem, rc = -ENOMEM); + GOTO(free_bufs, rc = -ENOMEM); p[3] = 'D'; snprintf(uuid, MAX_OBD_NAME, "%s_UUID", name); @@ -3696,7 +3822,7 @@ static int mdt_stack_init(const struct lu_env *env, struct mdt_device *mdt, if (lprof == NULL || lprof->lp_dt == NULL) { CERROR("can't find the profile: %s\n", lustre_cfg_string(cfg, 0)); - GOTO(cleanup_mem, rc = -EINVAL); + GOTO(free_bufs, rc = -EINVAL); } lustre_cfg_bufs_reset(bufs, name); @@ -3735,7 +3861,7 @@ static int mdt_stack_init(const struct lu_env *env, struct mdt_device *mdt, /* connect to MDD we just setup */ rc = mdt_connect_to_next(env, mdt, name, &mdt->mdt_child_exp); if (rc) - RETURN(rc); + GOTO(class_detach, rc); site = mdt->mdt_child_exp->exp_obd->obd_lu_dev->ld_site; LASSERT(site); @@ -3749,7 +3875,7 @@ static int mdt_stack_init(const struct lu_env *env, struct mdt_device *mdt, snprintf(name, MAX_OBD_NAME, "%s-osd", dev); rc = mdt_connect_to_next(env, mdt, name, &mdt->mdt_bottom_exp); if (rc) - RETURN(rc); + GOTO(class_detach, rc); mdt->mdt_bottom = lu2dt_dev(mdt->mdt_bottom_exp->exp_obd->obd_lu_dev); @@ -4103,35 +4229,11 @@ static void mdt_fini(const struct lu_env *env, struct mdt_device *m) LASSERT(cfs_atomic_read(&d->ld_ref) == 0); - server_put_mount(mdt_obd_name(m), NULL); + server_put_mount(mdt_obd_name(m)); EXIT; } -static int mdt_adapt_sptlrpc_conf(struct obd_device *obd, int initial) -{ - struct mdt_device *m = mdt_dev(obd->obd_lu_dev); - struct sptlrpc_rule_set tmp_rset; - int rc; - - sptlrpc_rule_set_init(&tmp_rset); - rc = sptlrpc_conf_target_get_rules(obd, &tmp_rset, initial); - if (rc) { - CERROR("mdt %s: failed get sptlrpc rules: %d\n", - mdt_obd_name(m), rc); - return rc; - } - - sptlrpc_target_update_exp_flavor(obd, &tmp_rset); - - write_lock(&m->mdt_lut.lut_sptlrpc_lock); - sptlrpc_rule_set_free(&m->mdt_lut.lut_sptlrpc_rset); - m->mdt_lut.lut_sptlrpc_rset = tmp_rset; - write_unlock(&m->mdt_lut.lut_sptlrpc_lock); - - return 0; -} - int mdt_postrecov(const struct lu_env *, struct mdt_device *); static int mdt_init0(const struct lu_env *env, struct mdt_device *m, @@ -4249,7 +4351,7 @@ static int mdt_init0(const struct lu_env *env, struct mdt_device *m, if (rc) GOTO(err_fini_stack, rc); - rc = mdt_seq_init(env, mdt_obd_name(m), m); + rc = mdt_seq_init(env, m); if (rc) GOTO(err_fini_fld, rc); @@ -4292,7 +4394,7 @@ static int mdt_init0(const struct lu_env *env, struct mdt_device *m, if (rc) GOTO(err_tgt, rc); - mdt_adapt_sptlrpc_conf(obd, 1); + tgt_adapt_sptlrpc_conf(&m->mdt_lut, 1); next = m->mdt_child; rc = next->md_ops->mdo_iocontrol(env, next, OBD_IOC_GET_MNTOPT, 0, @@ -4383,7 +4485,7 @@ err_fini_stack: mdt_stack_fini(env, m, md2lu_dev(m->mdt_child)); err_lmi: if (lmi) - server_put_mount(dev, lmi->lmi_mnt); + server_put_mount(dev); return(rc); } @@ -4628,18 +4730,16 @@ static int mdt_obd_set_info_async(const struct lu_env *env, __u32 vallen, void *val, struct ptlrpc_request_set *set) { - struct obd_device *obd = exp->exp_obd; - int rc; - ENTRY; + int rc; - LASSERT(obd); + ENTRY; - if (KEY_IS(KEY_SPTLRPC_CONF)) { - rc = mdt_adapt_sptlrpc_conf(obd, 0); - RETURN(rc); - } + if (KEY_IS(KEY_SPTLRPC_CONF)) { + rc = tgt_adapt_sptlrpc_conf(class_exp2tgt(exp), 0); + RETURN(rc); + } - RETURN(0); + RETURN(0); } /** @@ -4775,7 +4875,9 @@ static int mdt_obd_connect(const struct lu_env *env, */ if (!test_bit(MDT_FL_SYNCED, &mdt->mdt_state) && data != NULL && !(data->ocd_connect_flags & OBD_CONNECT_LIGHTWEIGHT)) { - rc = obd_health_check(env, mdt->mdt_child_exp->exp_obd); + rc = obd_get_info(env, mdt->mdt_child_exp, + sizeof(KEY_OSP_CONNECTED), + KEY_OSP_CONNECTED, NULL, NULL, NULL); if (rc) RETURN(-EAGAIN); set_bit(MDT_FL_SYNCED, &mdt->mdt_state); @@ -5455,6 +5557,9 @@ static int mdt_iocontrol(unsigned int cmd, struct obd_export *exp, int len, rc = mdt_ioc_version_get(mti, karg); break; } + case OBD_IOC_CATLOGLIST: + rc = llog_catalog_list(&env, mdt->mdt_bottom, 0, karg); + break; default: rc = -EOPNOTSUPP; CERROR("%s: Not supported cmd = %d, rc = %d\n", @@ -5641,9 +5746,11 @@ static int __init mdt_mod_init(void) GOTO(lu_fini, rc); lprocfs_mdt_init_vars(&lvars); - rc = class_register_type(&mdt_obd_device_ops, NULL, - lvars.module_vars, LUSTRE_MDT_NAME, - &mdt_device_type); + rc = class_register_type(&mdt_obd_device_ops, NULL, NULL, +#ifndef HAVE_ONLY_PROCFS_SEQ + lvars.module_vars, +#endif + LUSTRE_MDT_NAME, &mdt_device_type); if (rc) GOTO(mds_fini, rc); lu_fini: