X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmdt%2Fmdt_open.c;h=0e4dfb6f775362041efab3e98e5214c3047cbb83;hb=5b31bd1b3c175172d68824fa60f237ca742e080d;hp=872bd1b22036f7d6defda30bb5476b7c137fceba;hpb=f89a61cada93accbd02beee89f0610756ca595e9;p=fs%2Flustre-release.git diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index 872bd1b..0e4dfb6 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -49,8 +49,8 @@ struct mdt_file_data *mdt_mfd_new(void) OBD_ALLOC_PTR(mfd); if (mfd != NULL) { - INIT_LIST_HEAD(&mfd->mfd_handle.h_link); - INIT_LIST_HEAD(&mfd->mfd_list); + CFS_INIT_LIST_HEAD(&mfd->mfd_handle.h_link); + CFS_INIT_LIST_HEAD(&mfd->mfd_list); class_handle_hash(&mfd->mfd_handle, mdt_mfd_get); } RETURN(mfd); @@ -125,7 +125,7 @@ void mdt_sizeonmds_enable(struct mdt_thread_info *info, { spin_lock(&info->mti_mdt->mdt_ioepoch_lock); if (info->mti_epoch->ioepoch == mo->mot_ioepoch) { - LASSERT(!mdt_epoch_opened(mo)); + LASSERT(!mdt_epoch_opened(mo)); mo->mot_ioepoch = 0; mo->mot_flags = 0; } @@ -141,7 +141,7 @@ int mdt_epoch_open(struct mdt_thread_info *info, struct mdt_object *o) int rc = 0; ENTRY; - if (!(mdt_conn_flags(info) & OBD_CONNECT_SOM) || + if (!(mdt_conn_flags(info) & OBD_CONNECT_SOM) || !S_ISREG(lu_object_attr(&o->mot_obj.mo_lu))) RETURN(0); @@ -377,7 +377,7 @@ static int mdt_mfd_open(struct mdt_thread_info *info, struct mdt_object *p, int rc = 0, isdir, isreg; ENTRY; - repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY); + repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY); isreg = S_ISREG(la->la_mode); isdir = S_ISDIR(la->la_mode); @@ -387,7 +387,7 @@ static int mdt_mfd_open(struct mdt_thread_info *info, struct mdt_object *p, * above attr get, these size might be zero, so reset it, to * retrieve the MD after create obj. */ - ma->ma_lmm_size = req_capsule_get_size(&info->mti_pill, + ma->ma_lmm_size = req_capsule_get_size(info->mti_pill, &RMF_MDT_MD, RCL_SERVER); /* in replay case, p == NULL */ @@ -451,7 +451,7 @@ static int mdt_mfd_open(struct mdt_thread_info *info, struct mdt_object *p, /* Check wheather old cookie already exist in * the list, becasue when do recovery, client * might be disconnected from server, and - * restart replay, so there maybe some orphan + * restart replay, so there maybe some orphan * mfd here, we should remove them */ LASSERT(info->mti_rr.rr_handle != NULL); old_mfd = mdt_handle2mfd(info, info->mti_rr.rr_handle); @@ -500,7 +500,7 @@ static int mdt_finish_open(struct mdt_thread_info *info, LASSERT(ma->ma_valid & MA_INODE); - repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY); + repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY); isreg = S_ISREG(la->la_mode); isdir = S_ISDIR(la->la_mode); @@ -508,7 +508,7 @@ static int mdt_finish_open(struct mdt_thread_info *info, mdt_pack_attr2body(info, repbody, la, mdt_object_fid(o)); if (med->med_rmtclient) { - void *buf = req_capsule_server_get(&info->mti_pill, &RMF_ACL); + void *buf = req_capsule_server_get(info->mti_pill, &RMF_ACL); rc = mdt_pack_remote_perm(info, o, buf); if (rc) { @@ -525,8 +525,8 @@ static int mdt_finish_open(struct mdt_thread_info *info, struct md_object *next = mdt_object_child(o); struct lu_buf *buf = &info->mti_buf; - buf->lb_buf = req_capsule_server_get(&info->mti_pill, &RMF_ACL); - buf->lb_len = req_capsule_get_size(&info->mti_pill, &RMF_ACL, + buf->lb_buf = req_capsule_server_get(info->mti_pill, &RMF_ACL); + buf->lb_len = req_capsule_get_size(info->mti_pill, &RMF_ACL, RCL_SERVER); if (buf->lb_len > 0) { rc = mo_xattr_get(env, next, buf, @@ -553,7 +553,7 @@ static int mdt_finish_open(struct mdt_thread_info *info, if (mdt->mdt_opts.mo_mds_capa) { struct lustre_capa *capa; - capa = req_capsule_server_get(&info->mti_pill, &RMF_CAPA1); + capa = req_capsule_server_get(info->mti_pill, &RMF_CAPA1); LASSERT(capa); capa->lc_opc = CAPA_OPC_MDS_DEFAULT; capa->lc_uid = 0; @@ -566,7 +566,7 @@ static int mdt_finish_open(struct mdt_thread_info *info, S_ISREG(lu_object_attr(&o->mot_obj.mo_lu))) { struct lustre_capa *capa; - capa = req_capsule_server_get(&info->mti_pill, &RMF_CAPA2); + capa = req_capsule_server_get(info->mti_pill, &RMF_CAPA2); LASSERT(capa); capa->lc_opc = CAPA_OPC_OSS_DEFAULT | capa_open_opc(flags); capa->lc_uid = 0; @@ -604,8 +604,8 @@ static int mdt_finish_open(struct mdt_thread_info *info, } else if (flags & MDS_OPEN_DIRECTORY) RETURN(-ENOTDIR); - if (MDT_FAIL_CHECK(OBD_FAIL_MDS_OPEN_CREATE)) { - obd_fail_loc = OBD_FAIL_LDLM_REPLY | OBD_FAIL_ONCE; + if (OBD_FAIL_CHECK_RESET(OBD_FAIL_MDS_OPEN_CREATE, + OBD_FAIL_LDLM_REPLY | OBD_FAIL_ONCE)) { RETURN(-EAGAIN); } @@ -640,18 +640,18 @@ static int mdt_finish_open(struct mdt_thread_info *info, RETURN(rc); } -extern void mdt_req_from_mcd(struct ptlrpc_request *req, - struct mdt_client_data *mcd); +extern void mdt_req_from_lcd(struct ptlrpc_request *req, + struct lsd_client_data *lcd); void mdt_reconstruct_open(struct mdt_thread_info *info, struct mdt_lock_handle *lhc) { const struct lu_env *env = info->mti_env; struct mdt_device *mdt = info->mti_mdt; - struct req_capsule *pill = &info->mti_pill; + struct req_capsule *pill = info->mti_pill; struct ptlrpc_request *req = mdt_info_req(info); struct mdt_export_data *med = &req->rq_export->exp_mdt_data; - struct mdt_client_data *mcd = med->med_mcd; + struct lsd_client_data *lcd = med->med_lcd; struct md_attr *ma = &info->mti_attr; struct mdt_reint_record *rr = &info->mti_rr; __u32 flags = info->mti_spec.sp_cr_flags; @@ -672,30 +672,47 @@ void mdt_reconstruct_open(struct mdt_thread_info *info, ma->ma_need = MA_INODE | MA_LOV; ma->ma_valid = 0; - mdt_req_from_mcd(req, med->med_mcd); - mdt_set_disposition(info, ldlm_rep, mcd->mcd_last_data); + mdt_req_from_lcd(req, med->med_lcd); + mdt_set_disposition(info, ldlm_rep, lcd->lcd_last_data); CERROR("This is reconstruct open: disp="LPX64", result=%d\n", ldlm_rep->lock_policy_res1, req->rq_status); if (mdt_get_disposition(ldlm_rep, DISP_OPEN_CREATE) && - req->rq_status != 0) { + req->rq_status != 0) /* We did not create successfully, return error to client. */ - mdt_shrink_reply(info); GOTO(out, rc = req->rq_status); - } if (mdt_get_disposition(ldlm_rep, DISP_OPEN_CREATE)) { + struct obd_export *exp = req->rq_export; /* * We failed after creation, but we do not know in which step * we failed. So try to check the child object. */ parent = mdt_object_find(env, mdt, rr->rr_fid1); - LASSERT(!IS_ERR(parent)); - + if (IS_ERR(parent)) { + rc = PTR_ERR(parent); + LCONSOLE_WARN("Parent "DFID" lookup error %d." + " Evicting client %s with export %s.\n", + PFID(mdt_object_fid(parent)), rc, + obd_uuid2str(&exp->exp_client_uuid), + obd_export_nid2str(exp)); + mdt_export_evict(exp); + EXIT; + return; + } child = mdt_object_find(env, mdt, rr->rr_fid2); - LASSERT(!IS_ERR(child)); - + if (IS_ERR(child)) { + rc = PTR_ERR(parent); + LCONSOLE_WARN("Child "DFID" lookup error %d." + " Evicting client %s with export %s.\n", + PFID(mdt_object_fid(child)), rc, + obd_uuid2str(&exp->exp_client_uuid), + obd_export_nid2str(exp)); + mdt_export_evict(exp); + EXIT; + return; + } rc = mdt_object_exists(child); if (rc > 0) { struct md_object *next; @@ -719,7 +736,6 @@ void mdt_reconstruct_open(struct mdt_thread_info *info, } mdt_object_put(env, parent); mdt_object_put(env, child); - mdt_shrink_reply(info); GOTO(out, rc); } else { regular_open: @@ -745,7 +761,6 @@ static int mdt_open_by_fid(struct mdt_thread_info* info, int rc; ENTRY; - LASSERT(info->mti_spec.u.sp_ea.no_lov_create); o = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid2); if (IS_ERR(o)) RETURN(rc = PTR_ERR(o)); @@ -758,13 +773,13 @@ static int mdt_open_by_fid(struct mdt_thread_info* info, rc = mo_attr_get(env, mdt_object_child(o), ma); if (rc == 0) - rc = mdt_mfd_open(info, NULL, o, flags, 0); + rc = mdt_finish_open(info, NULL, o, flags, 0, rep); } else if (rc == 0) { rc = -ENOENT; } else { /* the child object was created on remote server */ struct mdt_body *repbody; - repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY); + repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY); repbody->fid1 = *rr->rr_fid2; repbody->valid |= (OBD_MD_FLID | OBD_MD_MDS); rc = 0; @@ -846,19 +861,19 @@ int mdt_reint_open(struct mdt_thread_info *info, struct mdt_lock_handle *lhc) int created = 0; ENTRY; - OBD_FAIL_TIMEOUT(OBD_FAIL_MDS_PAUSE_OPEN | OBD_FAIL_ONCE, - (obd_timeout + 1) / 4); + OBD_FAIL_TIMEOUT_ORSET(OBD_FAIL_MDS_PAUSE_OPEN, OBD_FAIL_ONCE, + (obd_timeout + 1) / 4); - repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY); + repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY); - ma->ma_lmm = req_capsule_server_get(&info->mti_pill, &RMF_MDT_MD); - ma->ma_lmm_size = req_capsule_get_size(&info->mti_pill, &RMF_MDT_MD, + ma->ma_lmm = req_capsule_server_get(info->mti_pill, &RMF_MDT_MD); + ma->ma_lmm_size = req_capsule_get_size(info->mti_pill, &RMF_MDT_MD, RCL_SERVER); ma->ma_need = MA_INODE | MA_LOV; ma->ma_valid = 0; - LASSERT(info->mti_pill.rc_fmt == &RQF_LDLM_INTENT_OPEN); - ldlm_rep = req_capsule_server_get(&info->mti_pill, &RMF_DLM_REP); + LASSERT(info->mti_pill->rc_fmt == &RQF_LDLM_INTENT_OPEN); + ldlm_rep = req_capsule_server_get(info->mti_pill, &RMF_DLM_REP); /* TODO: JOIN file */ if (create_flags & MDS_OPEN_JOIN_FILE) { @@ -872,13 +887,17 @@ int mdt_reint_open(struct mdt_thread_info *info, struct mdt_lock_handle *lhc) PFID(rr->rr_fid2), create_flags, ma->ma_attr.la_mode, lustre_msg_get_flags(req->rq_reqmsg)); - if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) { - /* This is a replay request. */ + if ((lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) || + (req->rq_export->exp_libclient && create_flags&MDS_OPEN_HAS_EA)) { + /* This is a replay request or from liblustre with ea. */ result = mdt_open_by_fid(info, ldlm_rep); - if (result != -ENOENT) + if (result != -ENOENT) { + if (req->rq_export->exp_libclient && + create_flags&MDS_OPEN_HAS_EA) + GOTO(out, result = 0); GOTO(out, result); - + } /* * We didn't find the correct object, so we need to re-create it * via a regular replay. @@ -891,7 +910,7 @@ int mdt_reint_open(struct mdt_thread_info *info, struct mdt_lock_handle *lhc) "regular open\n"); } - if (MDT_FAIL_CHECK(OBD_FAIL_MDS_OPEN_PACK)) + if (OBD_FAIL_CHECK(OBD_FAIL_MDS_OPEN_PACK)) GOTO(out, result = err_serious(-ENOMEM)); mdt_set_disposition(info, ldlm_rep, @@ -1056,7 +1075,6 @@ out_child: out_parent: mdt_object_unlock_put(info, parent, lh, result); out: - mdt_shrink_reply(info); if (result) lustre_msg_set_transno(req->rq_repmsg, 0); return result; @@ -1088,8 +1106,8 @@ int mdt_mfd_close(struct mdt_thread_info *info, struct mdt_file_data *mfd) mdt_write_allow(info->mti_mdt, o); } else if (mode & FMODE_EPOCH) { ret = mdt_epoch_close(info, o); - } - + } + /* Update atime on close only. */ if ((mode & MDS_FMODE_EXEC || mode & FMODE_READ || mode & FMODE_WRITE) && (ma->ma_valid & MA_INODE) && (ma->ma_attr.la_valid & LA_ATIME)) { @@ -1159,26 +1177,26 @@ int mdt_close(struct mdt_thread_info *info) LASSERT(info->mti_epoch); - req_capsule_set_size(&info->mti_pill, &RMF_MDT_MD, RCL_SERVER, + req_capsule_set_size(info->mti_pill, &RMF_MDT_MD, RCL_SERVER, info->mti_mdt->mdt_max_mdsize); - req_capsule_set_size(&info->mti_pill, &RMF_LOGCOOKIES, RCL_SERVER, + req_capsule_set_size(info->mti_pill, &RMF_LOGCOOKIES, RCL_SERVER, info->mti_mdt->mdt_max_cookiesize); - rc = req_capsule_pack(&info->mti_pill); + rc = req_capsule_server_pack(info->mti_pill); if (mdt_check_resent(info, mdt_reconstruct_generic, NULL)) RETURN(lustre_msg_get_status(req->rq_repmsg)); /* Continue to close handle even if we can not pack reply */ if (rc == 0) { - repbody = req_capsule_server_get(&info->mti_pill, + repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY); - ma->ma_lmm = req_capsule_server_get(&info->mti_pill, + ma->ma_lmm = req_capsule_server_get(info->mti_pill, &RMF_MDT_MD); - ma->ma_lmm_size = req_capsule_get_size(&info->mti_pill, + ma->ma_lmm_size = req_capsule_get_size(info->mti_pill, &RMF_MDT_MD, RCL_SERVER); - ma->ma_cookie = req_capsule_server_get(&info->mti_pill, + ma->ma_cookie = req_capsule_server_get(info->mti_pill, &RMF_LOGCOOKIES); - ma->ma_cookie_size = req_capsule_get_size(&info->mti_pill, + ma->ma_cookie_size = req_capsule_get_size(info->mti_pill, &RMF_LOGCOOKIES, RCL_SERVER); ma->ma_need = MA_INODE | MA_LOV | MA_COOKIE; @@ -1213,9 +1231,12 @@ int mdt_close(struct mdt_thread_info *info) if (repbody != NULL) mdt_shrink_reply(info); - if (MDT_FAIL_CHECK(OBD_FAIL_MDS_CLOSE_PACK)) + if (OBD_FAIL_CHECK(OBD_FAIL_MDS_CLOSE_PACK)) RETURN(err_serious(-ENOMEM)); + if (OBD_FAIL_CHECK_RESET(OBD_FAIL_MDS_CLOSE_NET_REP, + OBD_FAIL_MDS_CLOSE_NET_REP)) + info->mti_fail_id = OBD_FAIL_MDS_CLOSE_NET_REP; RETURN(rc ? rc : ret); } @@ -1227,11 +1248,11 @@ int mdt_done_writing(struct mdt_thread_info *info) int rc; ENTRY; - rc = req_capsule_pack(&info->mti_pill); + rc = req_capsule_server_pack(info->mti_pill); if (rc) RETURN(err_serious(rc)); - repbody = req_capsule_server_get(&info->mti_pill, + repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY); repbody->eadatasize = 0; repbody->aclsize = 0; @@ -1253,8 +1274,8 @@ int mdt_done_writing(struct mdt_thread_info *info) ": cookie = "LPX64"\n", PFID(info->mti_rr.rr_fid1), info->mti_epoch->handle.cookie); RETURN(-ESTALE); - } - + } + LASSERT(mfd->mfd_mode == FMODE_EPOCH || mfd->mfd_mode == FMODE_EPOCHLCK); class_handle_unhash(&mfd->mfd_handle);