X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fcmm%2Fmdc_object.c;h=2e884ba084f955cc8bf9c82caa5d80853e9ca8dc;hb=74a548647771d9b555a6cbcbaf8a5b61541182a9;hp=f1d45a89399eac15afb4a74b9a86cbba8e70d4d5;hpb=70e80ade90af09300396706b8910e196a7928520;p=fs%2Flustre-release.git diff --git a/lustre/cmm/mdc_object.c b/lustre/cmm/mdc_object.c index f1d45a8..2e884ba 100644 --- a/lustre/cmm/mdc_object.c +++ b/lustre/cmm/mdc_object.c @@ -16,8 +16,8 @@ * in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU General Public License - * version 2 along with this program; If not, see [sun.com URL with a - * copy of GPLv2]. + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or @@ -52,9 +52,9 @@ #include "cmm_internal.h" #include "mdc_internal.h" -static struct md_object_operations mdc_mo_ops; -static struct md_dir_operations mdc_dir_ops; -static struct lu_object_operations mdc_obj_ops; +static const struct md_object_operations mdc_mo_ops; +static const struct md_dir_operations mdc_dir_ops; +static const struct lu_object_operations mdc_obj_ops; extern struct lu_context_key mdc_thread_key; @@ -86,23 +86,17 @@ static void mdc_object_free(const struct lu_env *env, struct lu_object *lo) OBD_FREE_PTR(mco); } -static int mdc_object_init(const struct lu_env *env, struct lu_object *lo) +static int mdc_object_init(const struct lu_env *env, struct lu_object *lo, + const struct lu_object_conf *_) { ENTRY; lo->lo_header->loh_attr |= LOHA_REMOTE; RETURN(0); } -static int mdc_object_print(const struct lu_env *env, void *cookie, - lu_printer_t p, const struct lu_object *lo) -{ - return (*p)(env, cookie, LUSTRE_CMM_MDC_NAME"-object@%p", lo); -} - -static struct lu_object_operations mdc_obj_ops = { +static const struct lu_object_operations mdc_obj_ops = { .loo_object_init = mdc_object_init, .loo_object_free = mdc_object_free, - .loo_object_print = mdc_object_print, }; /* md_object_operations */ @@ -161,8 +155,9 @@ static int mdc_req2attr_update(const struct lu_env *env, struct mdc_thread_info *mci; struct ptlrpc_request *req; struct mdt_body *body; - struct lov_mds_md *lov; + struct lov_mds_md *md; struct llog_cookie *cookie; + void *acl; ENTRY; mci = mdc_info_get(env); @@ -181,43 +176,69 @@ static int mdc_req2attr_update(const struct lu_env *env, LASSERT(ma->ma_capa != NULL); *ma->ma_capa = *capa; } - - if (!(body->valid & OBD_MD_FLEASIZE)) - RETURN(0); - if (body->eadatasize == 0) { - CERROR("OBD_MD_FLEASIZE is set but eadatasize is zero\n"); - RETURN(-EPROTO); + if ((body->valid & OBD_MD_FLEASIZE) || (body->valid & OBD_MD_FLDIREA)) { + if (body->eadatasize == 0) { + CERROR("No size defined for easize field\n"); + RETURN(-EPROTO); + } + + md = req_capsule_server_sized_get(&req->rq_pill, &RMF_MDT_MD, + body->eadatasize); + if (md == NULL) + RETURN(-EPROTO); + + LASSERT(ma->ma_lmm != NULL); + LASSERT(ma->ma_lmm_size >= body->eadatasize); + ma->ma_lmm_size = body->eadatasize; + memcpy(ma->ma_lmm, md, ma->ma_lmm_size); + ma->ma_valid |= MA_LOV; } - lov = req_capsule_server_sized_get(&req->rq_pill, &RMF_MDT_MD, - body->eadatasize); - if (lov == NULL) - RETURN(-EPROTO); + if (body->valid & OBD_MD_FLCOOKIE) { + /* + * ACL and cookie share the same body->aclsize, we need + * to make sure that they both never come here. + */ + LASSERT(!(body->valid & OBD_MD_FLACL)); - LASSERT(ma->ma_lmm != NULL); - LASSERT(ma->ma_lmm_size >= body->eadatasize); - ma->ma_lmm_size = body->eadatasize; - memcpy(ma->ma_lmm, lov, ma->ma_lmm_size); - ma->ma_valid |= MA_LOV; + if (body->aclsize == 0) { + CERROR("No size defined for cookie field\n"); + RETURN(-EPROTO); + } - if (!(body->valid & OBD_MD_FLCOOKIE)) - RETURN(0); + cookie = req_capsule_server_sized_get(&req->rq_pill, + &RMF_LOGCOOKIES, + body->aclsize); + if (cookie == NULL) + RETURN(-EPROTO); - if (body->aclsize == 0) { - CERROR("OBD_MD_FLCOOKIE is set but cookie size is zero\n"); - RETURN(-EPROTO); + LASSERT(ma->ma_cookie != NULL); + LASSERT(ma->ma_cookie_size == body->aclsize); + memcpy(ma->ma_cookie, cookie, ma->ma_cookie_size); + ma->ma_valid |= MA_COOKIE; } - cookie = req_capsule_server_sized_get(&req->rq_pill, &RMF_ACL, - body->aclsize); - if (cookie == NULL) - RETURN(-EPROTO); +#ifdef CONFIG_FS_POSIX_ACL + if (body->valid & OBD_MD_FLACL) { + if (body->aclsize == 0) { + CERROR("No size defined for acl field\n"); + RETURN(-EPROTO); + } + + acl = req_capsule_server_sized_get(&req->rq_pill, + &RMF_ACL, + body->aclsize); + if (acl == NULL) + RETURN(-EPROTO); + + LASSERT(ma->ma_acl != NULL); + LASSERT(ma->ma_acl_size == body->aclsize); + memcpy(ma->ma_acl, acl, ma->ma_acl_size); + ma->ma_valid |= MA_ACL_DEF; + } +#endif - LASSERT(ma->ma_cookie != NULL); - LASSERT(ma->ma_cookie_size == body->aclsize); - memcpy(ma->ma_cookie, cookie, ma->ma_cookie_size); - ma->ma_valid |= MA_COOKIE; RETURN(0); } @@ -293,7 +314,7 @@ static int mdc_attr_set(const struct lu_env *env, struct md_object *mo, } else { mci->mci_opdata.op_fsuid = la->la_uid; mci->mci_opdata.op_fsgid = la->la_gid; - mci->mci_opdata.op_cap = current->cap_effective; + mci->mci_opdata.op_cap = cfs_curproc_cap_pack(); mci->mci_opdata.op_suppgids[0] = mci->mci_opdata.op_suppgids[1] = -1; } @@ -319,7 +340,7 @@ static int mdc_object_create(const struct lu_env *env, int rc, symlen; uid_t uid; gid_t gid; - __u32 cap; + cfs_cap_t cap; ENTRY; LASSERT(S_ISDIR(la->la_mode)); @@ -328,7 +349,7 @@ static int mdc_object_create(const struct lu_env *env, mci = mdc_info_init(env); mci->mci_opdata.op_bias = MDS_CROSS_REF; mci->mci_opdata.op_fid2 = *lu_object_fid(&mo->mo_lu); - + /* Parent fid is needed to create dotdot on the remote node. */ mci->mci_opdata.op_fid1 = *(spec->u.sp_pfid); mci->mci_opdata.op_mod_time = la->la_ctime; @@ -415,7 +436,7 @@ static int mdc_ref_add(const struct lu_env *env, struct md_object *mo, } else { mci->mci_opdata.op_fsuid = la->la_uid; mci->mci_opdata.op_fsgid = la->la_gid; - mci->mci_opdata.op_cap = current->cap_effective; + mci->mci_opdata.op_cap = cfs_curproc_cap_pack(); mci->mci_opdata.op_suppgids[0] = mci->mci_opdata.op_suppgids[1] = -1; } @@ -459,7 +480,7 @@ static int mdc_ref_del(const struct lu_env *env, struct md_object *mo, } else { mci->mci_opdata.op_fsuid = la->la_uid; mci->mci_opdata.op_fsgid = la->la_gid; - mci->mci_opdata.op_cap = current->cap_effective; + mci->mci_opdata.op_cap = cfs_curproc_cap_pack(); mci->mci_opdata.op_suppgids[0] = -1; } @@ -490,7 +511,7 @@ int mdc_send_page(struct cmm_device *cm, const struct lu_env *env, } #endif -static struct md_object_operations mdc_mo_ops = { +static const struct md_object_operations mdc_mo_ops = { .moo_attr_get = mdc_attr_get, .moo_attr_set = mdc_attr_set, .moo_object_create = mdc_object_create, @@ -535,7 +556,7 @@ static int mdc_rename_tgt(const struct lu_env *env, struct md_object *mo_p, } else { mci->mci_opdata.op_fsuid = la->la_uid; mci->mci_opdata.op_fsgid = la->la_gid; - mci->mci_opdata.op_cap = current->cap_effective; + mci->mci_opdata.op_cap = cfs_curproc_cap_pack(); mci->mci_opdata.op_suppgids[0] = mci->mci_opdata.op_suppgids[1] = -1; } @@ -551,7 +572,7 @@ static int mdc_rename_tgt(const struct lu_env *env, struct md_object *mo_p, RETURN(rc); } -/* +/* * Return resulting fid in sfid * 0: fids are not relatives * fid: fid at which search stopped @@ -573,7 +594,7 @@ static int mdc_is_subdir(const struct lu_env *env, struct md_object *mo, body = req_capsule_server_get(&mci->mci_req->rq_pill, &RMF_MDT_BODY); LASSERT(body->valid & OBD_MD_FLID); - + CDEBUG(D_INFO, "Remote mdo_is_subdir(), new src "DFID"\n", PFID(&body->fid1)); *sfid = body->fid1; @@ -582,7 +603,7 @@ static int mdc_is_subdir(const struct lu_env *env, struct md_object *mo, RETURN(rc); } -static struct md_dir_operations mdc_dir_ops = { +static const struct md_dir_operations mdc_dir_ops = { .mdo_is_subdir = mdc_is_subdir, .mdo_rename_tgt = mdc_rename_tgt };