Whamcloud - gitweb
(1) pass create flag from client to CMM/MDD in struct md_create_spec;
authorhuanghua <huanghua>
Wed, 9 Aug 2006 09:54:04 +0000 (09:54 +0000)
committerhuanghua <huanghua>
Wed, 9 Aug 2006 09:54:04 +0000 (09:54 +0000)
(2) return object flag to client;
(3) do ioctl for ATTR_ATTR_FLAGS instead of setattr(): sanity 52

lustre/cmm/cmm_object.c
lustre/include/md_object.h
lustre/mdd/mdd_handler.c
lustre/mdd/mdd_internal.h
lustre/mdd/mdd_lov.c
lustre/mdt/mdt_handler.c
lustre/mdt/mdt_lib.c
lustre/mdt/mdt_open.c
lustre/osd/osd_handler.c
lustre/osd/osd_internal.h

index c9b4806..14af9d1 100644 (file)
@@ -367,13 +367,13 @@ static int cml_create(const struct lu_context *ctx, struct md_object *mo_p,
 
 static int cml_create_data(const struct lu_context *ctx,
                            struct md_object *p, struct md_object *o,
-                           const void *eadata, int eadatalen,
+                           const struct md_create_spec *spec,
                            struct md_attr *ma)
 {
         int rc;
         ENTRY;
         rc = mdo_create_data(ctx, md_object_next(p), md_object_next(o),
-                             eadata, eadatalen, ma);
+                             spec, ma);
         RETURN(rc);
 }
 
index 53e2a0b..b14881b 100644 (file)
@@ -74,6 +74,8 @@ struct md_create_spec {
                         int  eadatalen;
                 } sp_ea;
         } u;
