X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmdt%2Fmdt_handler.c;h=3c558ae5fd367bd7be8bee5bbedb393e6cf5d2ef;hp=f42fda555d8652eb537dce4339051b0b4aadff2f;hb=a1052417b78bc18898161c4ed44d79de4a1a2f23;hpb=f1a3b551938dad4e42555c5fbbf15ecca033666a diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index f42fda5..3c558ae 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -69,6 +69,7 @@ #include #include #include +#include mdl_mode_t mdt_mdl_lock_modes[] = { [LCK_MINMODE] = MDL_MINMODE, @@ -98,7 +99,7 @@ static int mdt_unpack_req_pack_rep(struct mdt_thread_info *info, __u32 flags); static const struct lu_object_operations mdt_obj_ops; /* Slab for MDT object allocation */ -static cfs_mem_cache_t *mdt_object_kmem; +static struct kmem_cache *mdt_object_kmem; static struct lu_kmem_descr mdt_caches[] = { { @@ -154,6 +155,13 @@ void mdt_lock_pdo_init(struct mdt_lock_handle *lh, ldlm_mode_t lm, if (name != NULL && (name[0] != '\0')) { LASSERT(namelen > 0); lh->mlh_pdo_hash = full_name_hash(name, 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)) + lh->mlh_pdo_hash = 1; } else { LASSERT(namelen == 0); lh->mlh_pdo_hash = 0ull; @@ -388,7 +396,12 @@ void mdt_pack_attr2body(struct mdt_thread_info *info, struct mdt_body *b, b->blocks = 0; /* if no object is allocated on osts, the size on mds is valid. b=22272 */ b->valid |= OBD_MD_FLSIZE | OBD_MD_FLBLOCKS; - } + } else if ((ma->ma_valid & MA_LOV) && ma->ma_lmm && + (ma->ma_lmm->lmm_pattern & LOV_PATTERN_F_RELEASED)) { + /* A released file stores its size on MDS. */ + b->blocks = 0; + b->valid |= OBD_MD_FLSIZE | OBD_MD_FLBLOCKS; + } if (fid) { b->fid1 = *fid; @@ -719,11 +732,19 @@ static int mdt_getattr_internal(struct mdt_thread_info *info, ma->ma_som = &info->mti_u.som.data; rc = mdt_attr_get_complex(info, o, ma); - if (unlikely(rc)) { - CERROR("getattr error for "DFID": %d\n", - PFID(mdt_object_fid(o)), rc); - RETURN(rc); - } + if (unlikely(rc)) { + CERROR("%s: getattr error for "DFID": rc = %d\n", + mdt_obd_name(info->mti_mdt), + PFID(mdt_object_fid(o)), rc); + RETURN(rc); + } + + /* if file is released, check if a restore is running */ + if ((ma->ma_valid & MA_HSM) && (ma->ma_hsm.mh_flags & HS_RELEASED) && + mdt_hsm_restore_is_running(info, mdt_object_fid(o))) { + repbody->t_state = MS_RESTORE; + repbody->valid |= OBD_MD_TSTATE; + } is_root = lu_fid_eq(mdt_object_fid(o), &info->mti_mdt->mdt_md_root_fid); @@ -744,8 +765,9 @@ static int mdt_getattr_internal(struct mdt_thread_info *info, rc = mdt_attr_get_lov(info, root, ma); mdt_object_put(info->mti_env, root); if (unlikely(rc)) { - CERROR("getattr error for "DFID": %d\n", - PFID(mdt_object_fid(o)), rc); + CERROR("%s: getattr error for "DFID": rc = %d\n", + mdt_obd_name(info->mti_mdt), + PFID(mdt_object_fid(o)), rc); RETURN(rc); } } @@ -770,18 +792,20 @@ static int mdt_getattr_internal(struct mdt_thread_info *info, repbody->eadatasize = ma->ma_lmv_size; repbody->valid |= (OBD_MD_FLDIREA|OBD_MD_MEA); } - } else if (S_ISLNK(la->la_mode) && - reqbody->valid & OBD_MD_LINKNAME) { - buffer->lb_buf = ma->ma_lmm; - /* eadatasize from client includes NULL-terminator, so - * there is no need to read it */ - buffer->lb_len = reqbody->eadatasize - 1; - rc = mo_readlink(env, next, buffer); - if (unlikely(rc <= 0)) { - CERROR("readlink failed: %d\n", rc); - rc = -EFAULT; - } else { - int print_limit = min_t(int, CFS_PAGE_SIZE - 128, rc); + } else if (S_ISLNK(la->la_mode) && + reqbody->valid & OBD_MD_LINKNAME) { + buffer->lb_buf = ma->ma_lmm; + /* eadatasize from client includes NULL-terminator, so + * there is no need to read it */ + buffer->lb_len = reqbody->eadatasize - 1; + rc = mo_readlink(env, next, buffer); + if (unlikely(rc <= 0)) { + CERROR("%s: readlink failed for "DFID": rc = %d\n", + mdt_obd_name(info->mti_mdt), + PFID(mdt_object_fid(o)), rc); + rc = -EFAULT; + } else { + int print_limit = min_t(int, PAGE_CACHE_SIZE - 128, rc); if (OBD_FAIL_CHECK(OBD_FAIL_MDS_READLINK_EPROTO)) rc -= 2; @@ -790,8 +814,11 @@ static int mdt_getattr_internal(struct mdt_thread_info *info, * because client expects that */ repbody->eadatasize = rc + 1; if (repbody->eadatasize != reqbody->eadatasize) - CERROR("Read shorter symlink %d, expected %d\n", - rc, reqbody->eadatasize - 1); + CDEBUG(D_INODE, "%s: Read shorter symlink %d " + "on "DFID ", expected %d\n", + mdt_obd_name(info->mti_mdt), + rc, PFID(mdt_object_fid(o)), + reqbody->eadatasize - 1); /* NULL terminate */ ((char *)ma->ma_lmm)[rc] = 0; @@ -845,9 +872,12 @@ static int mdt_getattr_internal(struct mdt_thread_info *info, rc = 0; } else if (rc == -EOPNOTSUPP) { rc = 0; - } else { - CERROR("got acl size: %d\n", rc); - } + } else { + CERROR("%s: unable to read "DFID + " ACL: rc = %d\n", + mdt_obd_name(info->mti_mdt), + PFID(mdt_object_fid(o)), rc); + } } else { repbody->aclsize = rc; repbody->valid |= OBD_MD_FLACL; @@ -932,9 +962,9 @@ int mdt_getattr(struct mdt_thread_info *info) } LASSERT(obj != NULL); - LASSERT(lu_object_assert_exists(&obj->mot_obj.mo_lu)); + LASSERT(lu_object_assert_exists(&obj->mot_obj)); - mode = lu_object_attr(&obj->mot_obj.mo_lu); + mode = lu_object_attr(&obj->mot_obj); /* old clients may not report needed easize, use max value then */ req_capsule_set_size(pill, &RMF_MDT_MD, RCL_SERVER, @@ -1206,7 +1236,7 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info, if (unlikely(!mdt_object_exists(parent))) { LU_OBJECT_DEBUG(D_INODE, info->mti_env, - &parent->mot_obj.mo_lu, + &parent->mot_obj, "Parent doesn't exist!\n"); RETURN(-ESTALE); } else if (!info->mti_cross_ref) { @@ -1266,7 +1296,7 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info, if (lname) { /* step 1: lock parent only if parent is a directory */ - if (S_ISDIR(lu_object_attr(&parent->mot_obj.mo_lu))) { + 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); rc = mdt_object_lock(info, parent, lhp, @@ -1299,35 +1329,33 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info, */ child = mdt_object_find(info->mti_env, info->mti_mdt, child_fid); - if (unlikely(IS_ERR(child))) - GOTO(out_parent, rc = PTR_ERR(child)); - if (is_resent) { - /* Do not take lock for resent case. */ - lock = ldlm_handle2lock(&lhc->mlh_reg_lh); - LASSERTF(lock != NULL, "Invalid lock handle "LPX64"\n", - lhc->mlh_reg_lh.cookie); - - res_id = &lock->l_resource->lr_name; - if (!fid_res_name_eq(mdt_object_fid(child), - &lock->l_resource->lr_name)) { - LASSERTF(fid_res_name_eq(mdt_object_fid(parent), - &lock->l_resource->lr_name), - "Lock res_id: %lu/%lu/%lu, Fid: "DFID".\n", - (unsigned long)res_id->name[0], - (unsigned long)res_id->name[1], - (unsigned long)res_id->name[2], - PFID(mdt_object_fid(parent))); - CWARN("Although resent, but still not get child lock" - "parent:"DFID" child:"DFID"\n", - PFID(mdt_object_fid(parent)), - PFID(mdt_object_fid(child))); - lustre_msg_clear_flags(req->rq_reqmsg, MSG_RESENT); - LDLM_LOCK_PUT(lock); - GOTO(relock, 0); - } - LDLM_LOCK_PUT(lock); - rc = 0; - } else { + if (unlikely(IS_ERR(child))) + GOTO(out_parent, rc = PTR_ERR(child)); + if (is_resent) { + /* Do not take lock for resent case. */ + lock = ldlm_handle2lock(&lhc->mlh_reg_lh); + LASSERTF(lock != NULL, "Invalid lock handle "LPX64"\n", + lhc->mlh_reg_lh.cookie); + + res_id = &lock->l_resource->lr_name; + if (!fid_res_name_eq(mdt_object_fid(child), + &lock->l_resource->lr_name)) { + LASSERTF(fid_res_name_eq(mdt_object_fid(parent), + &lock->l_resource->lr_name), + "Lock res_id: "DLDLMRES", fid: "DFID"\n", + PLDLMRES(lock->l_resource), + PFID(mdt_object_fid(parent))); + CWARN("Although resent, but still not get child lock" + "parent:"DFID" child:"DFID"\n", + PFID(mdt_object_fid(parent)), + PFID(mdt_object_fid(child))); + lustre_msg_clear_flags(req->rq_reqmsg, MSG_RESENT); + LDLM_LOCK_PUT(lock); + GOTO(relock, 0); + } + LDLM_LOCK_PUT(lock); + rc = 0; + } else { bool try_layout = false; relock: @@ -1337,7 +1365,7 @@ relock: if (!mdt_object_exists(child)) { LU_OBJECT_DEBUG(D_INODE, info->mti_env, - &child->mot_obj.mo_lu, + &child->mot_obj, "Object doesn't exist!\n"); GOTO(out_child, rc = -ENOENT); } @@ -1369,7 +1397,7 @@ relock: LASSERT(!(child_bits & MDS_INODELOCK_LAYOUT)); if (!OBD_FAIL_CHECK(OBD_FAIL_MDS_NO_LL_GETATTR) && exp_connect_layout(info->mti_exp) && - S_ISREG(lu_object_attr(&child->mot_obj.mo_lu)) && + S_ISREG(lu_object_attr(&child->mot_obj)) && ldlm_rep != NULL) { /* try to grant layout lock for regular file. */ try_layout = true; @@ -1409,17 +1437,15 @@ relock: rc = mdt_getattr_internal(info, child, ma_need); if (unlikely(rc != 0)) { mdt_object_unlock(info, child, lhc, 1); - } else if (lock) { - /* Debugging code. */ - res_id = &lock->l_resource->lr_name; - LDLM_DEBUG(lock, "Returning lock to client"); - LASSERTF(fid_res_name_eq(mdt_object_fid(child), - &lock->l_resource->lr_name), - "Lock res_id: %lu/%lu/%lu, Fid: "DFID".\n", - (unsigned long)res_id->name[0], - (unsigned long)res_id->name[1], - (unsigned long)res_id->name[2], - PFID(mdt_object_fid(child))); + } else if (lock) { + /* Debugging code. */ + res_id = &lock->l_resource->lr_name; + LDLM_DEBUG(lock, "Returning lock to client"); + LASSERTF(fid_res_name_eq(mdt_object_fid(child), + &lock->l_resource->lr_name), + "Lock res_id: "DLDLMRES", fid: "DFID"\n", + PLDLMRES(lock->l_resource), + PFID(mdt_object_fid(child))); if (mdt_object_exists(child) && !mdt_object_remote(child)) mdt_pack_size2body(info, child); } @@ -1616,7 +1642,7 @@ static int mdt_sendpage(struct mdt_thread_info *info, for (i = 0, tmpcount = nob; i < rdpg->rp_npages && tmpcount > 0; i++, tmpcount -= tmpsize) { - tmpsize = min_t(int, tmpcount, CFS_PAGE_SIZE); + tmpsize = min_t(int, tmpcount, PAGE_CACHE_SIZE); ptlrpc_prep_bulk_page_pin(desc, rdpg->rp_pages[i], 0, tmpsize); } @@ -1661,14 +1687,14 @@ int mdt_readpage(struct mdt_thread_info *info) rdpg->rp_attrs |= LUDA_64BITHASH; rdpg->rp_count = min_t(unsigned int, reqbody->nlink, exp_max_brw_size(info->mti_exp)); - rdpg->rp_npages = (rdpg->rp_count + CFS_PAGE_SIZE - 1) >> - CFS_PAGE_SHIFT; + rdpg->rp_npages = (rdpg->rp_count + PAGE_CACHE_SIZE - 1) >> + PAGE_CACHE_SHIFT; OBD_ALLOC(rdpg->rp_pages, rdpg->rp_npages * sizeof rdpg->rp_pages[0]); if (rdpg->rp_pages == NULL) RETURN(-ENOMEM); for (i = 0; i < rdpg->rp_npages; ++i) { - rdpg->rp_pages[i] = cfs_alloc_page(CFS_ALLOC_STD); + rdpg->rp_pages[i] = alloc_page(GFP_IOFS); if (rdpg->rp_pages[i] == NULL) GOTO(free_rdpg, rc = -ENOMEM); } @@ -1686,7 +1712,7 @@ free_rdpg: for (i = 0; i < rdpg->rp_npages; i++) if (rdpg->rp_pages[i] != NULL) - cfs_free_page(rdpg->rp_pages[i]); + __free_page(rdpg->rp_pages[i]); OBD_FREE(rdpg->rp_pages, rdpg->rp_npages * sizeof rdpg->rp_pages[0]); if (OBD_FAIL_CHECK(OBD_FAIL_MDS_SENDPAGE)) @@ -2099,14 +2125,15 @@ int mdt_obd_idx_read(struct mdt_thread_info *info) GOTO(out, rc = -EFAULT); rdpg->rp_count = min_t(unsigned int, req_ii->ii_count << LU_PAGE_SHIFT, exp_max_brw_size(info->mti_exp)); - rdpg->rp_npages = (rdpg->rp_count + CFS_PAGE_SIZE -1) >> CFS_PAGE_SHIFT; + rdpg->rp_npages = (rdpg->rp_count + PAGE_CACHE_SIZE - 1) >> + PAGE_CACHE_SHIFT; /* allocate pages to store the containers */ OBD_ALLOC(rdpg->rp_pages, rdpg->rp_npages * sizeof(rdpg->rp_pages[0])); if (rdpg->rp_pages == NULL) GOTO(out, rc = -ENOMEM); for (i = 0; i < rdpg->rp_npages; i++) { - rdpg->rp_pages[i] = cfs_alloc_page(CFS_ALLOC_STD); + rdpg->rp_pages[i] = alloc_page(GFP_IOFS); if (rdpg->rp_pages[i] == NULL) GOTO(out, rc = -ENOMEM); } @@ -2127,7 +2154,7 @@ out: if (rdpg->rp_pages) { for (i = 0; i < rdpg->rp_npages; i++) if (rdpg->rp_pages[i]) - cfs_free_page(rdpg->rp_pages[i]); + __free_page(rdpg->rp_pages[i]); OBD_FREE(rdpg->rp_pages, rdpg->rp_npages * sizeof(rdpg->rp_pages[0])); } @@ -2332,8 +2359,8 @@ int mdt_quota_dqacq(struct mdt_thread_info *info) static struct mdt_object *mdt_obj(struct lu_object *o) { - LASSERT(lu_device_is_mdt(o->lo_dev)); - return container_of0(o, struct mdt_object, mot_obj.mo_lu); + LASSERT(lu_device_is_mdt(o->lo_dev)); + return container_of0(o, struct mdt_object, mot_obj); } struct mdt_object *mdt_object_new(const struct lu_env *env, @@ -2346,7 +2373,7 @@ struct mdt_object *mdt_object_new(const struct lu_env *env, ENTRY; CDEBUG(D_INFO, "Allocate object for "DFID"\n", PFID(f)); - o = lu_object_find(env, &d->mdt_md_dev.md_lu_dev, f, &conf); + o = lu_object_find(env, &d->mdt_lu_dev, f, &conf); if (unlikely(IS_ERR(o))) m = (struct mdt_object *)o; else @@ -2355,20 +2382,21 @@ struct mdt_object *mdt_object_new(const struct lu_env *env, } struct mdt_object *mdt_object_find(const struct lu_env *env, - struct mdt_device *d, - const struct lu_fid *f) + struct mdt_device *d, + const struct lu_fid *f) { - struct lu_object *o; - struct mdt_object *m; - ENTRY; + struct lu_object *o; + struct mdt_object *m; + ENTRY; - CDEBUG(D_INFO, "Find object for "DFID"\n", PFID(f)); - o = lu_object_find(env, &d->mdt_md_dev.md_lu_dev, f, NULL); - if (unlikely(IS_ERR(o))) - m = (struct mdt_object *)o; - else - m = mdt_obj(o); - RETURN(m); + CDEBUG(D_INFO, "Find object for "DFID"\n", PFID(f)); + o = lu_object_find(env, &d->mdt_lu_dev, f, NULL); + if (unlikely(IS_ERR(o))) + m = (struct mdt_object *)o; + else + m = mdt_obj(o); + + RETURN(m); } /** @@ -2563,8 +2591,8 @@ static int mdt_object_lock0(struct mdt_thread_info *info, struct mdt_object *o, RETURN(-ESTALE); } else { /* Non-dir object shouldn't have PDO lock */ - if (!S_ISDIR(lu_object_attr(&o->mot_obj.mo_lu))) - RETURN(-ENOTDIR); + if (!S_ISDIR(lu_object_attr(&o->mot_obj))) + RETURN(-ENOTDIR); } } @@ -3336,16 +3364,21 @@ static int mdt_handle0(struct ptlrpc_request *req, if (likely(h != NULL)) { rc = mdt_req_handle(info, h, req); } else { - CERROR("The unsupported opc: 0x%x\n", - lustre_msg_get_opc(msg) ); + CERROR("%s: opc unsupported: 0x%x\n", + mdt_obd_name(info->mti_mdt), + lustre_msg_get_opc(msg)); req->rq_status = -ENOTSUPP; rc = ptlrpc_error(req); RETURN(rc); } } - } else - CERROR(LUSTRE_MDT_NAME" drops mal-formed request\n"); - RETURN(rc); + } else { + CDEBUG(D_INFO, "%s: drops mal-formed request: rc = %d\n", + mdt_obd_name(info->mti_mdt), rc); + req->rq_status = rc; + rc = ptlrpc_error(req); + } + RETURN(rc); } /* @@ -3691,8 +3724,8 @@ static int mdt_intent_getattr(enum mdt_it_code opcode, /* Get lock from request for possible resent case. */ mdt_intent_fixup_resent(info, *lockp, &new_lock, lhc); - ldlm_rep->lock_policy_res2 = - mdt_getattr_name_lock(info, lhc, child_bits, ldlm_rep); + rc = mdt_getattr_name_lock(info, lhc, child_bits, ldlm_rep); + ldlm_rep->lock_policy_res2 = clear_serious(rc); if (mdt_get_disposition(ldlm_rep, DISP_LOOKUP_NEG)) ldlm_rep->lock_policy_res2 = 0; @@ -3720,6 +3753,9 @@ static int mdt_intent_layout(enum mdt_it_code opcode, __u64 flags) { struct layout_intent *layout; + struct lu_fid *fid; + struct mdt_object *obj = NULL; + struct md_object *child = NULL; int rc; ENTRY; @@ -3729,6 +3765,26 @@ static int mdt_intent_layout(enum mdt_it_code opcode, RETURN(-EINVAL); } + fid = &info->mti_tmp_fid2; + fid_extract_from_res_name(fid, &(*lockp)->l_resource->lr_name); + + obj = mdt_object_find(info->mti_env, info->mti_mdt, fid); + if (IS_ERR(obj)) + RETURN(PTR_ERR(obj)); + + if (mdt_object_exists(obj) && !mdt_object_remote(obj)) { + child = mdt_object_child(obj); + + /* get the length of lsm */ + rc = mo_xattr_get(info->mti_env, child, &LU_BUF_NULL, + XATTR_NAME_LOV); + + if (rc > info->mti_mdt->mdt_max_mdsize) + info->mti_mdt->mdt_max_mdsize = rc; + } + + mdt_object_put(info->mti_env, obj); + (*lockp)->l_lvb_type = LVB_T_LAYOUT; req_capsule_set_size(info->mti_pill, &RMF_DLM_LVB, RCL_SERVER, ldlm_lvbo_size(*lockp)); @@ -3924,8 +3980,18 @@ static int mdt_intent_opc(long itopc, struct mdt_thread_info *info, RETURN(-EROFS); } if (rc == 0 && flv->it_act != NULL) { - /* execute policy */ - rc = flv->it_act(opc, info, lockp, flags); + struct ldlm_reply *rep; + + /* execute policy */ + rc = flv->it_act(opc, info, lockp, flags); + + /* Check whether the reply has been packed successfully. */ + if (mdt_info_req(info)->rq_repmsg != NULL) { + rep = req_capsule_server_get(info->mti_pill, + &RMF_DLM_REP); + rep->lock_policy_res2 = + ptlrpc_status_hton(rep->lock_policy_res2); + } } else { rc = -EOPNOTSUPP; } @@ -4123,7 +4189,7 @@ static int mdt_fld_init(const struct lu_env *env, static void mdt_stack_pre_fini(const struct lu_env *env, struct mdt_device *m, struct lu_device *top) { - struct obd_device *obd = mdt2obd_dev(m); + struct obd_device *obd; struct lustre_cfg_bufs *bufs; struct lustre_cfg *lcfg; struct mdt_thread_info *info; @@ -4346,8 +4412,8 @@ static int mdt_stack_init(const struct lu_env *env, struct mdt_device *mdt, site = mdt->mdt_child_exp->exp_obd->obd_lu_dev->ld_site; LASSERT(site); LASSERT(mdt_lu_site(mdt) == NULL); - mdt->mdt_md_dev.md_lu_dev.ld_site = site; - site->ls_top_dev = &mdt->mdt_md_dev.md_lu_dev; + mdt->mdt_lu_dev.ld_site = site; + site->ls_top_dev = &mdt->mdt_lu_dev; mdt->mdt_child = lu2md_dev(mdt->mdt_child_exp->exp_obd->obd_lu_dev); @@ -4364,7 +4430,7 @@ static int mdt_stack_init(const struct lu_env *env, struct mdt_device *mdt, if (rc != 0) CERROR("Failure to refill session: '%d'\n", rc); - lu_dev_add_linkage(site, &mdt->mdt_md_dev.md_lu_dev); + lu_dev_add_linkage(site, &mdt->mdt_lu_dev); EXIT; class_detach: @@ -4475,7 +4541,7 @@ static int mdt_quota_init(const struct lu_env *env, struct mdt_device *mdt, /* configure local quota objects */ rc = mdt->mdt_qmt_dev->ld_ops->ldo_prepare(env, - &mdt->mdt_md_dev.md_lu_dev, + &mdt->mdt_lu_dev, mdt->mdt_qmt_dev); if (rc) GOTO(class_cleanup, rc); @@ -4532,8 +4598,8 @@ static void mdt_quota_fini(const struct lu_env *env, struct mdt_device *mdt) static void mdt_fini(const struct lu_env *env, struct mdt_device *m) { - struct md_device *next = m->mdt_child; - struct lu_device *d = &m->mdt_md_dev.md_lu_dev; + struct md_device *next = m->mdt_child; + struct lu_device *d = &m->mdt_lu_dev; struct obd_device *obd = mdt2obd_dev(m); ENTRY; @@ -4541,8 +4607,9 @@ static void mdt_fini(const struct lu_env *env, struct mdt_device *m) ping_evictor_stop(); - mdt_stack_pre_fini(env, m, md2lu_dev(m->mdt_child)); + + mdt_llog_ctxt_unclone(env, m, LLOG_AGENT_ORIG_CTXT); mdt_llog_ctxt_unclone(env, m, LLOG_CHANGELOG_ORIG_CTXT); obd_exports_barrier(obd); obd_zombie_barrier(); @@ -4569,8 +4636,8 @@ static void mdt_fini(const struct lu_env *env, struct mdt_device *m) m->mdt_nosquash_strlen = 0; } - next->md_ops->mdo_iocontrol(env, next, OBD_IOC_PAUSE_LFSCK, - 0, NULL); + next->md_ops->mdo_iocontrol(env, next, OBD_IOC_PAUSE_LFSCK, 0, NULL); + mdt_seq_fini(env, m); mdt_fld_fini(env, m); sptlrpc_rule_set_free(&m->mdt_sptlrpc_rset); @@ -4635,7 +4702,7 @@ static int mdt_init0(const struct lu_env *env, struct mdt_device *m, mntopt_t mntopts; ENTRY; - md_device_init(&m->mdt_md_dev, ldt); + lu_device_init(&m->mdt_lu_dev, ldt); /* * Environment (env) might be missing mdt_thread_key values at that * point, if device is allocated when mdt_thread_key is in QUIESCENT @@ -4659,6 +4726,7 @@ static int mdt_init0(const struct lu_env *env, struct mdt_device *m, m->mdt_som_conf = 0; m->mdt_opts.mo_cos = MDT_COS_DEFAULT; + lmi = server_get_mount(dev); if (lmi == NULL) { CERROR("Cannot get mount info for %s!\n", dev); @@ -4692,10 +4760,10 @@ static int mdt_init0(const struct lu_env *env, struct mdt_device *m, m->mdt_enable_remote_dir = 0; m->mdt_enable_remote_dir_gid = 0; - m->mdt_md_dev.md_lu_dev.ld_ops = &mdt_lu_ops; - m->mdt_md_dev.md_lu_dev.ld_obd = obd; - /* set this lu_device to obd, because error handling need it */ - obd->obd_lu_dev = &m->mdt_md_dev.md_lu_dev; + m->mdt_lu_dev.ld_ops = &mdt_lu_ops; + m->mdt_lu_dev.ld_obd = obd; + /* Set this lu_device to obd for error handling purposes. */ + obd->obd_lu_dev = &m->mdt_lu_dev; /* init the stack */ rc = mdt_stack_init((struct lu_env *)env, m, cfg); @@ -4830,20 +4898,21 @@ static int mdt_init0(const struct lu_env *env, struct mdt_device *m, RETURN(0); err_procfs: - mdt_procfs_fini(m); + mdt_procfs_fini(m); err_recovery: - target_recovery_fini(obd); - upcall_cache_cleanup(m->mdt_identity_cache); - m->mdt_identity_cache = NULL; + target_recovery_fini(obd); + upcall_cache_cleanup(m->mdt_identity_cache); + m->mdt_identity_cache = NULL; err_llog_cleanup: - mdt_llog_ctxt_unclone(env, m, LLOG_CHANGELOG_ORIG_CTXT); - mdt_fs_cleanup(env, m); + mdt_llog_ctxt_unclone(env, m, LLOG_AGENT_ORIG_CTXT); + mdt_llog_ctxt_unclone(env, m, LLOG_CHANGELOG_ORIG_CTXT); + mdt_fs_cleanup(env, m); err_capa: - cfs_timer_disarm(&m->mdt_ck_timer); - mdt_ck_thread_stop(m); + cfs_timer_disarm(&m->mdt_ck_timer); + mdt_ck_thread_stop(m); err_free_ns: - ldlm_namespace_free(m->mdt_namespace, NULL, 0); - obd->obd_namespace = m->mdt_namespace = NULL; + ldlm_namespace_free(m->mdt_namespace, NULL, 0); + obd->obd_namespace = m->mdt_namespace = NULL; err_fini_seq: mdt_seq_fini(env, m); err_fini_fld: @@ -4851,11 +4920,11 @@ err_fini_fld: err_lut: tgt_fini(env, &m->mdt_lut); err_fini_stack: - mdt_stack_fini(env, m, md2lu_dev(m->mdt_child)); + mdt_stack_fini(env, m, md2lu_dev(m->mdt_child)); err_lmi: if (lmi) server_put_mount(dev, lmi->lmi_mnt); - return (rc); + return(rc); } /* For interoperability, the left element is old parameter, the right one @@ -4945,12 +5014,12 @@ static struct lu_object *mdt_object_alloc(const struct lu_env *env, ENTRY; - OBD_SLAB_ALLOC_PTR_GFP(mo, mdt_object_kmem, CFS_ALLOC_IO); + OBD_SLAB_ALLOC_PTR_GFP(mo, mdt_object_kmem, __GFP_IO); if (mo != NULL) { struct lu_object *o; struct lu_object_header *h; - o = &mo->mot_obj.mo_lu; + o = &mo->mot_obj; h = &mo->mot_header; lu_object_header_init(h); lu_object_init(o, h, d); @@ -4958,9 +5027,10 @@ static struct lu_object *mdt_object_alloc(const struct lu_env *env, o->lo_ops = &mdt_obj_ops; mutex_init(&mo->mot_ioepoch_mutex); mutex_init(&mo->mot_lov_mutex); - RETURN(o); - } else - RETURN(NULL); + init_rwsem(&mo->mot_open_sem); + RETURN(o); + } + RETURN(NULL); } static int mdt_object_init(const struct lu_env *env, struct lu_object *o, @@ -4995,11 +5065,14 @@ static void mdt_object_free(const struct lu_env *env, struct lu_object *o) CDEBUG(D_INFO, "object free, fid = "DFID"\n", PFID(lu_object_fid(o))); - lu_object_fini(o); - lu_object_header_fini(h); + LASSERT(atomic_read(&mo->mot_open_count) == 0); + LASSERT(atomic_read(&mo->mot_lease_count) == 0); + + lu_object_fini(o); + lu_object_header_fini(h); OBD_SLAB_FREE_PTR(mo, mdt_object_kmem); - EXIT; + EXIT; } static int mdt_object_print(const struct lu_env *env, void *cookie, @@ -5019,6 +5092,7 @@ static int mdt_prepare(const struct lu_env *env, struct mdt_device *mdt = mdt_dev(cdev); struct lu_device *next = &mdt->mdt_child->md_lu_dev; struct obd_device *obd = cdev->ld_obd; + struct lfsck_start_param lsp; int rc; ENTRY; @@ -5033,9 +5107,15 @@ static int mdt_prepare(const struct lu_env *env, if (rc) RETURN(rc); + rc = mdt_llog_ctxt_clone(env, mdt, LLOG_AGENT_ORIG_CTXT); + if (rc) + RETURN(rc); + + lsp.lsp_start = NULL; + lsp.lsp_namespace = mdt->mdt_namespace; rc = mdt->mdt_child->md_ops->mdo_iocontrol(env, mdt->mdt_child, OBD_IOC_START_LFSCK, - 0, NULL); + 0, &lsp); if (rc != 0) { CWARN("%s: auto trigger paused LFSCK failed: rc = %d\n", mdt_obd_name(mdt), rc); @@ -5048,6 +5128,7 @@ static int mdt_prepare(const struct lu_env *env, if (rc) RETURN(rc); } + LASSERT(!test_bit(MDT_FL_CFGLOG, &mdt->mdt_state)); target_recovery_init(&mdt->mdt_lut, mdt_recovery_handle); set_bit(MDT_FL_CFGLOG, &mdt->mdt_state); @@ -5535,9 +5616,7 @@ static int mdt_links_read(struct mdt_thread_info *info, if (rc < 0) return rc; - linkea_init(ldata); - - return 0; + return linkea_init(ldata); } static int mdt_path_current(struct mdt_thread_info *info, @@ -5589,7 +5668,7 @@ static int mdt_path_current(struct mdt_thread_info *info, rc = mdt_links_read(info, mdt_obj, &ldata); mdt_object_put(info->mti_env, mdt_obj); if (rc != 0) - GOTO(out, rc = PTR_ERR(buf)); + GOTO(out, rc); leh = buf->lb_buf; lee = (struct link_ea_entry *)(leh + 1); /* link #0 */ @@ -5898,19 +5977,25 @@ static int mdt_iocontrol(unsigned int cmd, struct obd_export *exp, int len, case OBD_IOC_CHANGELOG_CLEAR: rc = mdt_ioc_child(&env, mdt, cmd, len, karg); break; - case OBD_IOC_START_LFSCK: - case OBD_IOC_STOP_LFSCK: { + case OBD_IOC_START_LFSCK: { struct md_device *next = mdt->mdt_child; struct obd_ioctl_data *data = karg; + struct lfsck_start_param lsp; if (unlikely(data == NULL)) { rc = -EINVAL; break; } - rc = next->md_ops->mdo_iocontrol(&env, next, cmd, - data->ioc_inllen1, - data->ioc_inlbuf1); + lsp.lsp_start = (struct lfsck_start *)(data->ioc_inlbuf1); + lsp.lsp_namespace = mdt->mdt_namespace; + rc = next->md_ops->mdo_iocontrol(&env, next, cmd, 0, &lsp); + break; + } + case OBD_IOC_STOP_LFSCK: { + struct md_device *next = mdt->mdt_child; + + rc = next->md_ops->mdo_iocontrol(&env, next, cmd, 0, NULL); break; } case OBD_IOC_GET_OBJ_VERSION: { @@ -5982,12 +6067,13 @@ static struct lu_device* mdt_device_fini(const struct lu_env *env, static struct lu_device *mdt_device_free(const struct lu_env *env, struct lu_device *d) { - struct mdt_device *m = mdt_dev(d); - ENTRY; + struct mdt_device *m = mdt_dev(d); + ENTRY; - md_device_fini(&m->mdt_md_dev); - OBD_FREE_PTR(m); - RETURN(NULL); + lu_device_fini(&m->mdt_lu_dev); + OBD_FREE_PTR(m); + + RETURN(NULL); } static struct lu_device *mdt_device_alloc(const struct lu_env *env, @@ -6001,7 +6087,7 @@ static struct lu_device *mdt_device_alloc(const struct lu_env *env, if (m != NULL) { int rc; - l = &m->mdt_md_dev.md_lu_dev; + l = &m->mdt_lu_dev; rc = mdt_init0(env, m, t, cfg); if (rc != 0) { mdt_device_free(env, l); @@ -6096,6 +6182,10 @@ static int __init mdt_mod_init(void) struct lprocfs_static_vars lvars; int rc; + CLASSERT(sizeof("0x0123456789ABCDEF:0x01234567:0x01234567") == + FID_NOBRACE_LEN + 1); + CLASSERT(sizeof("[0x0123456789ABCDEF:0x01234567:0x01234567]") == + FID_LEN + 1); rc = lu_kmem_init(mdt_caches); if (rc) return rc;