Whamcloud - gitweb
- use md_attr in mo_attr_set() and set lov ea together with inode attr.
authortappro <tappro>
Sun, 6 Aug 2006 21:16:50 +0000 (21:16 +0000)
committertappro <tappro>
Sun, 6 Aug 2006 21:16:50 +0000 (21:16 +0000)
- while attr_set() return resulting attr back
- move O_EXCL check later, because reply should contain the FID

lustre/cmm/cmm_object.c
lustre/include/md_object.h
lustre/mdd/mdd_handler.c
lustre/mdt/mdt_handler.c
lustre/mdt/mdt_lib.c
lustre/mdt/mdt_open.c
lustre/mdt/mdt_reint.c

index 7884c89..c9b4806 100644 (file)
@@ -231,7 +231,7 @@ static int cml_attr_get(const struct lu_context *ctx, struct md_object *mo,
 }
 
 static int cml_attr_set(const struct lu_context *ctx, struct md_object *mo,
-                        const struct lu_attr *attr)
+                        struct md_attr *attr)
 {
         int rc;
         ENTRY;
@@ -561,7 +561,7 @@ static int cmr_attr_get(const struct lu_context *ctx, struct md_object *mo,
 }
 
 static int cmr_attr_set(const struct lu_context *ctx, struct md_object *mo,
-                        const struct lu_attr *attr)
+                        struct md_attr *attr)
 {
         RETURN(-EFAULT);
 }
