X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmdt%2Fmdt_open.c;h=e2e8802a26fdd0f31fcd0de931d06bd8500f6b58;hb=2a3fa6e1d1674d9a2b96854c61209618eeca42e0;hp=f5f6b8e4298cab86cec7d531045087ec3ddd7c4a;hpb=3322dcf6519854dd8bfe7fb1bf5a616c1deac898;p=fs%2Flustre-release.git diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index f5f6b8e..e2e8802 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -1,29 +1,43 @@ /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=8:tabstop=8: * - * linux/mdt/mdt_open.c - * Lustre Metadata Target (mdt) open/close file handling + * GPL HEADER START * - * Copyright (C) 2002-2006 Cluster File Systems, Inc. - * Author: Huang Hua + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * - * This file is part of the Lustre file system, http://www.lustre.org - * Lustre is a trademark of Cluster File Systems, Inc. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. * - * You may have signed or agreed to another license before downloading - * this software. If so, you are bound by the terms and conditions - * of that agreement, and the following does not apply to you. See the - * LICENSE file included with this distribution for more information. + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). * - * If you did not agree to a different license, then this copy of Lustre - * is open source software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf * - * In either case, Lustre is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * license text for more details. + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + * GPL HEADER END + */ +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Use is subject to license terms. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. + * + * lustre/mdt/mdt_open.c + * + * Lustre Metadata Target (mdt) open/close file handling + * + * Author: Huang Hua */ #ifndef EXPORT_SYMTAB @@ -31,7 +45,7 @@ #endif #define DEBUG_SUBSYSTEM S_MDS -#include +#include #include #include "mdt_internal.h" @@ -49,8 +63,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 +139,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 +155,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); @@ -194,7 +208,7 @@ static int mdt_sizeonmds_update(struct mdt_thread_info *info, * and "close", maybe someone has changed the file mode * or flags, or the file created mode do not permit wirte, * and so on. Just set MDS_PERM_BYPASS for all the cases. */ - info->mti_attr.ma_attr_flags |= MDS_PERM_BYPASS; + info->mti_attr.ma_attr_flags |= MDS_PERM_BYPASS | MDS_SOM; info->mti_attr.ma_attr.la_valid &= LA_SIZE | LA_BLOCKS | LA_ATIME | LA_MTIME | LA_CTIME; RETURN(mdt_attr_set(info, o, 0)); @@ -377,17 +391,17 @@ 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); - if ((isreg && !(ma->ma_valid & MA_LOV))) { + if (isreg && !(ma->ma_valid & MA_LOV)) { /* * No EA, check whether it is will set regEA and dirEA since in * 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 +465,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); @@ -487,8 +501,8 @@ static int mdt_finish_open(struct mdt_thread_info *info, int flags, int created, struct ldlm_reply *rep) { struct ptlrpc_request *req = mdt_info_req(info); + struct obd_export *exp = req->rq_export; struct mdt_export_data *med = &req->rq_export->exp_mdt_data; - struct mdt_device *mdt = info->mti_mdt; struct md_attr *ma = &info->mti_attr; struct lu_attr *la = &ma->ma_attr; struct mdt_file_data *mfd; @@ -500,15 +514,15 @@ 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); islnk = S_ISLNK(la->la_mode); 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); + if (exp_connect_rmtclient(exp)) { + void *buf = req_capsule_server_get(info->mti_pill, &RMF_ACL); rc = mdt_pack_remote_perm(info, o, buf); if (rc) { @@ -520,13 +534,13 @@ static int mdt_finish_open(struct mdt_thread_info *info, } } #ifdef CONFIG_FS_POSIX_ACL - else if (req->rq_export->exp_connect_flags & OBD_CONNECT_ACL) { + else if (exp->exp_connect_flags & OBD_CONNECT_ACL) { const struct lu_env *env = info->mti_env; 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, @@ -550,26 +564,26 @@ static int mdt_finish_open(struct mdt_thread_info *info, } #endif - if (mdt->mdt_opts.mo_mds_capa) { + if (info->mti_mdt->mdt_opts.mo_mds_capa && + exp->exp_connect_flags & OBD_CONNECT_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; rc = mo_capa_get(info->mti_env, mdt_object_child(o), capa, 0); if (rc) RETURN(rc); repbody->valid |= OBD_MD_FLMDSCAPA; } - if (mdt->mdt_opts.mo_oss_capa && + if (info->mti_mdt->mdt_opts.mo_oss_capa && + exp->exp_connect_flags & OBD_CONNECT_OSS_CAPA && 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; rc = mo_capa_get(info->mti_env, mdt_object_child(o), capa, 0); if (rc) RETURN(rc); @@ -604,8 +618,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 +654,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; @@ -669,33 +683,53 @@ void mdt_reconstruct_open(struct mdt_thread_info *info, ma->ma_lmm = req_capsule_server_get(pill, &RMF_MDT_MD); ma->ma_lmm_size = req_capsule_get_size(pill, &RMF_MDT_MD, RCL_SERVER); - ma->ma_need = MA_INODE | MA_LOV; + ma->ma_need = MA_INODE; + if (ma->ma_lmm_size > 0) + ma->ma_need |= 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(child); + 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 +753,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 +778,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 +790,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; @@ -842,43 +874,52 @@ 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_need = MA_INODE; + if (ma->ma_lmm_size > 0) + ma->ma_need |= 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) { - /* This is a replay request. */ + 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); - 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. @@ -968,6 +1009,7 @@ int mdt_reint_open(struct mdt_thread_info *info, struct mdt_lock_handle *lhc) * not exist. */ info->mti_spec.sp_cr_lookup = 0; + info->mti_spec.sp_feat = &dt_directory_features; result = mdo_create(info->mti_env, mdt_object_child(parent), @@ -991,8 +1033,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 @@ -1003,8 +1043,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) { @@ -1032,23 +1071,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: @@ -1056,8 +1127,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; } @@ -1088,8 +1158,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,33 +1229,34 @@ 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; repbody->eadatasize = 0; repbody->aclsize = 0; - } else + } else { rc = err_serious(rc); + } med = &req->rq_export->exp_mdt_data; spin_lock(&med->med_open_lock); @@ -1216,6 +1287,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); } @@ -1227,11 +1301,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 +1327,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); @@ -1268,4 +1342,3 @@ int mdt_done_writing(struct mdt_thread_info *info) mdt_empty_transno(info); RETURN(rc); } -