Whamcloud - gitweb
Add acl initialization for cross-ref create.
authorfanyong <fanyong>
Thu, 19 Oct 2006 06:03:30 +0000 (06:03 +0000)
committerfanyong <fanyong>
Thu, 19 Oct 2006 06:03:30 +0000 (06:03 +0000)
lustre/cmm/cmm_internal.h
lustre/cmm/cmm_object.c
lustre/cmm/mdc_object.c
lustre/include/lustre/lustre_idl.h
lustre/include/lustre_req_layout.h
lustre/include/md_object.h
lustre/mdd/mdd_handler.c
lustre/mdt/mdt_lib.c
lustre/ptlrpc/layout.c

index 156fc49..fd1b278 100644 (file)
@@ -34,6 +34,7 @@
 #include <obd.h>
 #include <lustre_fld.h>
 #include <md_object.h>
+#include <linux/lustre_acl.h>
 
 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)
index f029449..854289b 100644 (file)
@@ -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) {
index 46c5805..7d3c706 100644 (file)
@@ -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;
index 3c34001..8c67dea 100644 (file)
@@ -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 */
index 57a8bbf..60a1e85 100644 (file)
@@ -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;
index c4e6718..37cf3c8 100644 (file)
@@ -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);
index bf4191b..6e91f90 100644 (file)
@@ -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);
index cb9bc02..b907ba5 100644 (file)
@@ -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;
index 9261e2c..89ae041 100644 (file)
@@ -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);