X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmdt%2Fmdt_lib.c;h=2a3b4a0645f24c2219b94fa421d559032c891c5e;hp=a4b4bcef379691dbe36fb89af276723d46b31c1d;hb=fa507031d245b08c7f24efed32819daf2aa42ab3;hpb=9cac270ab1ac1504c230abf6ebbbe5aa119de2a1 diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c index a4b4bce..2a3b4a0 100644 --- a/lustre/mdt/mdt_lib.c +++ b/lustre/mdt/mdt_lib.c @@ -1,36 +1,49 @@ /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=8:tabstop=8: * - * lustre/mdt/mdt_lib.c - * Lustre Metadata Target (mdt) request unpacking helper. + * GPL HEADER START * - * Copyright (c) 2006 Cluster File Systems, Inc. - * Author: Peter Braam - * Author: Andreas Dilger - * Author: Phil Schwan - * Author: Mike Shaver - * Author: Nikita Danilov - * Author: Huang Hua - * Author: Fan Yong + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * + * 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. * - * 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 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). * - * 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. + * 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 * - * 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. + * 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. * - * 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. + * GPL HEADER END + */ +/* + * Copyright (c) 2007, 2010, Oracle and/or its affiliates. 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_lib.c + * + * Lustre Metadata Target (mdt) request unpacking helper. + * + * Author: Peter Braam + * Author: Andreas Dilger + * Author: Phil Schwan + * Author: Mike Shaver + * Author: Nikita Danilov + * Author: Huang Hua + * Author: Fan Yong */ @@ -40,6 +53,7 @@ #define DEBUG_SUBSYSTEM S_MDS #include "mdt_internal.h" +#include typedef enum ucred_init_type { @@ -56,7 +70,7 @@ void mdt_exit_ucred(struct mdt_thread_info *info) if (uc->mu_valid != UCRED_INIT) { uc->mu_suppgids[0] = uc->mu_suppgids[1] = -1; if (uc->mu_ginfo) { - groups_free(uc->mu_ginfo); + cfs_put_group_info(uc->mu_ginfo); uc->mu_ginfo = NULL; } if (uc->mu_identity) { @@ -68,23 +82,60 @@ void mdt_exit_ucred(struct mdt_thread_info *info) } } -/* XXX: root_squash will be redesigned in Lustre 1.7. - * Do not root_squash for inter-MDS operations */ -static int mdt_root_squash(struct mdt_thread_info *info) +static int match_nosquash_list(cfs_rw_semaphore_t *sem, + cfs_list_t *nidlist, + lnet_nid_t peernid) { - return 0; + int rc; + ENTRY; + cfs_down_read(sem); + rc = cfs_match_nid(peernid, nidlist); + cfs_up_read(sem); + RETURN(rc); +} + +/* root_squash for inter-MDS operations */ +static int mdt_root_squash(struct mdt_thread_info *info, lnet_nid_t peernid) +{ + struct md_ucred *ucred = mdt_ucred(info); + ENTRY; + + if (!info->mti_mdt->mdt_squash_uid || ucred->mu_fsuid) + RETURN(0); + + if (match_nosquash_list(&info->mti_mdt->mdt_squash_sem, + &info->mti_mdt->mdt_nosquash_nids, + peernid)) { + CDEBUG(D_OTHER, "%s is in nosquash_nids list\n", + libcfs_nid2str(peernid)); + RETURN(0); + } + + CDEBUG(D_OTHER, "squash req from %s, (%d:%d/%x)=>(%d:%d/%x)\n", + libcfs_nid2str(peernid), + ucred->mu_fsuid, ucred->mu_fsgid, ucred->mu_cap, + info->mti_mdt->mdt_squash_uid, info->mti_mdt->mdt_squash_gid, + 0); + + ucred->mu_fsuid = info->mti_mdt->mdt_squash_uid; + ucred->mu_fsgid = info->mti_mdt->mdt_squash_gid; + ucred->mu_cap = 0; + ucred->mu_suppgids[0] = -1; + ucred->mu_suppgids[1] = -1; + + RETURN(0); } static int new_init_ucred(struct mdt_thread_info *info, ucred_init_type_t type, void *buf) { struct ptlrpc_request *req = mdt_info_req(info); - struct mdt_export_data *med = mdt_req2med(req); struct mdt_device *mdt = info->mti_mdt; struct ptlrpc_user_desc *pud = req->rq_user_desc; struct md_ucred *ucred = mdt_ucred(info); lnet_nid_t peernid = req->rq_peer.nid; __u32 perm = 0; + __u32 remote = exp_connect_rmtclient(info->mti_exp); int setuid; int setgid; int rc = 0; @@ -94,7 +145,7 @@ static int new_init_ucred(struct mdt_thread_info *info, ucred_init_type_t type, LASSERT(req->rq_auth_gss); LASSERT(!req->rq_auth_usr_mdt); LASSERT(req->rq_user_desc); - + ucred->mu_valid = UCRED_INVALID; ucred->mu_o_uid = pud->pud_uid; @@ -110,7 +161,7 @@ static int new_init_ucred(struct mdt_thread_info *info, ucred_init_type_t type, } /* sanity check: we expect the uid which client claimed is true */ - if (med->med_rmtclient) { + if (remote) { if (req->rq_auth_mapped_uid == INVALID_UID) { CDEBUG(D_SEC, "remote user not mapped, deny access!\n"); RETURN(-EACCES); @@ -140,7 +191,7 @@ static int new_init_ucred(struct mdt_thread_info *info, ucred_init_type_t type, } if (is_identity_get_disabled(mdt->mdt_identity_cache)) { - if (med->med_rmtclient) { + if (remote) { CDEBUG(D_SEC, "remote client must run with identity_get " "enabled!\n"); RETURN(-EACCES); @@ -156,7 +207,7 @@ static int new_init_ucred(struct mdt_thread_info *info, ucred_init_type_t type, pud->pud_uid); if (IS_ERR(identity)) { if (unlikely(PTR_ERR(identity) == -EREMCHG && - !med->med_rmtclient)) { + !remote)) { ucred->mu_identity = NULL; perm = CFS_SETUID_PERM | CFS_SETGID_PERM | CFS_SETGRP_PERM; @@ -168,8 +219,7 @@ static int new_init_ucred(struct mdt_thread_info *info, ucred_init_type_t type, } else { ucred->mu_identity = identity; perm = mdt_identity_get_perm(ucred->mu_identity, - med->med_rmtclient, - peernid); + remote, peernid); } } @@ -198,10 +248,10 @@ static int new_init_ucred(struct mdt_thread_info *info, ucred_init_type_t type, /* * NB: remote client not allowed to setgroups anyway. */ - if (!med->med_rmtclient && perm & CFS_SETGRP_PERM) { + if (!remote && perm & CFS_SETGRP_PERM) { if (pud->pud_ngroups) { /* setgroups for local client */ - ucred->mu_ginfo = groups_alloc(pud->pud_ngroups); + ucred->mu_ginfo = cfs_groups_alloc(pud->pud_ngroups); if (!ucred->mu_ginfo) { CERROR("failed to alloc %d groups\n", pud->pud_ngroups); @@ -225,14 +275,17 @@ static int new_init_ucred(struct mdt_thread_info *info, ucred_init_type_t type, ucred->mu_fsuid = pud->pud_fsuid; ucred->mu_fsgid = pud->pud_fsgid; - /* XXX: need to process root_squash here. */ - mdt_root_squash(info); + /* process root_squash here. */ + mdt_root_squash(info, peernid); - /* remove fs privilege for non-root user */ + /* remove fs privilege for non-root user. */ if (ucred->mu_fsuid) - ucred->mu_cap = pud->pud_cap & ~CAP_FS_MASK; + ucred->mu_cap = pud->pud_cap & ~CFS_CAP_FS_MASK; else ucred->mu_cap = pud->pud_cap; + if (remote && !(perm & CFS_RMTOWN_PERM)) + ucred->mu_cap &= ~(CFS_CAP_SYS_RESOURCE_MASK | + CFS_CAP_CHOWN_MASK); ucred->mu_valid = UCRED_NEW; EXIT; @@ -240,7 +293,7 @@ static int new_init_ucred(struct mdt_thread_info *info, ucred_init_type_t type, out: if (rc) { if (ucred->mu_ginfo) { - groups_free(ucred->mu_ginfo); + cfs_put_group_info(ucred->mu_ginfo); ucred->mu_ginfo = NULL; } if (ucred->mu_identity) { @@ -256,13 +309,13 @@ out: int mdt_check_ucred(struct mdt_thread_info *info) { struct ptlrpc_request *req = mdt_info_req(info); - struct mdt_export_data *med = mdt_req2med(req); struct mdt_device *mdt = info->mti_mdt; struct ptlrpc_user_desc *pud = req->rq_user_desc; struct md_ucred *ucred = mdt_ucred(info); struct md_identity *identity = NULL; lnet_nid_t peernid = req->rq_peer.nid; __u32 perm = 0; + __u32 remote = exp_connect_rmtclient(info->mti_exp); int setuid; int setgid; int rc = 0; @@ -277,7 +330,7 @@ int mdt_check_ucred(struct mdt_thread_info *info) /* sanity check: if we use strong authentication, we expect the * uid which client claimed is true */ - if (med->med_rmtclient) { + if (remote) { if (req->rq_auth_mapped_uid == INVALID_UID) { CDEBUG(D_SEC, "remote user not mapped, deny access!\n"); RETURN(-EACCES); @@ -307,7 +360,7 @@ int mdt_check_ucred(struct mdt_thread_info *info) } if (is_identity_get_disabled(mdt->mdt_identity_cache)) { - if (med->med_rmtclient) { + if (remote) { CDEBUG(D_SEC, "remote client must run with identity_get " "enabled!\n"); RETURN(-EACCES); @@ -318,7 +371,7 @@ int mdt_check_ucred(struct mdt_thread_info *info) identity = mdt_identity_get(mdt->mdt_identity_cache, pud->pud_uid); if (IS_ERR(identity)) { if (unlikely(PTR_ERR(identity) == -EREMCHG && - !med->med_rmtclient)) { + !remote)) { RETURN(0); } else { CDEBUG(D_SEC, "Deny access without identity: uid %u\n", @@ -327,7 +380,7 @@ int mdt_check_ucred(struct mdt_thread_info *info) } } - perm = mdt_identity_get_perm(identity, med->med_rmtclient, peernid); + perm = mdt_identity_get_perm(identity, remote, peernid); /* find out the setuid/setgid attempt */ setuid = (pud->pud_uid != pud->pud_fsuid); setgid = (pud->pud_gid != pud->pud_fsgid || @@ -388,12 +441,12 @@ static int old_init_ucred(struct mdt_thread_info *info, } uc->mu_identity = identity; - /* XXX: need to process root_squash here. */ - mdt_root_squash(info); + /* process root_squash here. */ + mdt_root_squash(info, mdt_info_req(info)->rq_peer.nid); - /* remove fs privilege for non-root user */ + /* remove fs privilege for non-root user. */ if (uc->mu_fsuid) - uc->mu_cap = body->capability & ~CAP_FS_MASK; + uc->mu_cap = body->capability & ~CFS_CAP_FS_MASK; else uc->mu_cap = body->capability; uc->mu_valid = UCRED_OLD; @@ -428,12 +481,12 @@ static int old_init_ucred_reint(struct mdt_thread_info *info) } uc->mu_identity = identity; - /* XXX: need to process root_squash here. */ - mdt_root_squash(info); + /* process root_squash here. */ + mdt_root_squash(info, mdt_info_req(info)->rq_peer.nid); - /* remove fs privilege for non-root user */ + /* remove fs privilege for non-root user. */ if (uc->mu_fsuid) - uc->mu_cap &= ~CAP_FS_MASK; + uc->mu_cap &= ~CFS_CAP_FS_MASK; uc->mu_valid = UCRED_OLD; RETURN(0); @@ -489,7 +542,7 @@ void mdt_dump_lmm(int level, const struct lov_mds_md *lmm) for (i = 0, lod = lmm->lmm_objects; i < stripe_count; i++, lod++) { CDEBUG(level, "stripe %u idx %u subobj "LPX64"/"LPX64"\n", i, le32_to_cpu(lod->l_ost_idx), - le64_to_cpu(lod->l_object_gr), + le64_to_cpu(lod->l_object_seq), le64_to_cpu(lod->l_object_id)); } } @@ -512,11 +565,17 @@ void mdt_shrink_reply(struct mdt_thread_info *info) acl_size = body->aclsize; - CDEBUG(D_INFO, "Shrink to md_size = %d cookie/acl_size = %d" - " MDSCAPA = "LPX64", OSSCAPA = "LPX64"\n", + /* this replay - not send info to client */ + if (info->mti_spec.no_create == 1) { + md_size = 0; + acl_size = 0; + } + + CDEBUG(D_INFO, "Shrink to md_size = %d cookie/acl_size = %d" + " MDSCAPA = %llx, OSSCAPA = %llx\n", md_size, acl_size, - body->valid & OBD_MD_FLMDSCAPA, - body->valid & OBD_MD_FLOSSCAPA); + (unsigned long long)(body->valid & OBD_MD_FLMDSCAPA), + (unsigned long long)(body->valid & OBD_MD_FLOSSCAPA)); /* &RMF_MDT_BODY, &RMF_MDT_MD, @@ -533,14 +592,14 @@ void mdt_shrink_reply(struct mdt_thread_info *info) req_capsule_shrink(pill, &RMF_ACL, acl_size, RCL_SERVER); else if (req_capsule_has_field(pill, &RMF_LOGCOOKIES, RCL_SERVER)) req_capsule_shrink(pill, &RMF_LOGCOOKIES, - acl_size, RCL_SERVER); + acl_size, RCL_SERVER); if (req_capsule_has_field(pill, &RMF_CAPA1, RCL_SERVER) && - !(body->valid & OBD_MD_FLMDSCAPA)) + !(body->valid & OBD_MD_FLMDSCAPA)) req_capsule_shrink(pill, &RMF_CAPA1, 0, RCL_SERVER); if (req_capsule_has_field(pill, &RMF_CAPA2, RCL_SERVER) && - !(body->valid & OBD_MD_FLOSSCAPA)) + !(body->valid & OBD_MD_FLOSSCAPA)) req_capsule_shrink(pill, &RMF_CAPA2, 0, RCL_SERVER); /* @@ -558,6 +617,7 @@ int mdt_handle_last_unlink(struct mdt_thread_info *info, struct mdt_object *mo, { struct mdt_body *repbody; const struct lu_attr *la = &ma->ma_attr; + int rc; ENTRY; repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY); @@ -592,6 +652,21 @@ int mdt_handle_last_unlink(struct mdt_thread_info *info, struct mdt_object *mo, repbody->valid |= OBD_MD_FLCOOKIE; } + if (info->mti_mdt->mdt_opts.mo_oss_capa && + info->mti_exp->exp_connect_flags & OBD_CONNECT_OSS_CAPA && + repbody->valid & OBD_MD_FLEASIZE) { + struct lustre_capa *capa; + + capa = req_capsule_server_get(info->mti_pill, &RMF_CAPA2); + LASSERT(capa); + capa->lc_opc = CAPA_OPC_OSS_DESTROY; + rc = mo_capa_get(info->mti_env, mdt_object_child(mo), capa, 0); + if (rc) + RETURN(rc); + + repbody->valid |= OBD_MD_FLOSSCAPA; + } + RETURN(0); } @@ -670,13 +745,17 @@ static __u64 mdt_attr_valid_xlate(__u64 in, struct mdt_reint_record *rr, if (in & MDS_OPEN_OWNEROVERRIDE) ma->ma_attr_flags |= MDS_OPEN_OWNEROVERRIDE; + if (in & (ATTR_KILL_SUID|ATTR_KILL_SGID)) + ma->ma_attr_flags |= MDS_PERM_BYPASS; + /*XXX need ATTR_RAW?*/ in &= ~(ATTR_MODE|ATTR_UID|ATTR_GID|ATTR_SIZE|ATTR_BLOCKS| ATTR_ATIME|ATTR_MTIME|ATTR_CTIME|ATTR_FROM_OPEN| ATTR_ATIME_SET|ATTR_CTIME_SET|ATTR_MTIME_SET| - ATTR_ATTR_FLAG|ATTR_RAW|MDS_OPEN_OWNEROVERRIDE); + ATTR_ATTR_FLAG|ATTR_RAW|MDS_OPEN_OWNEROVERRIDE| + ATTR_FORCE|ATTR_KILL_SUID|ATTR_KILL_SGID); if (in != 0) - CERROR("Unknown attr bits: %#llx\n", in); + CERROR("Unknown attr bits: "LPX64"\n", in); return out; } /* unpacking */ @@ -722,16 +801,17 @@ static int mdt_setattr_unpack_rec(struct mdt_thread_info *info) RETURN(0); } -static int mdt_epoch_unpack(struct mdt_thread_info *info) +static int mdt_ioepoch_unpack(struct mdt_thread_info *info) { struct req_capsule *pill = info->mti_pill; ENTRY; if (req_capsule_get_size(pill, &RMF_MDT_EPOCH, RCL_CLIENT)) - info->mti_epoch = req_capsule_client_get(pill, &RMF_MDT_EPOCH); + info->mti_ioepoch = + req_capsule_client_get(pill, &RMF_MDT_EPOCH); else - info->mti_epoch = NULL; - RETURN(info->mti_epoch == NULL ? -EFAULT : 0); + info->mti_ioepoch = NULL; + RETURN(info->mti_ioepoch == NULL ? -EFAULT : 0); } static inline int mdt_dlmreq_unpack(struct mdt_thread_info *info) { @@ -742,7 +822,7 @@ static inline int mdt_dlmreq_unpack(struct mdt_thread_info *info) { if (info->mti_dlm_req == NULL) RETURN(-EFAULT); } - + RETURN(0); } @@ -758,7 +838,7 @@ static int mdt_setattr_unpack(struct mdt_thread_info *info) RETURN(rc); /* Epoch may be absent */ - mdt_epoch_unpack(info); + mdt_ioepoch_unpack(info); ma->ma_lmm_size = req_capsule_get_size(pill, &RMF_EADATA, RCL_CLIENT); if (ma->ma_lmm_size) { @@ -782,7 +862,7 @@ int mdt_close_unpack(struct mdt_thread_info *info) int rc; ENTRY; - rc = mdt_epoch_unpack(info); + rc = mdt_ioepoch_unpack(info); if (rc) RETURN(rc); @@ -823,7 +903,7 @@ static int mdt_create_unpack(struct mdt_thread_info *info) attr->la_valid = LA_MODE | LA_RDEV | LA_UID | LA_GID | LA_CTIME | LA_MTIME | LA_ATIME; memset(&sp->u, 0, sizeof(sp->u)); - sp->sp_cr_flags = rec->cr_flags; + sp->sp_cr_flags = get_mrc_cr_flags(rec); sp->sp_ck_split = !!(rec->cr_bias & MDS_CHECK_SPLIT); info->mti_cross_ref = !!(rec->cr_bias & MDS_CROSS_REF); @@ -832,10 +912,16 @@ static int mdt_create_unpack(struct mdt_thread_info *info) req_capsule_client_get(pill, &RMF_CAPA1)); mdt_set_capainfo(info, 1, rr->rr_fid2, BYPASS_CAPA); - rr->rr_name = req_capsule_client_get(pill, &RMF_NAME); - rr->rr_namelen = req_capsule_get_size(pill, &RMF_NAME, RCL_CLIENT) - 1; - LASSERT(rr->rr_name && rr->rr_namelen > 0); - + if (!info->mti_cross_ref) { + rr->rr_name = req_capsule_client_get(pill, &RMF_NAME); + rr->rr_namelen = req_capsule_get_size(pill, &RMF_NAME, + RCL_CLIENT) - 1; + LASSERT(rr->rr_name && rr->rr_namelen > 0); + } else { + rr->rr_name = NULL; + rr->rr_namelen = 0; + } + #ifdef CONFIG_FS_POSIX_ACL if (sp->sp_cr_flags & MDS_CREATE_RMT_ACL) { if (S_ISDIR(attr->la_mode)) @@ -922,13 +1008,14 @@ static int mdt_link_unpack(struct mdt_thread_info *info) mdt_set_capainfo(info, 1, rr->rr_fid2, req_capsule_client_get(pill, &RMF_CAPA2)); + info->mti_spec.sp_ck_split = !!(rec->lk_bias & MDS_CHECK_SPLIT); + info->mti_cross_ref = !!(rec->lk_bias & MDS_CROSS_REF); rr->rr_name = req_capsule_client_get(pill, &RMF_NAME); if (rr->rr_name == NULL) RETURN(-EFAULT); rr->rr_namelen = req_capsule_get_size(pill, &RMF_NAME, RCL_CLIENT) - 1; - LASSERT(rr->rr_namelen > 0); - info->mti_spec.sp_ck_split = !!(rec->lk_bias & MDS_CHECK_SPLIT); - info->mti_cross_ref = !!(rec->lk_bias & MDS_CROSS_REF); + if (!info->mti_cross_ref) + LASSERT(rr->rr_namelen > 0); rc = mdt_dlmreq_unpack(info); RETURN(rc); @@ -969,18 +1056,24 @@ static int mdt_unlink_unpack(struct mdt_thread_info *info) mdt_set_capainfo(info, 0, rr->rr_fid1, req_capsule_client_get(pill, &RMF_CAPA1)); - rr->rr_name = req_capsule_client_get(pill, &RMF_NAME); - if (rr->rr_name == NULL) - RETURN(-EFAULT); - rr->rr_namelen = req_capsule_get_size(pill, &RMF_NAME, RCL_CLIENT) - 1; - LASSERT(rr->rr_namelen > 0); - info->mti_spec.sp_ck_split = !!(rec->ul_bias & MDS_CHECK_SPLIT); info->mti_cross_ref = !!(rec->ul_bias & MDS_CROSS_REF); + if (!info->mti_cross_ref) { + rr->rr_name = req_capsule_client_get(pill, &RMF_NAME); + rr->rr_namelen = req_capsule_get_size(pill, &RMF_NAME, RCL_CLIENT) - 1; + if (rr->rr_name == NULL || rr->rr_namelen == 0) + RETURN(-EFAULT); + } else { + rr->rr_name = NULL; + rr->rr_namelen = 0; + } + info->mti_spec.sp_ck_split = !!(rec->ul_bias & MDS_CHECK_SPLIT); if (rec->ul_bias & MDS_VTX_BYPASS) ma->ma_attr_flags |= MDS_VTX_BYPASS; else ma->ma_attr_flags &= ~MDS_VTX_BYPASS; + info->mti_spec.no_create = !!req_is_replay(mdt_info_req(info)); + rc = mdt_dlmreq_unpack(info); RETURN(rc); } @@ -1024,21 +1117,23 @@ static int mdt_rename_unpack(struct mdt_thread_info *info) mdt_set_capainfo(info, 1, rr->rr_fid2, req_capsule_client_get(pill, &RMF_CAPA2)); + info->mti_spec.sp_ck_split = !!(rec->rn_bias & MDS_CHECK_SPLIT); + info->mti_cross_ref = !!(rec->rn_bias & MDS_CROSS_REF); rr->rr_name = req_capsule_client_get(pill, &RMF_NAME); rr->rr_tgt = req_capsule_client_get(pill, &RMF_SYMTGT); if (rr->rr_name == NULL || rr->rr_tgt == NULL) RETURN(-EFAULT); rr->rr_namelen = req_capsule_get_size(pill, &RMF_NAME, RCL_CLIENT) - 1; - LASSERT(rr->rr_namelen > 0); rr->rr_tgtlen = req_capsule_get_size(pill, &RMF_SYMTGT, RCL_CLIENT) - 1; - LASSERT(rr->rr_tgtlen > 0); - info->mti_spec.sp_ck_split = !!(rec->rn_bias & MDS_CHECK_SPLIT); - info->mti_cross_ref = !!(rec->rn_bias & MDS_CROSS_REF); + if (!info->mti_cross_ref) + LASSERT(rr->rr_namelen > 0 && rr->rr_tgtlen > 0); if (rec->rn_bias & MDS_VTX_BYPASS) ma->ma_attr_flags |= MDS_VTX_BYPASS; else ma->ma_attr_flags &= ~MDS_VTX_BYPASS; + info->mti_spec.no_create = !!req_is_replay(mdt_info_req(info)); + rc = mdt_dlmreq_unpack(info); RETURN(rc); } @@ -1078,7 +1173,10 @@ static int mdt_open_unpack(struct mdt_thread_info *info) attr->la_valid = LA_MODE | LA_RDEV | LA_UID | LA_GID | LA_CTIME | LA_MTIME | LA_ATIME; memset(&info->mti_spec.u, 0, sizeof(info->mti_spec.u)); - info->mti_spec.sp_cr_flags = rec->cr_flags; + info->mti_spec.sp_cr_flags = get_mrc_cr_flags(rec); + /* Do not trigger ASSERTION if client miss to set such flags. */ + if (unlikely(info->mti_spec.sp_cr_flags == 0)) + RETURN(-EPROTO); info->mti_replayepoch = rec->cr_ioepoch; info->mti_spec.sp_ck_split = !!(rec->cr_bias & MDS_CHECK_SPLIT); @@ -1087,8 +1185,8 @@ static int mdt_open_unpack(struct mdt_thread_info *info) if (req_capsule_get_size(pill, &RMF_CAPA1, RCL_CLIENT)) mdt_set_capainfo(info, 0, rr->rr_fid1, req_capsule_client_get(pill, &RMF_CAPA1)); - if ((lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) && - (req_capsule_get_size(pill, &RMF_CAPA2, RCL_CLIENT))) { + if (req_is_replay(req) && + req_capsule_get_size(pill, &RMF_CAPA2, RCL_CLIENT)) { #if 0 mdt_set_capainfo(info, 1, rr->rr_fid2, req_capsule_client_get(pill, &RMF_CAPA2)); @@ -1111,8 +1209,7 @@ static int mdt_open_unpack(struct mdt_thread_info *info) RCL_CLIENT); if (sp->u.sp_ea.eadatalen) { sp->u.sp_ea.eadata = req_capsule_client_get(pill, &RMF_EADATA); - if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) - sp->u.sp_ea.no_lov_create = 1; + sp->no_create = !!req_is_replay(req); } RETURN(0);