+        /* create flag from client: such as MDS_OPEN_CREAT, and others */
+        __u32 sp_cr_flags;
 };
 
 /*
@@ -131,8 +133,9 @@ struct md_dir_operations {
                           struct md_attr *);
         /* This method is used for creating data object for this meta object*/
         int (*mdo_create_data)(const struct lu_context *cx, struct md_object *p,
-                               struct md_object *o, const void *eadata,
-                               int eadatalen, struct md_attr *ma);
+                               struct md_object *o, 
+                               const struct md_create_spec *spec,
+                               struct md_attr *ma);
         int (*mdo_rename)(const struct lu_context *ctxt,
                           struct md_object *spobj, struct md_object *tpobj,
                           const struct lu_fid *lf, const char *sname,
@@ -344,11 +347,11 @@ static inline int mdo_create(const struct lu_context *cx, struct md_object *p,
 }
 static inline int mdo_create_data(const struct lu_context *cx,
                                   struct md_object *p, struct md_object *c,
-                                  const void *eadata, int eadatalen,
+                                  const struct md_create_spec *spec,
                                   struct md_attr *ma)
 {
         LASSERT(c->mo_dir_ops->mdo_create_data);
-        return c->mo_dir_ops->mdo_create_data(cx, p, c, eadata, eadatalen, ma);
+        return c->mo_dir_ops->mdo_create_data(cx, p, c, spec, ma);
 }
 
 static inline int mdo_rename(const struct lu_context *cx,
index cfb6685..592d7b3 100644 (file)
@@ -1078,7 +1078,7 @@ static int __mdd_object_initialize(const struct lu_context *ctxt,
 
 static int mdd_create_data(const struct lu_context *ctxt,
                            struct md_object *pobj, struct md_object *cobj,
-                           const void *eadata, int eadatasize,
+                           const struct md_create_spec *spec,
                            struct md_attr *ma)
 {
         struct mdd_device *mdd = mdo2mdd(pobj);
@@ -1086,9 +1086,9 @@ static int mdd_create_data(const struct lu_context *ctxt,
         struct mdd_object *son = md2mdd_obj(cobj);
         struct lu_attr    *attr = &ma->ma_attr;
         struct lov_mds_md *lmm = NULL;
+        int                lmm_size = 0;
         struct thandle    *handle;
-        int lmm_size = 0;
-        int rc;
+        int                rc;
         ENTRY;
 
         mdd_txn_param_build(ctxt, &MDD_TXN_CREATE_DATA);
@@ -1099,8 +1099,7 @@ static int mdd_create_data(const struct lu_context *ctxt,
         /*
          * XXX: should take transaction handle.
          */
-        rc = mdd_lov_create(ctxt, mdd, mdo, son, &lmm, &lmm_size, eadata,
-                            eadatasize, attr);
+        rc = mdd_lov_create(ctxt, mdd, mdo, son, &lmm, &lmm_size, spec, attr);
         if (rc == 0) {
                 rc = mdd_lov_set_md(ctxt, pobj, cobj, lmm,
                                     lmm_size, attr->la_mode, handle);
@@ -1183,11 +1182,8 @@ static int mdd_create(const struct lu_context *ctxt, struct md_object *pobj,
         /* no RPC inside the transaction, so OST objects should be created at
          * first */
         if (S_ISREG(attr->la_mode)) {
-                const void *eadata = spec->u.sp_ea.eadata;
-                int eadatasize = spec->u.sp_ea.eadatalen;
-
                 rc = mdd_lov_create(ctxt, mdd, mdo, son, &lmm, &lmm_size,
-                                    eadata, eadatasize, attr);
+                                    spec, attr);
                 if (rc)
                         RETURN(rc);
         }
index 7ce55c7..b87fa3b 100644 (file)
@@ -63,8 +63,9 @@ int mdd_lov_set_md(const struct lu_context *ctxt, struct md_object *pobj,
                    int lmm_size, int mode, struct thandle *handle);
 int mdd_lov_create(const struct lu_context *ctxt, struct mdd_device *mdd,
                    struct mdd_object *parent, struct mdd_object *child,
-                   struct lov_mds_md **lmm, int *lmm_size, const void *eadata,
-                   int eadatasize, struct lu_attr *la);
+                   struct lov_mds_md **lmm, int *lmm_size,
+                   const struct md_create_spec *spec, struct lu_attr *la);
+
 int mdd_get_md(const struct lu_context *ctxt, struct md_object *obj,
                void *md, int *md_size);
 int mdd_unlink_log(const struct lu_context *ctxt, struct mdd_device *mdd,
index 058f82a..fbe9bfe 100644 (file)
@@ -385,18 +385,21 @@ static void obdo_from_la(struct obdo *dst, struct lu_attr *la, obd_flag valid)
 
 int mdd_lov_create(const struct lu_context *ctxt, struct mdd_device *mdd,
                    struct mdd_object *parent, struct mdd_object *child,
-                   struct lov_mds_md **lmm, int *lmm_size, const void *eadata,
-                   int eadatasize, struct lu_attr *la)
+                   struct lov_mds_md **lmm, int *lmm_size,
+                   const struct md_create_spec *spec, struct lu_attr *la)
 {
-        struct obd_device *obd = mdd2_obd(mdd);
-        struct obd_export *lov_exp = obd->u.mds.mds_osc_exp;
-        struct obdo *oa;
-        struct lov_stripe_md *lsm = NULL;
-        int rc = 0;
+        struct obd_device       *obd = mdd2_obd(mdd);
+        struct obd_export       *lov_exp = obd->u.mds.mds_osc_exp;
+        struct obdo             *oa;
+        struct lov_stripe_md    *lsm = NULL;
+        const void              *eadata = spec->u.sp_ea.eadata;
+/*      int                      eadatasize  = spec->u.sp_ea.eadatalen;*/
+        __u32                    create_flags = spec->sp_cr_flags;
+        int                      rc = 0;
         ENTRY;
 
-        if (la->la_flags & MDS_OPEN_DELAY_CREATE ||
-                        !(la->la_flags & FMODE_WRITE))
+        if (create_flags & MDS_OPEN_DELAY_CREATE ||
+                        !(create_flags & FMODE_WRITE))
                 RETURN(0);
 
         oa = obdo_alloc();
@@ -409,8 +412,8 @@ int mdd_lov_create(const struct lu_context *ctxt, struct mdd_device *mdd,
                 OBD_MD_FLMODE | OBD_MD_FLUID | OBD_MD_FLGID;
         oa->o_size = 0;
 
-        if (!(la->la_flags & MDS_OPEN_HAS_OBJS)) {
-                if (la->la_flags & MDS_OPEN_HAS_EA) {
+        if (!(create_flags & MDS_OPEN_HAS_OBJS)) {
+                if (create_flags & MDS_OPEN_HAS_EA) {
                         LASSERT(eadata != NULL);
                         rc = obd_iocontrol(OBD_IOC_LOV_SETSTRIPE, lov_exp,
                                            0, &lsm, (void*)eadata);
index 7c636b5..6637926 100644 (file)
@@ -173,7 +173,7 @@ void mdt_pack_attr2body(struct mdt_body *b, const struct lu_attr *attr,
 {
         b->valid |= OBD_MD_FLCTIME | OBD_MD_FLUID   |
                     OBD_MD_FLGID   | OBD_MD_FLTYPE  |
-                    OBD_MD_FLMODE  | OBD_MD_FLNLINK |
+                    OBD_MD_FLMODE  | OBD_MD_FLNLINK | OBD_MD_FLFLAGS |
                     OBD_MD_FLATIME | OBD_MD_FLMTIME ; /* added by huanghua */
 
         if (!S_ISREG(attr->la_mode))
index c2c3f55..4099515 100644 (file)
@@ -188,10 +188,10 @@ static int mdt_create_unpack(struct mdt_thread_info *info)
                 attr->la_rdev  = rec->cr_rdev;
                 attr->la_uid   = rec->cr_fsuid;
                 attr->la_gid   = rec->cr_fsgid;
-                attr->la_flags = rec->cr_flags;
                 attr->la_ctime = rec->cr_time;
                 attr->la_mtime = rec->cr_time;
                 attr->la_atime = rec->cr_time;
+                info->mti_spec.sp_cr_flags = rec->cr_flags;
 
                 rr->rr_name = req_capsule_client_get(pill, &RMF_NAME);
                 if (rr->rr_name) {
@@ -304,13 +304,13 @@ static int mdt_open_unpack(struct mdt_thread_info *info)
                 rr->rr_fid1   = &rec->cr_fid1;
                 rr->rr_fid2   = &rec->cr_fid2;
                 attr->la_mode = rec->cr_mode;
-                attr->la_flags  = rec->cr_flags;
                 attr->la_rdev  = rec->cr_rdev;
                 attr->la_uid   = rec->cr_fsuid;
                 attr->la_gid   = rec->cr_fsgid;
                 attr->la_ctime = rec->cr_time;
                 attr->la_mtime = rec->cr_time;
                 attr->la_atime = rec->cr_time;
+                info->mti_spec.sp_cr_flags = rec->cr_flags;
                 rr->rr_name = req_capsule_client_get(pill, &RMF_NAME);
                 if (rr->rr_name == NULL)
                         /*XXX: what about open by FID? */
index febc65a..cd0f8d9 100644 (file)
@@ -82,8 +82,7 @@ static int mdt_create_data_obj(struct mdt_thread_info *info,
         struct md_create_spec *spec = &info->mti_spec;
 
         return mdo_create_data(info->mti_ctxt, mdt_object_child(p),
-                               mdt_object_child(o), spec->u.sp_ea.eadata,
-                               spec->u.sp_ea.eadatalen, ma);
+                               mdt_object_child(o), spec, ma);
 }
 
 
@@ -312,21 +311,20 @@ int mdt_open_by_fid(struct mdt_thread_info* info, const struct lu_fid *fid,
                     __u32 flags)
 {
         struct mdt_object *o;
-        struct lu_attr    *la = &info->mti_attr.ma_attr;
         int                rc;
         ENTRY;
 
         o = mdt_object_find(info->mti_ctxt, info->mti_mdt, fid);
         if (!IS_ERR(o)) {
                 if (mdt_object_exists(info->mti_ctxt, &o->mot_obj.mo_lu) > 0) {
-                        if (la->la_flags & MDS_OPEN_EXCL &&
-                            la->la_flags & MDS_OPEN_CREAT)
+                        if (flags & MDS_OPEN_EXCL &&
+                            flags & MDS_OPEN_CREAT)
                                 rc = -EEXIST;
                         else
                                 rc = mdt_mfd_open(info, NULL, o, flags, 0);
                 } else {
                         rc = -ENOENT;
-                        if (la->la_flags & MDS_OPEN_CREAT) {
+                        if (flags & MDS_OPEN_CREAT) {
                                 rc = mo_object_create(info->mti_ctxt,
                                                       mdt_object_child(o),
                                                       &info->mti_spec,
@@ -366,9 +364,10 @@ int mdt_reint_open(struct mdt_thread_info *info)
         struct lu_fid          *child_fid = &info->mti_tmp_fid1;
         struct md_attr         *ma = &info->mti_attr;
         struct lu_attr         *la = &ma->ma_attr;
+        __u32                   create_flags = info->mti_spec.sp_cr_flags;
+        struct mdt_reint_record *rr = &info->mti_rr;
         int                     result;
         int                     created = 0;
-        struct mdt_reint_record *rr = &info->mti_rr;
         ENTRY;
 
         req_capsule_set_size(&info->mti_pill, &RMF_MDT_MD, RCL_SERVER,
@@ -383,7 +382,8 @@ int mdt_reint_open(struct mdt_thread_info *info)
 
         if (rr->rr_name[0] == 0) {
                 /* reint partial remote open */
-                RETURN(mdt_open_by_fid(info, rr->rr_fid1, la->la_flags));
+                result = mdt_open_by_fid(info, rr->rr_fid1, create_flags);
+                RETURN(result);
         }
 
         /* we now have no resent message, so it must be an intent */
@@ -391,15 +391,15 @@ int mdt_reint_open(struct mdt_thread_info *info)
         LASSERT(info->mti_pill.rc_fmt == &RQF_LDLM_INTENT_OPEN);
 
         CDEBUG(D_INODE, "I am going to create "DFID3"/("DFID3":%s) "
-                        "flag=%x mode=%06o\n",
+                        "cr_flag=%x mode=%06o\n",
                         PFID3(rr->rr_fid1), PFID3(rr->rr_fid2), 
-                        rr->rr_name, la->la_flags, la->la_mode);
+                        rr->rr_name, create_flags, la->la_mode);
 
         ldlm_rep = req_capsule_server_get(&info->mti_pill, &RMF_DLM_REP);
         intent_set_disposition(ldlm_rep, DISP_LOOKUP_EXECD);
 
         lh = &info->mti_lh[MDT_LH_PARENT];
-        if (!(la->la_flags & MDS_OPEN_CREAT))
+        if (!(create_flags & MDS_OPEN_CREAT))
                 lh->mlh_mode = LCK_CR;
         else
                 lh->mlh_mode = LCK_EX;
@@ -415,7 +415,7 @@ int mdt_reint_open(struct mdt_thread_info *info)
 
         if (result == -ENOENT) {
                 intent_set_disposition(ldlm_rep, DISP_LOOKUP_NEG);
-                if (!(la->la_flags & MDS_OPEN_CREAT))
+                if (!(create_flags & MDS_OPEN_CREAT))
                         GOTO(out_parent, result);
                 *child_fid = *info->mti_rr.rr_fid2;
                 /* new object will be created. see the following */
@@ -446,7 +446,7 @@ int mdt_reint_open(struct mdt_thread_info *info)
         }
 
         /* Try to open it now. */
-        result = mdt_mfd_open(info, parent, child, la->la_flags, created);
+        result = mdt_mfd_open(info, parent, child, create_flags, created);
         GOTO(finish_open, result);
 
 finish_open:
index f2f7e74..337e4b3 100644 (file)
@@ -621,33 +621,46 @@ static int osd_attr_set(const struct lu_context *ctxt,
 static int osd_inode_setattr(const struct lu_context *ctx,
                              struct inode *inode, const struct lu_attr *attr)
 {
-        struct iattr iattr;
-        int rc;
+        struct osd_thread_info *info   = lu_context_key_get(ctx, &osd_key);
+        struct dentry          *dentry = &info->oti_dentry;
+        struct iattr           *iattr  = &info->oti_iattr;
+        int                     rc;
+
+        dentry->d_inode = inode;
+        if (attr->la_valid & ATTR_ATTR_FLAG) {  
+                /* this is ioctl */
+                rc = -ENOTTY;
+                if (inode->i_fop->ioctl)
+                        rc = inode->i_fop->ioctl(inode, NULL, EXT3_IOC_SETFLAGS,
+                                                (long)&attr->la_flags);
+                return rc;
+        }
+
+        iattr->ia_valid = attr->la_valid;
+        iattr->ia_mode  = attr->la_mode;
+        iattr->ia_uid   = attr->la_uid;
+        iattr->ia_gid   = attr->la_gid;
+        iattr->ia_size  = attr->la_size;
+        iattr->ia_attr_flags = attr->la_flags;
+        LTIME_S(iattr->ia_atime) = attr->la_atime;
+        LTIME_S(iattr->ia_mtime) = attr->la_mtime;
+        LTIME_S(iattr->ia_ctime) = attr->la_ctime;
 
-        iattr.ia_valid = attr->la_valid;
-        iattr.ia_mode  = attr->la_mode;
-        iattr.ia_uid   = attr->la_uid;
-        iattr.ia_gid   = attr->la_gid;
-        iattr.ia_size  = attr->la_size;
-        LTIME_S(iattr.ia_atime) = attr->la_atime;
-        LTIME_S(iattr.ia_mtime) = attr->la_mtime;
-        LTIME_S(iattr.ia_ctime) = attr->la_ctime;
 
         /* TODO: handle ATTR_SIZE & truncate in the future */
-        //iattr.ia_valid &= ~ATTR_SIZE;
+        //iattr->ia_valid &= ~ATTR_SIZE;
 
         /* Don't allow setattr to change file type */
-        if (iattr.ia_valid & ATTR_MODE)
-                iattr.ia_mode = (inode->i_mode & S_IFMT) |
-                                 (iattr.ia_mode & ~S_IFMT);
-
-//        if (inode->i_op->setattr) {
-//                rc = inode->i_op->setattr(dentry, iattr);
-//        } else
-        {
-                rc = inode_change_ok(inode, &iattr);
+        if (iattr->ia_valid & ATTR_MODE)
+                iattr->ia_mode = (inode->i_mode & S_IFMT) |
+                                 (iattr->ia_mode & ~S_IFMT);
+
+        if (inode->i_op->setattr) {
+                rc = inode->i_op->setattr(dentry, iattr);
+        } else {
+                rc = inode_change_ok(inode, iattr);
                 if (!rc)
-                        rc = inode_setattr(inode, &iattr);
+                        rc = inode_setattr(inode, iattr);
         }
         return rc;
 }
@@ -1934,7 +1947,7 @@ static int osd_inode_getattr(const struct lu_context *ctx,
         attr->la_blocks     = inode->i_blocks;
         attr->la_uid        = inode->i_uid;
         attr->la_gid        = inode->i_gid;
-//      attr->la_flags      = inode->i_flags;
+        attr->la_flags      = inode->i_flags;
         attr->la_nlink      = inode->i_nlink;
         attr->la_rdev       = inode->i_rdev;
         return 0;
index 2690d44..ce0f5d9 100644 (file)
@@ -58,6 +58,7 @@ struct osd_thread_info {
 
         struct lu_fid       oti_fid;
         struct osd_inode_id oti_id;
+        struct iattr        oti_iattr;
         /*
          * XXX temporary: Buffer for fid->name conversion.
          */