Whamcloud - gitweb
Branch: HEAD
authorwangdi <wangdi>
Wed, 20 Jul 2005 12:34:28 +0000 (12:34 +0000)
committerwangdi <wangdi>
Wed, 20 Jul 2005 12:34:28 +0000 (12:34 +0000)
add setxattr kml post hook for reint set md to master mds.

lustre/include/linux/lustre_idl.h
lustre/mds/handler.c
lustre/mds/mds_fs.c
lustre/mds/mds_reint.c
lustre/smfs/fsfilt.c
lustre/smfs/kml.c
lustre/smfs/mds_kml.c
lustre/smfs/smfs_api.h
lustre/smfs/smfs_internal.h

index a20a8a0..b0d4190 100644 (file)
@@ -570,10 +570,11 @@ typedef enum {
 #define REINT_LINK         3
 #define REINT_UNLINK       4
 #define REINT_RENAME       5
-#define REINT_OPEN         6
-#define REINT_CLOSE        7
-#define REINT_WRITE        8
-#define REINT_MAX          8
+#define REINT_SETXATTR     6 
+#define REINT_OPEN         7 
+#define REINT_CLOSE        8 
+#define REINT_WRITE        9 
+#define REINT_MAX          9 
 
 /* the disposition of the intent outlines what was executed */
 #define DISP_IT_EXECD     (1 << 0)
@@ -731,7 +732,7 @@ struct mds_rec_setattr {
 #define ATTR_CTIME_SET  0x00002000
 #define ATTR_EA         0x00040000
 #define ATTR_EA_RM      0x00080000
-
+#define ATTR_EA_CMOBD   0x00100000
 extern void lustre_swab_mds_rec_setattr (struct mds_rec_setattr *sa);
 
 #ifndef FMODE_READ
index 969ad6d..ef135b5 100644 (file)
@@ -3600,6 +3600,26 @@ err_ops:
         return rc;
 }
 
+static int mds_fs_post_setup(struct obd_device *obd)
+{
+        struct mds_obd *mds = &obd->u.mds;
+        struct dentry *dentry;
+        int rc = 0;
+        ENTRY;
+       
+        dentry = mds_id2dentry(obd, &mds->mds_rootid, NULL);
+        if (IS_ERR(dentry)) {
+                CERROR("Can't find ROOT, err = %d\n",
+                       (int)PTR_ERR(dentry));
+                RETURN(PTR_ERR(dentry));
+        }
+        
+        rc = fsfilt_post_setup(obd, dentry);
+
+        l_dput(dentry);
+        RETURN(rc); 
+}
+
 static int mds_postsetup(struct obd_device *obd)
 {
         struct mds_obd *mds = &obd->u.mds;
@@ -3646,7 +3666,9 @@ static int mds_postsetup(struct obd_device *obd)
                 if (rc)
                         GOTO(err_cleanup, rc);
         }
-
+        rc = mds_fs_post_setup(obd);
+        if (rc)
+                CERROR("can not post setup fsfilt\n");        
         RETURN(rc);
 err_cleanup:
         mds_dt_clean(obd);
index 811e838..f554b4c 100644 (file)
@@ -429,26 +429,6 @@ err_msd:
         RETURN(rc);
 }
 
-static int mds_fs_post_setup(struct obd_device *obd)
-{
-        struct mds_obd *mds = &obd->u.mds;
-        struct dentry *dentry;
-        int rc = 0;
-        ENTRY;
-       
-        dentry = mds_id2dentry(obd, &mds->mds_rootid, NULL);
-        if (IS_ERR(dentry)) {
-                CERROR("Can't find ROOT, err = %d\n",
-                       (int)PTR_ERR(dentry));
-                RETURN(PTR_ERR(dentry));
-        }
-        
-        rc = fsfilt_post_setup(obd, dentry);
-
-        l_dput(dentry);
-        RETURN(rc); 
-}
-
 /*
  * sets up root inode lustre_id. It tries to read it first from root inode and
  * if it is not there, new rootid is allocated and saved there.
@@ -793,11 +773,6 @@ int mds_fs_setup(struct obd_device *obd, struct vfsmount *mnt)
                 GOTO(err_lov_objid, rc = -ENOENT);
         }
 err_pop:
-        if (!rc) {
-                rc = mds_fs_post_setup(obd);
-                if (rc)
-                        CERROR("can not post setup fsfilt\n");        
-        }
         pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
         return rc;
 
index 84a5349..81a3573 100644 (file)
@@ -394,7 +394,25 @@ static void reconstruct_reint_setattr(struct mds_update_record *rec,
 
         l_dput(de);
 }
+/*This is a tmp fix for cmobd setattr reint*/
 
