Whamcloud - gitweb
Branch: b_new_cmd
authorwangdi <wangdi>
Fri, 4 Aug 2006 01:07:56 +0000 (01:07 +0000)
committerwangdi <wangdi>
Fri, 4 Aug 2006 01:07:56 +0000 (01:07 +0000)
1)some fixes according to nikita's comments
2)mdt_getattr/getattr_name should not have fixed size reply, since EA_DATA is not const,
  and should be set max acl size before pack reply

lustre/mdd/mdd_handler.c
lustre/mdt/mdt_handler.c
lustre/mdt/mdt_open.c
lustre/osd/osd_handler.c
lustre/ptlrpc/layout.c

index 4f38860..99dfb0e 100644 (file)
@@ -949,6 +949,39 @@ static int mdd_create_data_object(const struct lu_context *ctxt,
 
         RETURN(rc);
 }
+
+static int mdd_create_sanity_check(const struct lu_context *ctxt, 
+                                   struct mdd_device *mdd,
+                                   struct md_object *pobj, 
+                                   const char *name, struct md_attr *ma)
+{
+        struct lu_fid *fid;
+        int rc;
+        
+        fid = &mdd_ctx_info(ctxt)->mti_fid;
+        rc = mdd_lookup(ctxt, pobj, name, fid);
+        if (rc != -ENOENT) {
+                rc = rc ? rc : -EEXIST;
+                RETURN(rc);
+        }
+
+        switch (ma->ma_attr.la_mode & S_IFMT) {
+        case S_IFREG:
+        case S_IFDIR:
+        case S_IFLNK:
+        case S_IFCHR:
+        case S_IFBLK:
+        case S_IFIFO:
+        case S_IFSOCK:
+                rc = 0;
+                break;
+        default:
+                rc = -EINVAL;     
+                break;
+        }
+        RETURN(rc); 
+}
+
 /*
  * Create object and insert it into namespace.
  */