index aad5d66..53e2a0b 100644 (file)
@@ -83,7 +83,7 @@ struct md_object_operations {
         int (*moo_attr_get)(const struct lu_context *ctxt, struct md_object *dt,
                             struct md_attr *attr);
         int (*moo_attr_set)(const struct lu_context *ctxt, struct md_object *dt,
-                            const struct lu_attr *attr);
+                            struct md_attr *attr);
 
         int (*moo_xattr_get)(const struct lu_context *ctxt,
                              struct md_object *obj,
@@ -247,7 +247,7 @@ static inline int mo_readlink(const struct lu_context *cx, struct md_object *m,
 }
 
 static inline int mo_attr_set(const struct lu_context *cx, struct md_object *m,
-                              const struct lu_attr *at)
+                              struct md_attr *at)
 {
         LASSERT(m->mo_ops->moo_attr_set);
         return m->mo_ops->moo_attr_set(cx, m, at);
index 4479963..0e1f301 100644 (file)
@@ -142,12 +142,12 @@ static int mdd_attr_get(const struct lu_context *ctxt,
         if (rc == 0) {
                 LASSERT((ma->ma_attr.la_mode & S_IFMT) ==
                         (obj->mo_lu.lo_header->loh_attr & S_IFMT));
-                ma->ma_valid |= MA_INODE;
+                ma->ma_valid = MA_INODE;
                 /* get LOV EA also */
                 if ((S_ISREG(ma->ma_attr.la_mode)
                      || S_ISDIR(ma->ma_attr.la_mode))
                      && ma->ma_lmm != 0 && ma->ma_lmm_size > 0) {
-                        rc = mdd_get_md(ctxt, obj, ma->ma_lmm,&ma->ma_lmm_size);
+                        rc = mdd_get_md(ctxt, obj, ma->ma_lmm, &ma->ma_lmm_size);
                         if (rc > 0) {
                                 ma->ma_valid |= MA_LOV;
                                 rc = 0;
@@ -445,18 +445,32 @@ static int __mdd_object_create(const struct lu_context *ctxt,
         RETURN(rc);
 }
 
-static int __mdd_attr_set(const struct lu_context *ctxt, struct md_object *obj,
+static int __mdd_attr_set(const struct lu_context *ctxt, struct mdd_object *o,
                           const struct lu_attr *attr, struct thandle *handle)
 {
         struct dt_object *next;
 
-        LASSERT(lu_object_exists(ctxt, &obj->mo_lu));
-        next = mdd_object_child(md2mdd_obj(obj));
+        LASSERT(lu_object_exists(ctxt, mdd2lu_obj(o)));
+        next = mdd_object_child(o);
         return next->do_ops->do_attr_set(ctxt, next, attr, handle);
 }
 
+static int __mdd_xattr_set(const struct lu_context *ctxt, struct mdd_object *o,
+                           const void *buf, int buf_len, const char *name,
+                           int fl, struct thandle *handle)
+{
+        struct dt_object *next;
+
+        LASSERT(lu_object_exists(ctxt, mdd2lu_obj(o)));
+        next = mdd_object_child(o);
+        return next->do_ops->do_xattr_set(ctxt, next, buf, buf_len, name, fl,
+                                          handle);
+}
+
+
+/* set attr and LOV EA at once, return updated attr */
 static int mdd_attr_set(const struct lu_context *ctxt,
-                        struct md_object *obj, const struct lu_attr *attr)
+                        struct md_object *obj, struct md_attr *ma)
 {
         struct mdd_object *mdo = md2mdd_obj(obj);
         struct mdd_device *mdd = mdo2mdd(obj);
@@ -470,39 +484,35 @@ static int mdd_attr_set(const struct lu_context *ctxt,
                 RETURN(PTR_ERR(handle));
 
         mdd_lock(ctxt, mdo, DT_WRITE_LOCK);
-        rc = __mdd_attr_set(ctxt, obj, attr, handle);
-        mdd_unlock(ctxt, mdo, DT_WRITE_LOCK);
 
+        rc = __mdd_attr_set(ctxt, md2mdd_obj(obj), &ma->ma_attr, handle);
+        if (rc == 0 && (ma->ma_valid & MA_LOV)) {
+                /* set LOV ea now */
+                rc = __mdd_xattr_set(ctxt, md2mdd_obj(obj),
+                                     ma->ma_lmm, ma->ma_lmm_size,
+                                     XATTR_NAME_LOV, 0, handle);
+        }
+        /* XXX: llog cancel cookie? */
+
+        if (rc == 0)
+                rc = mdd_attr_get(ctxt, obj, ma);
+        
+        mdd_unlock(ctxt, mdo, DT_WRITE_LOCK);
         mdd_trans_stop(ctxt, mdd, handle);
 
         RETURN(rc);
 }
 
-static int __mdd_xattr_set(const struct lu_context *ctxt,struct mdd_device *mdd,
-                           struct mdd_object *obj, const void *buf,
-                           int buf_len, const char *name, int fl,
-                           struct thandle *handle)
-{
-        struct dt_object *next;
-
-        LASSERT(lu_object_exists(ctxt, mdd2lu_obj(obj)));
-        next = mdd_object_child(obj);
-        return next->do_ops->do_xattr_set(ctxt, next, buf, buf_len, name, fl,
-                                          handle);
-}
-
 int mdd_xattr_set_txn(const struct lu_context *ctxt, struct md_object *obj,
                       const void *buf, int buf_len, const char *name, int fl,
                       struct thandle *handle)
 {
         struct mdd_object *mdo = md2mdd_obj(obj);
-        struct mdd_device *mdd = mdo2mdd(obj);
         int  rc;
         ENTRY;
 
-
         mdd_lock(ctxt, mdo, DT_WRITE_LOCK);
-        rc = __mdd_xattr_set(ctxt, mdd, md2mdd_obj(obj), buf, buf_len, name,
+        rc = __mdd_xattr_set(ctxt, md2mdd_obj(obj), buf, buf_len, name,
                              fl, handle);
         mdd_unlock(ctxt, mdo, DT_WRITE_LOCK);
 
index e8bdf43..0715451 100644 (file)
@@ -247,7 +247,8 @@ static int mdt_getattr_internal(struct mdt_thread_info *info,
                 mdt_pack_attr2body(repbody, la, mdt_object_fid(o));
 
         if (mdt_body_has_lov(la, reqbody)) {
-                if (ma->ma_lmm_size && ma->ma_valid & MA_LOV) {
+                if (/*ma->ma_lmm_size && */(ma->ma_valid & MA_LOV)) {
+                        LASSERT(ma->ma_lmm_size);
                         CDEBUG(D_INODE, "packing ea for "DFID3"\n",
                                         PFID3(mdt_object_fid(o)));
                         mdt_dump_lmm(D_INFO, ma->ma_lmm);
@@ -263,9 +264,9 @@ static int mdt_getattr_internal(struct mdt_thread_info *info,
                 } else {
                         repbody->valid |= OBD_MD_LINKNAME;
                         repbody->eadatasize = rc + 1;
-                        ((char*)ma->ma_lmm)[rc] = 0;        /* NULL terminate */
+                        ((char*)ma->ma_lmm)[rc] = 0; /* NULL terminate */
                         CDEBUG(D_INODE, "symlink dest %s, len = %d\n",
-                                        (char*)buffer, rc);
+                                        (char*)ma->ma_lmm, rc);
                         rc = 0;
                 }
         }
index feabe4f..0106db1 100644 (file)
@@ -112,13 +112,14 @@ int mdt_handle_last_unlink(struct mdt_thread_info *info, struct mdt_object *mo,
                                                  &RMF_MDT_BODY);
                 if (ma->ma_valid & MA_INODE)
                         mdt_pack_attr2body(repbody, la, mdt_object_fid(mo));
-                if (ma->ma_lmm_size && ma->ma_valid & MA_LOV) {
+                if (/*ma->ma_lmm_size && */(ma->ma_valid & MA_LOV)) {
+                        LASSERT(ma->ma_lmm_size);
                         mdt_dump_lmm(D_INFO, ma->ma_lmm);
                         repbody->eadatasize = ma->ma_lmm_size;
                         repbody->valid |= OBD_MD_FLEASIZE;
                 }
 
-                if (ma->ma_cookie_size && ma->ma_valid & MA_COOKIE)
+                if (ma->ma_cookie_size && (ma->ma_valid & MA_COOKIE))
                         repbody->valid |= OBD_MD_FLCOOKIE;
         }
 
@@ -129,7 +130,8 @@ int mdt_handle_last_unlink(struct mdt_thread_info *info, struct mdt_object *mo,
 static int mdt_setattr_unpack(struct mdt_thread_info *info)
 {
         struct mdt_rec_setattr  *rec;
-        struct lu_attr          *attr = &info->mti_attr.ma_attr;
+        struct md_attr          *ma = &info->mti_attr;
+        struct lu_attr          *la = &ma->ma_attr;
         struct mdt_reint_record *rr = &info->mti_rr;
         struct req_capsule      *pill = &info->mti_pill;
         ENTRY;
@@ -140,27 +142,30 @@ static int mdt_setattr_unpack(struct mdt_thread_info *info)
                 RETURN(-EFAULT);
 
         rr->rr_fid1 = &rec->sa_fid;
-        attr->la_valid = rec->sa_valid;
-        attr->la_mode  = rec->sa_mode;
-        attr->la_uid   = rec->sa_uid;
-        attr->la_gid   = rec->sa_gid;
-        attr->la_size  = rec->sa_size;
-        attr->la_flags = rec->sa_attr_flags;
-        attr->la_ctime = rec->sa_ctime;
-        attr->la_atime = rec->sa_atime;
-        attr->la_mtime = rec->sa_mtime;
+        la->la_valid = rec->sa_valid;
+        la->la_mode  = rec->sa_mode;
+        la->la_uid   = rec->sa_uid;
+        la->la_gid   = rec->sa_gid;
+        la->la_size  = rec->sa_size;
+        la->la_flags = rec->sa_attr_flags;
+        la->la_ctime = rec->sa_ctime;
+        la->la_atime = rec->sa_atime;
+        la->la_mtime = rec->sa_mtime;
+        ma->ma_valid = MA_INODE;
 
         if (req_capsule_field_present(pill, &RMF_EADATA)) {
-                rr->rr_eadata = req_capsule_client_get(pill, &RMF_EADATA);
-                rr->rr_eadatalen = req_capsule_get_size(pill, &RMF_EADATA,
-                                                        RCL_CLIENT);
+                ma->ma_lmm = req_capsule_client_get(pill, &RMF_EADATA);
+                ma->ma_lmm_size = req_capsule_get_size(pill, &RMF_EADATA,
+                                                       RCL_CLIENT);
+                ma->ma_valid |= MA_LOV;
         }
         if (req_capsule_field_present(pill, &RMF_LOGCOOKIES)) {
-                rr->rr_logcookies = req_capsule_client_get(pill,
-                                                           &RMF_LOGCOOKIES);
-                rr->rr_logcookielen = req_capsule_get_size(pill,
-                                                           &RMF_LOGCOOKIES,
-                                                           RCL_CLIENT);
+                ma->ma_cookie = req_capsule_client_get(pill,
+                                                       &RMF_LOGCOOKIES);
+                ma->ma_cookie_size = req_capsule_get_size(pill,
+                                                          &RMF_LOGCOOKIES,
+                                                          RCL_CLIENT);
+                ma->ma_valid |= MA_COOKIE;
         }
 
         RETURN(0);
index 2f05e25..3b08886 100644 (file)
@@ -189,12 +189,18 @@ static int mdt_mfd_open(struct mdt_thread_info *info,
                 if (rc)
                         RETURN(rc);
         }
+
         isreg = S_ISREG(la->la_mode);
         isdir = S_ISDIR(la->la_mode);
         islnk = S_ISLNK(la->la_mode);
         if (ma->ma_valid & MA_INODE)
                 mdt_pack_attr2body(repbody, la, mdt_object_fid(o));
 
+        /* this check need to return the exists object's fid back, so it is done
+         * here, after preparing the reply */
+        if (!created && (flags & MDS_OPEN_EXCL) && (flags & MDS_OPEN_CREAT))
+                RETURN (-EEXIST);
+
         /* if we are following a symlink, don't open
          * do not return open handle for special nodes as client required
          */
@@ -203,7 +209,7 @@ static int mdt_mfd_open(struct mdt_thread_info *info,
                 info->mti_trans_flags |= MDT_NONEED_TANSNO; 
                 RETURN(0);
         }
-        /* FIXME:maybe this can be done earlier? */
+        /* This can't be done earlier, we need to return reply body */
         if (isdir) {
                 if (flags & (MDS_OPEN_CREAT | FMODE_WRITE)) {
                         /* we are trying to create or
@@ -213,6 +219,7 @@ static int mdt_mfd_open(struct mdt_thread_info *info,
         } else if (flags & MDS_OPEN_DIRECTORY)
                 RETURN(-ENOTDIR);
 
+#if 0
         if ((isreg) && !(ma->ma_valid & MA_LOV)) {
                 /*No EA, check whether it is will set regEA and dirEA
                  *since in above attr get, these size might be zero,
@@ -227,13 +234,14 @@ static int mdt_mfd_open(struct mdt_thread_info *info,
                         RETURN(rc);
                 */
         }
-
+#endif
         CDEBUG(D_INODE, "after open, ma_valid bit = "LPX64" lmm_size = %d\n", 
                         ma->ma_valid, ma->ma_lmm_size);
         repbody->eadatasize = 0;
         repbody->aclsize = 0;
 
-        if (ma->ma_lmm_size && ma->ma_valid & MA_LOV) {
+        if (/*ma->ma_lmm_size && */ma->ma_valid & MA_LOV) {
+                LASSERT(ma->ma_lmm_size);
                 repbody->eadatasize = ma->ma_lmm_size;
                 if (isdir)
                         repbody->valid |= OBD_MD_FLDIREA;
@@ -413,11 +421,11 @@ int mdt_reint_open(struct mdt_thread_info *info)
                 /* new object will be created. see the following */
         } else {
                 intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS);
-                if ((la->la_flags & MDS_OPEN_EXCL &&
-                         la->la_flags & MDS_OPEN_CREAT))
-                        GOTO(out_parent, result = -EEXIST);
+                /* check for O_EXCL is moved to the mdt_mfd_open, we need to
+                 * return FID back in that case */
         }
 
+
         child = mdt_object_find(info->mti_ctxt, mdt, child_fid);
         if (IS_ERR(child))
                 GOTO(out_parent, result = PTR_ERR(child));
@@ -437,7 +445,7 @@ int mdt_reint_open(struct mdt_thread_info *info)
                 created = 1;
         }
 
-        /* Open it now. */
+        /* Try to open it now. */
         result = mdt_mfd_open(info, parent, child, la->la_flags, created);
         GOTO(finish_open, result);
 
@@ -504,7 +512,7 @@ int mdt_close(struct mdt_thread_info *info)
 
                 o = mfd->mfd_object;
                 ma->ma_lmm = req_capsule_server_get(&info->mti_pill,
-                                                    &RMF_MDT_MD);
+                                                        &RMF_MDT_MD);
                 ma->ma_lmm_size = req_capsule_get_size(&info->mti_pill,
                                                        &RMF_MDT_MD, RCL_SERVER);
                 rc = mo_attr_get(info->mti_ctxt, mdt_object_child(o), ma);
index 854822c..5246e8b 100644 (file)
@@ -158,11 +158,8 @@ static int mdt_reint_setattr(struct mdt_thread_info *info)
         if (lu_object_exists(info->mti_ctxt, &mo->mot_obj.mo_lu) <= 0)
                 GOTO(out_unlock, rc = -ENOENT);
 
-        rc = mo_attr_set(info->mti_ctxt, next, attr);
-        if (rc != 0)
-                GOTO(out_unlock, rc);
-
-        rc = mo_attr_get(info->mti_ctxt, next,  &info->mti_attr);
+        /* all attrs are packed into mti_attr in unpack_setattr */
+        rc = mo_attr_set(info->mti_ctxt, next, &info->mti_attr);
         if (rc != 0)
                 GOTO(out_unlock, rc);
 
@@ -177,16 +174,6 @@ static int mdt_reint_setattr(struct mdt_thread_info *info)
         if (valid & (ATTR_ATIME | ATTR_ATIME_SET))
                 repbody->valid |= OBD_MD_FLATIME;
         */
-        /* FIXME: I have to combine the attr_set & xattr_set into one single
-                  transaction. How can I?
-         */
-
-        if (rr->rr_eadatalen > 0)
-                rc = mo_xattr_set(info->mti_ctxt, next,
-                                  rr->rr_eadata, rr->rr_eadatalen,
-                                  XATTR_NAME_LOV, 0);
-
-        /* FIXME & TODO Please deal with logcookies here*/
         GOTO(out_unlock, rc);
 out_unlock:
         mdt_object_unlock_put(info, mo, lh, rc);