+#define XATTR_LUSTRE_MDS_LOV_EA         "lov"
+#define XATTR_LUSTRE_MDS_MEA_EA         "mea"
+#define XATTR_LUSTRE_MDS_MID_EA         "mid"
+#define XATTR_LUSTRE_MDS_SID_EA         "sid"
+
+static int mds_get_md_type(char *name)
+{
+        if (!strcmp(name, XATTR_LUSTRE_MDS_LOV_EA)) 
+                RETURN(EA_LOV);
+        if (!strcmp(name, XATTR_LUSTRE_MDS_MEA_EA))
+                RETURN(EA_MEA);
+        if (!strcmp(name, XATTR_LUSTRE_MDS_MID_EA))
+                RETURN(EA_MID);
+        if (!strcmp(name, XATTR_LUSTRE_MDS_SID_EA))
+                RETURN(EA_SID);
+        RETURN(0);
+}
 /* In the raw-setattr case, we lock the child inode.
  * In the write-back case or if being called from open, the client holds a lock
  * already.
@@ -501,6 +519,21 @@ static int mds_reint_setattr(struct mds_update_record *rec, int offset,
                         rc = -EOPNOTSUPP;
                         if (inode->i_op && inode->i_op->removexattr) 
                                 rc = inode->i_op->removexattr(de, rec->ur_eadata);
+                } else if (rec->ur_iattr.ia_valid & ATTR_EA_CMOBD) {
+                        char *name;
+                        int type;
+                        /*tmp fix for cmobd set md reint*/
+                        LASSERT(rec->ur_eadata != NULL);
+                        LASSERT(rec->ur_ea2data != NULL);
+                        name = rec->ur_eadata;
+                        CDEBUG(D_INFO, "set %s EA for cmobd \n", name);
+                        type = mds_get_md_type(name);
+                        if (type != 0) 
+                                rc = fsfilt_set_md(obd, inode, handle, 
+                                                   rec->ur_ea2data,
+                                                   rec->ur_ea2datalen, type);
+                        if (rc)
+                                GOTO(cleanup, rc);               
                 } else if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)) {
                         struct lov_stripe_md *lsm = NULL;
                         struct lov_user_md *lum = NULL;
@@ -798,7 +831,7 @@ static int mds_reint_create(struct mds_update_record *rec, int offset,
                 if (IS_ERR(handle))
                         GOTO(cleanup, rc = PTR_ERR(handle));
                 rc = ll_vfs_create(dir, dchild, rec->ur_mode, NULL);
-                
+#if 0                
                 if (rc == 0 && rec->ur_eadata) {
                         /*for CMOBD to set lov md info when cmobd reint create*/
                         CDEBUG(D_INFO, "set lsm %p, len %d to inode %lu \n", 
@@ -807,6 +840,7 @@ static int mds_reint_create(struct mds_update_record *rec, int offset,
                         fsfilt_set_md(obd, dchild->d_inode, handle, rec->ur_eadata,
                                       rec->ur_eadatalen, EA_LOV);  
                 }
+#endif
                 EXIT;
                 break;
         }
index ceb6a63..deaef94 100644 (file)
@@ -681,14 +681,19 @@ static int fsfilt_smfs_setattr(struct dentry *dentry, void *handle,
         post_smfs_dentry(cache_dentry);
         RETURN(rc);
 }
-
 static int fsfilt_smfs_set_xattr(struct inode *inode, void *handle, char *name,
                                  void *buffer, int buffer_size)
 {
         struct  fsfilt_operations *cache_fsfilt = I2FOPS(inode);
         struct  inode *cache_inode = NULL;
+        struct hook_setxattr_msg msg = {
+                .inode = inode,
+                .name = name,
+                .buffer = buffer,
+                .buffer_size = buffer_size
+        };
         int     rc = -EIO;
-
+        
         ENTRY;
         
         if (!cache_fsfilt)
@@ -697,12 +702,15 @@ static int fsfilt_smfs_set_xattr(struct inode *inode, void *handle, char *name,
         cache_inode = I2CI(inode);
         if (!cache_inode)
                 RETURN(rc);
-
+        
         pre_smfs_inode(inode, cache_inode);
 
+        SMFS_PRE_HOOK(inode, HOOK_F_SETXATTR, &msg);
         if (cache_fsfilt->fs_set_xattr)
                 rc = cache_fsfilt->fs_set_xattr(cache_inode, handle, name,
                                                 buffer, buffer_size);
+         
+        SMFS_POST_HOOK(inode, HOOK_F_SETXATTR, &msg, rc);
         post_smfs_inode(inode, cache_inode);
 
         RETURN(rc);
index bcb416d..33851b5 100644 (file)
@@ -594,6 +594,47 @@ exit:
                 OBD_FREE(buffer, PAGE_SIZE);        
         RETURN(rc);
 }
+
+static int kml_setxattr(struct inode *inode, void *arg, struct kml_priv *priv) 
+{
+        struct hook_setxattr_msg *msg = arg;
+        struct kml_buffer kbuf;
+        int rc = 0, length = 0;
+        char *buffer = NULL;
+        ENTRY;
+
+        OBD_ALLOC(buffer, PAGE_SIZE);
+        if (!buffer)
+                GOTO(exit, rc = -ENOMEM);        
+
+        kbuf.buf = msg->buffer;
+        kbuf.buf_size = msg->buffer_size;
+
+        rc = priv->pack_fn(REINT_SETXATTR, buffer, NULL, msg->inode, msg->name, 
+                           &kbuf);
+        if (rc <= 0) 
+                GOTO(exit, rc);
+        
+        length += rc;
+        rc = smfs_llog_add_rec(S2SMI(inode->i_sb), (void*)buffer, length); 
+        /*
+        if (!rc) {
+                if (attr && attr->ia_valid & ATTR_SIZE) {
+                        smfs_remove_extents_ea(inode, attr->ia_size,
+                                               0xffffffff);                                
+                        if (attr->ia_size == 0)
+                                smfs_set_dirty_flags(inode, SMFS_OVER_WRITE);
+                        else
+                                smfs_set_dirty_flags(inode, SMFS_DIRTY_WRITE);
+                }
+        }
+        */
+exit:
+        if (buffer)
+                OBD_FREE(buffer, PAGE_SIZE);        
+        RETURN(rc);
+}
+
 /*
 static int kml_write(struct inode * inode, void *arg, struct kml_priv * priv) 
 {
@@ -676,6 +717,7 @@ static post_kml_op smfs_kml_post[HOOK_MAX] = {
         [HOOK_SETATTR] kml_setattr,
         [HOOK_WRITE]   NULL,
         [HOOK_READDIR] NULL,
+        [HOOK_F_SETXATTR] kml_setxattr,
 };
 
 static int smfs_kml_post_op(int code, struct inode * inode,
index 54ad1ad..ff88cba 100644 (file)
@@ -75,6 +75,50 @@ static int mds_rec_link_pack(char *buffer, struct dentry *dentry,
         return rc;
 }
 
+static int mds_rec_setxattr_pack(char *buffer, struct dentry *dentry,
+                                struct inode *dir, void *data1, void *data2)
+{
+        struct mds_rec_setattr *rec = NULL;
+        struct mds_kml_pack_info *mkpi;
+        struct lustre_msg *msg = NULL;
+        char *name = (char *)data1;
+        struct kml_buffer *kbuf = (struct kml_buffer*)data2;
+        struct mdc_op_data *op_data;
+        int rc = 0;
+        void *tmp = NULL;
+        ENTRY;
+
+        OBD_ALLOC(op_data, sizeof(*op_data));
+        if (op_data == NULL)
+                return -ENOMEM;
+        mdc_prepare_mdc_data(op_data, dir, NULL, NULL, 0, 0);
+
+        PACK_KML_REC_INIT(buffer, MDS_REINT);
+        mkpi = (struct mds_kml_pack_info*)buffer;
+
+        mkpi->mpi_bufcount = 3;
+        mkpi->mpi_size[0] = sizeof(struct mds_rec_setattr);
+        mkpi->mpi_size[1] = strlen(name);
+        mkpi->mpi_size[2] = kbuf->buf_size;       
+        msg = (struct lustre_msg *)(buffer + sizeof(*mkpi));
+        lustre_init_msg(msg, mkpi->mpi_bufcount, mkpi->mpi_size, NULL);
+
+        LASSERT(kbuf && name);
+
+        tmp = mdc_setattr_pack(msg, 0, op_data, NULL, name, strlen(name), 
+                               kbuf->buf, kbuf->buf_size);
+        OBD_FREE(op_data, sizeof(*op_data));
+
+        rec = (struct mds_rec_setattr *)lustre_msg_buf(msg, 0, 0);
+        
+        rec->sa_valid = ATTR_EA_CMOBD;
+        
+        mkpi->mpi_total_size = tmp - (void *)msg;
+        rc = mkpi->mpi_total_size + sizeof(*mkpi) + sizeof(int);
+
+        RETURN(rc);
+}
 /* FIXME-WANGDI: did not think about EA situation. */
 static int mds_rec_setattr_pack(char *buffer, struct dentry *dentry,
                                 struct inode *dir, void *data1, void *data2)
@@ -271,6 +315,7 @@ static mds_pack_rec_func mds_kml_pack[REINT_MAX + 1] = {
         [REINT_CREATE]  mds_rec_create_pack,
         [REINT_UNLINK]  mds_rec_unlink_pack,
         [REINT_RENAME]  mds_rec_rename_pack,
+        [REINT_SETXATTR] mds_rec_setxattr_pack,
 };
 
 int mds_rec_pack(int op, char *buffer, struct dentry *dentry, 
index d642da8..cd97c0f 100644 (file)
@@ -99,6 +99,13 @@ struct hook_setattr_msg {
         struct iattr *attr;
 };
 
+struct hook_setxattr_msg {
+        struct inode * inode;
+        char *name;
+        char *buffer;
+       int  buffer_size;
+};
+
 void smfs_pre_hook (struct inode*, int, void*);
 void smfs_post_hook(struct inode*,int, void*, int);
 
index e507032..05d4a63 100644 (file)
@@ -235,6 +235,10 @@ static inline int get_active_entry(struct inode *dir, __u64 *active_entry)
         RETURN(rc);
 }
 
+struct kml_buffer {
+        char *buf;
+        int   buf_size;
+}; 
 #if CONFIG_SNAPFS
 int smfs_cow_init(struct super_block *sb);
 int smfs_cow_cleanup(struct smfs_super_info *smb);