X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmdt%2Fmdt_open.c;h=b71a9e8c83c688eccb0d56918a971316ce653c0c;hb=d0f7bd644cd0eb374b0361d020d0126183ad9a9a;hp=05c83c707bf9cb94bbb0403ce8d92b005df063db;hpb=b63da8a5e33b4b0f88e2548a8f7aca7efef6b3e8;p=fs%2Flustre-release.git diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index 05c83c7..b71a9e8 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 (OBD_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: @@ -763,7 +779,7 @@ static int mdt_open_by_fid(struct mdt_thread_info* info, } 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; @@ -841,37 +857,39 @@ int mdt_reint_open(struct mdt_thread_info *info, struct mdt_lock_handle *lhc) __u32 create_flags = info->mti_spec.sp_cr_flags; struct mdt_reint_record *rr = &info->mti_rr; struct lu_name *lname; - int result; + int result, rc; int created = 0; + __u32 msg_flags; 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) { CERROR("JOIN file will be supported soon\n"); GOTO(out, result = err_serious(-EOPNOTSUPP)); } + msg_flags = lustre_msg_get_flags(req->rq_reqmsg); CDEBUG(D_INODE, "I am going to open "DFID"/(%s->"DFID") " "cr_flag=0%o mode=0%06o msg_flag=0x%x\n", PFID(rr->rr_fid1), rr->rr_name, PFID(rr->rr_fid2), create_flags, - ma->ma_attr.la_mode, lustre_msg_get_flags(req->rq_reqmsg)); + ma->ma_attr.la_mode, msg_flags); - if ((lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) || + if (msg_flags & 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); @@ -994,8 +1012,6 @@ int mdt_reint_open(struct mdt_thread_info *info, struct mdt_lock_handle *lhc) * The object is on remote node, return its FID for remote open. */ if (result == -EREMOTE) { - int rc; - /* * Check if this lock already was sent to client and * this is resent case. For resent case do not take lock @@ -1006,8 +1022,7 @@ int mdt_reint_open(struct mdt_thread_info *info, struct mdt_lock_handle *lhc) if (lustre_handle_is_used(&lhc->mlh_reg_lh)) { struct ldlm_lock *lock; - LASSERT(lustre_msg_get_flags(req->rq_reqmsg) & - MSG_RESENT); + LASSERT(msg_flags & MSG_RESENT); lock = ldlm_handle2lock(&lhc->mlh_reg_lh); if (!lock) { @@ -1035,23 +1050,55 @@ int mdt_reint_open(struct mdt_thread_info *info, struct mdt_lock_handle *lhc) } } + LASSERT(!lustre_handle_is_used(&lhc->mlh_reg_lh)); + + /* get openlock if this is not replay and if a client requested it */ + if (!(msg_flags & MSG_REPLAY) && create_flags & MDS_OPEN_LOCK) { + ldlm_mode_t lm; + + LASSERT(!created); + if (create_flags & FMODE_WRITE) + lm = LCK_CW; + else if (create_flags & MDS_FMODE_EXEC) + lm = LCK_PR; + else + lm = LCK_CR; + mdt_lock_handle_init(lhc); + mdt_lock_reg_init(lhc, lm); + rc = mdt_object_lock(info, child, lhc, + MDS_INODELOCK_LOOKUP | MDS_INODELOCK_OPEN, + MDT_CROSS_LOCK); + if (rc) { + result = rc; + GOTO(out_child, result); + } else { + result = -EREMOTE; + mdt_set_disposition(info, ldlm_rep, DISP_OPEN_LOCK); + } + } + /* Try to open it now. */ - result = mdt_finish_open(info, parent, child, create_flags, - created, ldlm_rep); - - if (result != 0 && created) { - int rc2; - ma->ma_need = 0; - ma->ma_valid = 0; - ma->ma_cookie_size = 0; - info->mti_no_need_trans = 1; - rc2 = mdo_unlink(info->mti_env, - mdt_object_child(parent), - mdt_object_child(child), - lname, - &info->mti_attr); - if (rc2 != 0) - CERROR("Error in cleanup of open\n"); + rc = mdt_finish_open(info, parent, child, create_flags, + created, ldlm_rep); + if (rc) { + result = rc; + if (lustre_handle_is_used(&lhc->mlh_reg_lh)) + /* openlock was acquired and mdt_finish_open failed - + drop the openlock */ + mdt_object_unlock(info, child, lhc, 1); + if (created) { + ma->ma_need = 0; + ma->ma_valid = 0; + ma->ma_cookie_size = 0; + info->mti_no_need_trans = 1; + rc = mdo_unlink(info->mti_env, + mdt_object_child(parent), + mdt_object_child(child), + lname, + &info->mti_attr); + if (rc != 0) + CERROR("Error in cleanup of open\n"); + } } EXIT; out_child: @@ -1059,8 +1106,7 @@ out_child: out_parent: mdt_object_unlock_put(info, parent, lh, result); out: - mdt_shrink_reply(info); - if (result) + if (result && result != -EREMOTE) lustre_msg_set_transno(req->rq_repmsg, 0); return result; } @@ -1091,8 +1137,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)) { @@ -1162,26 +1208,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; @@ -1219,6 +1265,9 @@ int mdt_close(struct mdt_thread_info *info) 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); } @@ -1230,11 +1279,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; @@ -1256,8 +1305,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);