From 4566b0261f9a3a3af9f4024585132deb217c3f75 Mon Sep 17 00:00:00 2001 From: fanyong Date: Thu, 19 Oct 2006 06:03:30 +0000 Subject: [PATCH] Add acl initialization for cross-ref create. --- lustre/cmm/cmm_internal.h | 2 + lustre/cmm/cmm_object.c | 22 ++++++- lustre/cmm/mdc_object.c | 6 ++ lustre/include/lustre/lustre_idl.h | 2 + lustre/include/lustre_req_layout.h | 1 + lustre/include/md_object.h | 15 ++--- lustre/mdd/mdd_handler.c | 125 +++++++++++++++++++++++++++---------- lustre/mdt/mdt_lib.c | 13 ++++ lustre/ptlrpc/layout.c | 14 +++++ 9 files changed, 158 insertions(+), 42 deletions(-) diff --git a/lustre/cmm/cmm_internal.h b/lustre/cmm/cmm_internal.h index 156fc49..fd1b278 100644 --- a/lustre/cmm/cmm_internal.h +++ b/lustre/cmm/cmm_internal.h @@ -34,6 +34,7 @@ #include #include #include +#include struct cmm_device { struct md_device cmm_md_dev; @@ -96,6 +97,7 @@ struct cmr_object { struct cmm_thread_info { struct md_attr cmi_ma; struct lu_buf cmi_buf; + char cmi_xattr_buf[LUSTRE_POSIX_ACL_MAX_SIZE]; }; static inline struct cmm_device *cmm_obj2dev(struct cmm_object *c) diff --git a/lustre/cmm/cmm_object.c b/lustre/cmm/cmm_object.c index f029449..854289b 100644 --- a/lustre/cmm/cmm_object.c +++ b/lustre/cmm/cmm_object.c @@ -373,7 +373,7 @@ static int cml_lookup(const struct lu_env *env, struct md_object *mo_p, static int cml_create(const struct lu_env *env, struct md_object *mo_p, const char *child_name, - struct md_object *mo_c, const struct md_create_spec *spec, + struct md_object *mo_c, struct md_create_spec *spec, struct md_attr *ma) { int rc; @@ -768,7 +768,7 @@ static int cmr_lookup(const struct lu_env *env, struct md_object *mo_p, */ static int cmr_create(const struct lu_env *env, struct md_object *mo_p, const char *child_name, struct md_object *mo_c, - const struct md_create_spec *spec, + struct md_create_spec *spec, struct md_attr *ma) { struct cmm_thread_info *cmi; @@ -781,6 +781,15 @@ static int cmr_create(const struct lu_env *env, struct md_object *mo_p, LASSERT(cmi); tmp_ma = &cmi->cmi_ma; tmp_ma->ma_need = MA_INODE; + +#ifdef CONFIG_FS_POSIX_ACL + if (!S_ISLNK(ma->ma_attr.la_mode)) { + tmp_ma->ma_lmv = (struct lmv_stripe_md *)cmi->cmi_xattr_buf; + tmp_ma->ma_lmv_size = sizeof(cmi->cmi_xattr_buf); + tmp_ma->ma_need |= MA_ACL_DEF; + } +#endif + rc = mo_attr_get(env, md_object_next(mo_p), tmp_ma); if (rc) RETURN(rc); @@ -792,6 +801,15 @@ static int cmr_create(const struct lu_env *env, struct md_object *mo_p, ma->ma_attr.la_valid |= LA_MODE; } } + +#ifdef CONFIG_FS_POSIX_ACL + if (tmp_ma->ma_valid & MA_ACL_DEF) { + spec->u.sp_ea.eadata = tmp_ma->ma_lmv; + spec->u.sp_ea.eadatalen = tmp_ma->ma_lmv_size; + spec->sp_cr_flags |= MDS_CREATE_RMT_ACL; + } +#endif + /* remote object creation and local name insert */ rc = mo_object_create(env, md_object_next(mo_c), spec, ma); if (rc == 0) { diff --git a/lustre/cmm/mdc_object.c b/lustre/cmm/mdc_object.c index 46c5805..7d3c706 100644 --- a/lustre/cmm/mdc_object.c +++ b/lustre/cmm/mdc_object.c @@ -278,6 +278,12 @@ static int mdc_object_create(const struct lu_env *env, symlen = spec->u.sp_ea.eadatalen; mci->mci_opdata.fid1 = *(spec->u.sp_ea.fid); mci->mci_opdata.flags |= MDS_CREATE_SLAVE_OBJ; +#ifdef CONFIG_FS_POSIX_ACL + } else if (spec->sp_cr_flags & MDS_CREATE_RMT_ACL) { + symname = spec->u.sp_ea.eadata; + symlen = spec->u.sp_ea.eadatalen; + mci->mci_opdata.flags |= MDS_CREATE_RMT_ACL; +#endif } else { symname = spec->u.sp_symname; symlen = symname ? strlen(symname) + 1 : 0; diff --git a/lustre/include/lustre/lustre_idl.h b/lustre/include/lustre/lustre_idl.h index 3c34001..8c67dea 100644 --- a/lustre/include/lustre/lustre_idl.h +++ b/lustre/include/lustre/lustre_idl.h @@ -1179,6 +1179,8 @@ extern void lustre_swab_mdt_rec_setattr (struct mdt_rec_setattr *sa); #define MDS_OPEN_DELAY_CREATE 0100000000 /* delay initial object create */ #define MDS_OPEN_OWNEROVERRIDE 0200000000 /* NFSD rw-reopen ro file for owner */ #define MDS_OPEN_JOIN_FILE 0400000000 /* open for join file*/ +#define MDS_CREATE_RMT_ACL 01000000000 /* indicate create on remote server + * with default ACL */ #define MDS_CREATE_SLAVE_OBJ 02000000000 /* indicate create slave object * actually, this is for create, not * conflict with other open flags */ diff --git a/lustre/include/lustre_req_layout.h b/lustre/include/lustre_req_layout.h index 57a8bbf..60a1e85 100644 --- a/lustre/include/lustre_req_layout.h +++ b/lustre/include/lustre_req_layout.h @@ -119,6 +119,7 @@ extern const struct req_format RQF_MDS_DONE_WRITING; extern const struct req_format RQF_MDS_GETATTR_NAME; extern const struct req_format RQF_MDS_REINT; extern const struct req_format RQF_MDS_REINT_CREATE; +extern const struct req_format RQF_MDS_REINT_CREATE_RMT_ACL; extern const struct req_format RQF_MDS_REINT_CREATE_SLAVE; extern const struct req_format RQF_MDS_REINT_CREATE_SYM; extern const struct req_format RQF_MDS_REINT_OPEN; diff --git a/lustre/include/md_object.h b/lustre/include/md_object.h index c4e6718..37cf3c8 100644 --- a/lustre/include/md_object.h +++ b/lustre/include/md_object.h @@ -93,11 +93,12 @@ struct md_capainfo *md_capainfo(const struct lu_env *env); /* metadata attributes */ enum ma_valid { - MA_INODE = (1 << 0), - MA_LOV = (1 << 1), - MA_COOKIE = (1 << 2), - MA_FLAGS = (1 << 3), - MA_LMV = (1 << 4) + MA_INODE = (1 << 0), + MA_LOV = (1 << 1), + MA_COOKIE = (1 << 2), + MA_FLAGS = (1 << 3), + MA_LMV = (1 << 4), + MA_ACL_DEF = (1 << 5) }; struct md_attr { @@ -197,7 +198,7 @@ struct md_dir_operations { int (*mdo_create)(const struct lu_env *env, struct md_object *pobj, const char *name, struct md_object *child, - const struct md_create_spec *spec, + struct md_create_spec *spec, struct md_attr *ma); /* This method is used for creating data object for this meta object*/ @@ -457,7 +458,7 @@ static inline int mdo_create(const struct lu_env *env, struct md_object *p, const char *child_name, struct md_object *c, - const struct md_create_spec *spc, + struct md_create_spec *spc, struct md_attr *at) { LASSERT(c->mo_dir_ops->mdo_create); diff --git a/lustre/mdd/mdd_handler.c b/lustre/mdd/mdd_handler.c index bf4191b..6e91f90 100644 --- a/lustre/mdd/mdd_handler.c +++ b/lustre/mdd/mdd_handler.c @@ -688,6 +688,29 @@ static int __mdd_lmv_get(const struct lu_env *env, RETURN(rc); } +#ifdef CONFIG_FS_POSIX_ACL +/* get default acl EA only */ +static int __mdd_acl_def_get(const struct lu_env *env, + struct mdd_object *mdd_obj, struct md_attr *ma) +{ + struct dt_object *next = mdd_object_child(mdd_obj); + int rc; + + rc = next->do_ops->do_xattr_get(env, next, + mdd_buf_get(env, ma->ma_lmv, + ma->ma_lmv_size), + XATTR_NAME_ACL_DEFAULT, BYPASS_CAPA); + if (rc > 0) { + ma->ma_lmv_size = rc; + ma->ma_valid |= MA_ACL_DEF; + rc = 0; + } else if ((rc == -EOPNOTSUPP) || (rc == -ENODATA)) { + rc = 0; + } + RETURN(rc); +} +#endif + static int mdd_attr_get_internal(const struct lu_env *env, struct mdd_object *mdd_obj, struct md_attr *ma) @@ -707,6 +730,12 @@ static int mdd_attr_get_internal(const struct lu_env *env, if (S_ISDIR(mdd_object_type(mdd_obj))) rc = __mdd_lmv_get(env, mdd_obj, ma); } +#ifdef CONFIG_FS_POSIX_ACL + else if (rc == 0 && ma->ma_need & MA_ACL_DEF) { + if (S_ISDIR(mdd_object_type(mdd_obj))) + rc = __mdd_acl_def_get(env, mdd_obj, ma); + } +#endif CDEBUG(D_INODE, "after getattr rc = %d, ma_valid = "LPX64"\n", rc, ma->ma_valid); RETURN(rc); @@ -2455,44 +2484,27 @@ static int mdd_posix_acl_create_masq(posix_acl_xattr_entry *entry, return not_equiv; } -static int mdd_init_acl(const struct lu_env *env, struct mdd_object *pobj, - struct mdd_object *cobj, __u32 *mode, - struct thandle *handle) +static int __mdd_acl_init(const struct lu_env *env, struct mdd_object *obj, + struct lu_buf *buf, __u32 *mode, + struct thandle *handle) { - struct dt_object *pnext; - struct dt_object *cnext; - struct lu_buf *buf; + struct dt_object *next; posix_acl_xattr_entry *entry; int entry_count; int rc; ENTRY; - if (S_ISLNK(*mode)) - RETURN(0); - - buf = &mdd_env_info(env)->mti_buf; - buf->lb_buf = mdd_env_info(env)->mti_xattr_buf; - buf->lb_len = sizeof(mdd_env_info(env)->mti_xattr_buf); - pnext = mdd_object_child(pobj); - rc = pnext->do_ops->do_xattr_get(env, pnext, buf, - XATTR_NAME_ACL_DEFAULT, BYPASS_CAPA); - if ((rc == -EOPNOTSUPP) || (rc == -ENODATA)) - RETURN(0); - else if (rc <= 0) - RETURN(rc); - - buf->lb_len = rc; entry = ((posix_acl_xattr_header *)(buf->lb_buf))->a_entries; - entry_count = (rc - 4) / sizeof(posix_acl_xattr_entry); + entry_count = (buf->lb_len - 4) / sizeof(posix_acl_xattr_entry); if (entry_count <= 0) RETURN(0); - cnext = mdd_object_child(cobj); + next = mdd_object_child(obj); if (S_ISDIR(*mode)) { - rc = cnext->do_ops->do_xattr_set(env, cnext, buf, - XATTR_NAME_ACL_DEFAULT, - 0, handle, BYPASS_CAPA); + rc = next->do_ops->do_xattr_set(env, next, buf, + XATTR_NAME_ACL_DEFAULT, + 0, handle, BYPASS_CAPA); if (rc) RETURN(rc); } @@ -2501,9 +2513,36 @@ static int mdd_init_acl(const struct lu_env *env, struct mdd_object *pobj, if (rc < 0) RETURN(rc); else if (rc > 0) - rc = cnext->do_ops->do_xattr_set(env, cnext, buf, - XATTR_NAME_ACL_ACCESS, - 0, handle, BYPASS_CAPA); + rc = next->do_ops->do_xattr_set(env, next, buf, + XATTR_NAME_ACL_ACCESS, + 0, handle, BYPASS_CAPA); + RETURN(rc); +} + +static int mdd_acl_init(const struct lu_env *env, struct mdd_object *pobj, + struct mdd_object *cobj, __u32 *mode, + struct thandle *handle) +{ + struct dt_object *next = mdd_object_child(pobj); + struct lu_buf *buf = &mdd_env_info(env)->mti_buf; + int rc; + + ENTRY; + + if (S_ISLNK(*mode)) + RETURN(0); + + buf->lb_buf = mdd_env_info(env)->mti_xattr_buf; + buf->lb_len = sizeof(mdd_env_info(env)->mti_xattr_buf); + rc = next->do_ops->do_xattr_get(env, next, buf, + XATTR_NAME_ACL_DEFAULT, BYPASS_CAPA); + if ((rc == -EOPNOTSUPP) || (rc == -ENODATA)) + RETURN(0); + else if (rc <= 0) + RETURN(rc); + + buf->lb_len = rc; + rc = __mdd_acl_init(env, cobj, buf, mode, handle); RETURN(rc); } #endif @@ -2571,7 +2610,7 @@ static int mdd_create_sanity_check(const struct lu_env *env, static int mdd_create(const struct lu_env *env, struct md_object *pobj, const char *name, struct md_object *child, - const struct md_create_spec *spec, + struct md_create_spec *spec, struct md_attr* ma) { struct mdd_device *mdd = mdo2mdd(pobj); @@ -2655,10 +2694,12 @@ static int mdd_create(const struct lu_env *env, created = 1; #ifdef CONFIG_FS_POSIX_ACL - rc = mdd_init_acl(env, mdd_pobj, son, &ma->ma_attr.la_mode, handle); + rc = mdd_acl_init(env, mdd_pobj, son, &ma->ma_attr.la_mode, handle); if (rc) { mdd_write_unlock(env, son); GOTO(cleanup, rc); + } else { + ma->ma_attr.la_valid |= LA_MODE; } #endif @@ -2814,9 +2855,27 @@ static int mdd_object_create(const struct lu_env *env, CDEBUG(D_INFO, "Set slave ea "DFID", eadatalen %d, rc %d\n", PFID(mdo2fid(mdd_obj)), spec->u.sp_ea.eadatalen, rc); - rc = mdd_attr_set_internal(env, mdd_obj, &ma->ma_attr, handle, 1); - } else + rc = mdd_attr_set_internal(env, mdd_obj, &ma->ma_attr, handle, 0); + } else { +#ifdef CONFIG_FS_POSIX_ACL + if (spec->sp_cr_flags & MDS_CREATE_RMT_ACL) { + struct lu_buf *buf = &mdd_env_info(env)->mti_buf; + + buf->lb_buf = (void *)spec->u.sp_ea.eadata; + buf->lb_len = spec->u.sp_ea.eadatalen; + if ((buf->lb_len > 0) && (buf->lb_buf != NULL)) { + rc = __mdd_acl_init(env, mdd_obj, buf, + &ma->ma_attr.la_mode, + handle); + if (rc) + GOTO(unlock, rc); + else + ma->ma_attr.la_valid |= LA_MODE; + } + } +#endif rc = __mdd_object_initialize(env, pfid, mdd_obj, ma, handle); + } EXIT; unlock: mdd_write_unlock(env, mdd_obj); diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c index cb9bc02..b907ba5 100644 --- a/lustre/mdt/mdt_lib.c +++ b/lustre/mdt/mdt_lib.c @@ -741,6 +741,19 @@ static int mdt_create_unpack(struct mdt_thread_info *info) mdt_set_capainfo(info, 1, rr->rr_fid2, BYPASS_CAPA); rr->rr_name = req_capsule_client_get(pill, &RMF_NAME); +#ifdef CONFIG_FS_POSIX_ACL + if (sp->sp_cr_flags & MDS_CREATE_RMT_ACL) { + if (S_ISDIR(attr->la_mode)) + sp->u.sp_pfid = rr->rr_fid1; + req_capsule_extend(pill, &RQF_MDS_REINT_CREATE_RMT_ACL); + LASSERT(req_capsule_field_present(pill, &RMF_EADATA, + RCL_CLIENT)); + sp->u.sp_ea.eadata = req_capsule_client_get(pill, &RMF_EADATA); + sp->u.sp_ea.eadatalen = req_capsule_get_size(pill, &RMF_EADATA, + RCL_CLIENT); + RETURN(0); + } +#endif if (S_ISDIR(attr->la_mode)) { /* pass parent fid for cross-ref cases */ sp->u.sp_pfid = rr->rr_fid1; diff --git a/lustre/ptlrpc/layout.c b/lustre/ptlrpc/layout.c index 9261e2c..89ae041 100644 --- a/lustre/ptlrpc/layout.c +++ b/lustre/ptlrpc/layout.c @@ -132,6 +132,14 @@ static const struct req_msg_field *mds_reint_create_client[] = { &RMF_NAME, }; +static const struct req_msg_field *mds_reint_create_rmt_acl_client[] = { + &RMF_PTLRPC_BODY, + &RMF_REC_CREATE, + &RMF_CAPA1, + &RMF_NAME, + &RMF_EADATA +}; + static const struct req_msg_field *mds_reint_create_sym_client[] = { &RMF_PTLRPC_BODY, &RMF_REC_CREATE, @@ -338,6 +346,7 @@ static const struct req_format *req_formats[] = { &RQF_MDS_GETATTR_NAME, &RQF_MDS_REINT, &RQF_MDS_REINT_CREATE, + &RQF_MDS_REINT_CREATE_RMT_ACL, &RQF_MDS_REINT_CREATE_SYM, &RQF_MDS_REINT_CREATE_SLAVE, &RQF_MDS_REINT_OPEN, @@ -614,6 +623,11 @@ const struct req_format RQF_MDS_REINT_CREATE = mds_reint_create_client, mdt_body_only); EXPORT_SYMBOL(RQF_MDS_REINT_CREATE); +const struct req_format RQF_MDS_REINT_CREATE_RMT_ACL = + DEFINE_REQ_FMT0("MDS_REINT_CREATE_RMT_ACL", + mds_reint_create_rmt_acl_client, mdt_body_only); +EXPORT_SYMBOL(RQF_MDS_REINT_CREATE_RMT_ACL); + const struct req_format RQF_MDS_REINT_CREATE_SLAVE = DEFINE_REQ_FMT0("MDS_REINT_CREATE_SLAVE", mds_reint_create_slave_client, mdt_body_only); -- 1.8.3.1