@@ -961,19 +994,16 @@ static int mdd_create(const struct lu_context *ctxt, struct md_object *pobj,
         struct mdd_object *mdo = md2mdd_obj(pobj);
         struct mdd_object *son = md2mdd_obj(child);
         struct lu_attr *attr = &ma->ma_attr;
-        struct lu_fid *fid;
         struct lov_mds_md *lmm = NULL;
         struct thandle *handle;
         int rc, created = 0, inserted = 0, lmm_size = 0;
         ENTRY;
 
         /* sanity checks before big job */
-        fid = &mdd_ctx_info(ctxt)->mti_fid;
-        rc = mdd_lookup(ctxt, pobj, name, fid);
-        if (rc != -ENOENT) {
-                rc = rc ? rc : -EEXIST;
+        rc = mdd_create_sanity_check(ctxt, mdd, pobj, name, ma);
+        if (rc)
                 RETURN(rc);
-        }
+
         /* no RPC inside the transaction, so OST objects should be created at
          * first */
 
index f2dfabf..c58a77c 100644 (file)
@@ -53,6 +53,7 @@
 #include <obd.h>
 /* lu2dt_dev() */
 #include <dt_object.h>
+#include <lustre_mds.h> 
 #include "mdt_internal.h"
 
 /*
@@ -322,6 +323,14 @@ static int mdt_getattr(struct mdt_thread_info *info)
         LASSERT(lu_object_assert_exists(info->mti_ctxt,
                                         &info->mti_object->mot_obj.mo_lu));
         ENTRY;
+        
+
+        req_capsule_set_size(&info->mti_pill, &RMF_EADATA,
+                             RCL_SERVER, LUSTRE_POSIX_ACL_MAX_SIZE);
+       
+        result = req_capsule_pack(&info->mti_pill);
+        if (result)
+                RETURN(result);
 
         if (MDT_FAIL_CHECK(OBD_FAIL_MDS_GETATTR_PACK)) {
                 result = -ENOMEM;
@@ -446,6 +455,12 @@ static int mdt_getattr_name(struct mdt_thread_info *info)
 
         ENTRY;
 
+        req_capsule_set_size(&info->mti_pill, &RMF_EADATA,
+                             RCL_SERVER, LUSTRE_POSIX_ACL_MAX_SIZE);
+       
+        rc = req_capsule_pack(&info->mti_pill);
+        if (rc)
+                RETURN(rc);
         rc = mdt_getattr_name_lock(info, lhc, MDS_INODELOCK_UPDATE, NULL);
         if (lustre_handle_is_used(&lhc->mlh_lh)) {
                 ldlm_lock_decref(&lhc->mlh_lh, lhc->mlh_mode);
@@ -1511,10 +1526,10 @@ static int mdt_intent_getattr(enum mdt_it_code opcode,
 
         req_capsule_set_size(&info->mti_pill, &RMF_MDT_MD,
                              RCL_SERVER, mdt->mdt_max_mdsize);
-#ifdef CONFIG_FS_POSIX_ACL
+
         req_capsule_set_size(&info->mti_pill, &RMF_EADATA,
-                             RCL_SERVER, mdt->mdt_max_cookiesize);
-#endif
+                             RCL_SERVER, LUSTRE_POSIX_ACL_MAX_SIZE);
+
         rc = req_capsule_pack(&info->mti_pill);
         if (rc)
                 RETURN(rc);
@@ -2824,8 +2839,8 @@ static struct mdt_handler mdt_mds_ops[] = {
 DEF_MDT_HNDL_F(0,                         CONNECT,      mdt_connect),
 DEF_MDT_HNDL_F(0,                         DISCONNECT,   mdt_disconnect),
 DEF_MDT_HNDL_F(0           |HABEO_REFERO, GETSTATUS,    mdt_getstatus),
-DEF_MDT_HNDL_F(HABEO_CORPUS|HABEO_REFERO, GETATTR,      mdt_getattr),
-DEF_MDT_HNDL_F(HABEO_CORPUS|HABEO_REFERO, GETATTR_NAME, mdt_getattr_name),
+DEF_MDT_HNDL_F(HABEO_CORPUS             , GETATTR,      mdt_getattr),
+DEF_MDT_HNDL_F(HABEO_CORPUS             , GETATTR_NAME, mdt_getattr_name),
 DEF_MDT_HNDL_F(HABEO_CORPUS|HABEO_REFERO|MUTABOR,
                                           SETXATTR,     mdt_setxattr),
 DEF_MDT_HNDL_F(HABEO_CORPUS,              GETXATTR,     mdt_getxattr),
index 5ac05d8..51b7dcb 100644 (file)
@@ -31,6 +31,7 @@
 #endif
 #define DEBUG_SUBSYSTEM S_MDS
 
+#include <lustre_mds.h>
 #include "mdt_internal.h"
 
 /* we do nothing because we do not have refcount now */
@@ -264,6 +265,10 @@ int mdt_reint_open(struct mdt_thread_info *info)
 
         req_capsule_set_size(&info->mti_pill, &RMF_MDT_MD, RCL_SERVER,
                              mdt->mdt_max_mdsize);
+
+        req_capsule_set_size(&info->mti_pill, &RMF_EADATA, RCL_SERVER,
+                             LUSTRE_POSIX_ACL_MAX_SIZE);
+
         result = req_capsule_pack(&info->mti_pill);
         if (result)
                 RETURN(result);
index a9543be..8995e85 100644 (file)
@@ -624,26 +624,7 @@ static int osd_inode_setattr(const struct lu_context *ctx,
 static int osd_create_pre(struct osd_thread_info *info, struct osd_object *obj,
                           struct lu_attr *attr, struct thandle *th)
 {
-        int result = 0;
-
-        /*sanity check the attr mode*/
-        switch (attr->la_mode & S_IFMT) {
-        case S_IFDIR:
-        case S_IFREG:
-        case S_IFLNK:
-        case S_IFCHR:
-        case S_IFBLK:
-        case S_IFIFO:
-        case S_IFSOCK:
-                result = 0;
-                break;
-        default:
-                CERROR("bad file type %o creating %s\n", attr->la_mode, 
-                       info->oti_name);
-                result = -EINVAL;
-                break;
-        }
-        return result;
+        return 0;
 }
 
 static int osd_create_post(struct osd_thread_info *info, struct osd_object *obj,
@@ -663,7 +644,7 @@ static void osd_fid_build_name(const struct lu_fid *fid, char *name)
 }
 
 static int osd_mkfile(struct osd_thread_info *info, struct osd_object *obj,
-                      umode_t mode, dev_t dev, struct thandle *th)
+                      umode_t mode, struct thandle *th)
 {
         int result;
         struct osd_device *osd = osd_obj2dev(obj);
@@ -687,23 +668,8 @@ static int osd_mkfile(struct osd_thread_info *info, struct osd_object *obj,
 
         dentry = d_alloc(osd->od_obj_area, &info->oti_str);
         if (dentry != NULL) {
-                switch (mode & S_IFMT) {
-                case S_IFDIR:
-                case S_IFREG:
-                case S_IFLNK:
-                        result = dir->i_op->create(dir, dentry, mode, NULL);
-                        break;
-                case S_IFCHR:
-                case S_IFBLK:
-                case S_IFIFO:
-                case S_IFSOCK:
-                        result = dir->i_op->mknod(dir, dentry, mode, dev);
-                        break;
-                default:
-                        result = -EINVAL;
-                        break;
-                }
-                if (result == 0) {
+               result = dir->i_op->create(dir, dentry, mode, NULL);
+               if (result == 0) {
                         LASSERT(dentry->d_inode != NULL);
                         obj->oo_inode = dentry->d_inode;
                         igrab(obj->oo_inode);
@@ -732,7 +698,7 @@ static int osd_mkdir(struct osd_thread_info *info, struct osd_object *obj,
         oth = container_of0(th, struct osd_thandle, ot_super);
         LASSERT(S_ISDIR(attr->la_mode));
         result = osd_mkfile(info, obj, (attr->la_mode & 
-                            (S_IFMT |(S_IRWXUGO|S_ISVTX))), 0, th);
+                            (S_IFMT | S_IRWXUGO | S_ISVTX)), th);
         if (result == 0) {
                 LASSERT(obj->oo_inode != NULL);
                 /*
@@ -750,8 +716,7 @@ static int osd_mkreg(struct osd_thread_info *info, struct osd_object *obj,
 {
         LASSERT(S_ISREG(attr->la_mode));
         return osd_mkfile(info, obj, (attr->la_mode & 
-                               (S_IFMT|S_IRWXUGO|S_ISVTX)), 
-                          0, th);
+                               (S_IFMT | S_IRWXUGO | S_ISVTX)), th);
 }
 
 static int osd_mksym(struct osd_thread_info *info, struct osd_object *obj,
@@ -759,16 +724,46 @@ static int osd_mksym(struct osd_thread_info *info, struct osd_object *obj,
 {
         LASSERT(S_ISLNK(attr->la_mode));
         return osd_mkfile(info, obj, (attr->la_mode & 
-                              (S_IFMT|S_IRWXUGO|S_ISVTX)), 
-                          0, th);
+                              (S_IFMT | S_IRWXUGO | S_ISVTX)), th);
 }
 
 static int osd_mknod(struct osd_thread_info *info, struct osd_object *obj,
                      struct lu_attr *attr, struct thandle *th)
 {
-        return osd_mkfile(info, obj, (attr->la_mode & 
-                           (S_IFMT | S_IRWXUGO | S_ISVTX)), 
-                          attr->la_rdev, th);
+        int result;
+        struct osd_device *osd = osd_obj2dev(obj);
+        struct inode      *dir;
+        umode_t mode = attr->la_mode & (S_IFMT | S_IRWXUGO | S_ISVTX);
+
+        /*
+         * XXX temporary solution.
+         */
+        struct dentry     *dentry;
+
+        LASSERT(osd_invariant(obj));
+        LASSERT(obj->oo_inode == NULL);
+        LASSERT(osd->od_obj_area != NULL);
+
+        dir = osd->od_obj_area->d_inode;
+        LASSERT(dir->i_op != NULL && dir->i_op->create != NULL);
+
+        osd_fid_build_name(lu_object_fid(&obj->oo_dt.do_lu), info->oti_name);
+        info->oti_str.name = info->oti_name;
+        info->oti_str.len  = strlen(info->oti_name);
+
+        dentry = d_alloc(osd->od_obj_area, &info->oti_str);
+        if (dentry != NULL) {
+               result = dir->i_op->mknod(dir, dentry, mode, attr->la_rdev);
+               if (result == 0) {
+                        LASSERT(dentry->d_inode != NULL);
+                        obj->oo_inode = dentry->d_inode;
+                        igrab(obj->oo_inode);
+                }
+                dput(dentry);
+        } else
+                result = -ENOMEM;
+        LASSERT(osd_invariant(obj));
+        return result;
 }
 
 typedef int (*osd_obj_type_f)(struct osd_thread_info *, struct osd_object *,
index f865c37..4f1a402 100644 (file)
@@ -50,7 +50,6 @@
 
 /* __REQ_LAYOUT_USER__ */
 #endif
-
 /* struct ptlrpc_request, lustre_msg* */
 #include <lustre_req_layout.h>
 
@@ -385,7 +384,7 @@ EXPORT_SYMBOL(RMF_REC_SETATTR);
 
 /* FIXME: this length should be defined as a macro*/
 const struct req_msg_field RMF_EADATA = DEFINE_MSGF("eadata", 0, 
-                                4, NULL);
+                                0, NULL);
 EXPORT_SYMBOL(RMF_EADATA);
 
 const struct req_msg_field RMF_LOGCOOKIES =