From ab701eb116d93425a2f94c27c8544a44518cde30 Mon Sep 17 00:00:00 2001 From: wangdi Date: Wed, 20 Jul 2005 12:34:28 +0000 Subject: [PATCH] Branch: HEAD add setxattr kml post hook for reint set md to master mds. --- lustre/include/linux/lustre_idl.h | 11 +++++----- lustre/mds/handler.c | 24 ++++++++++++++++++++- lustre/mds/mds_fs.c | 25 ---------------------- lustre/mds/mds_reint.c | 36 ++++++++++++++++++++++++++++++- lustre/smfs/fsfilt.c | 14 +++++++++--- lustre/smfs/kml.c | 42 ++++++++++++++++++++++++++++++++++++ lustre/smfs/mds_kml.c | 45 +++++++++++++++++++++++++++++++++++++++ lustre/smfs/smfs_api.h | 7 ++++++ lustre/smfs/smfs_internal.h | 4 ++++ 9 files changed, 173 insertions(+), 35 deletions(-) diff --git a/lustre/include/linux/lustre_idl.h b/lustre/include/linux/lustre_idl.h index a20a8a0..b0d4190 100644 --- a/lustre/include/linux/lustre_idl.h +++ b/lustre/include/linux/lustre_idl.h @@ -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 diff --git a/lustre/mds/handler.c b/lustre/mds/handler.c index 969ad6d..ef135b5 100644 --- a/lustre/mds/handler.c +++ b/lustre/mds/handler.c @@ -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); diff --git a/lustre/mds/mds_fs.c b/lustre/mds/mds_fs.c index 811e838..f554b4c 100644 --- a/lustre/mds/mds_fs.c +++ b/lustre/mds/mds_fs.c @@ -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; diff --git a/lustre/mds/mds_reint.c b/lustre/mds/mds_reint.c index 84a5349..81a3573 100644 --- a/lustre/mds/mds_reint.c +++ b/lustre/mds/mds_reint.c @@ -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; } diff --git a/lustre/smfs/fsfilt.c b/lustre/smfs/fsfilt.c index ceb6a63..deaef94 100644 --- a/lustre/smfs/fsfilt.c +++ b/lustre/smfs/fsfilt.c @@ -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); diff --git a/lustre/smfs/kml.c b/lustre/smfs/kml.c index bcb416d..33851b5 100644 --- a/lustre/smfs/kml.c +++ b/lustre/smfs/kml.c @@ -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, diff --git a/lustre/smfs/mds_kml.c b/lustre/smfs/mds_kml.c index 54ad1ad..ff88cba 100644 --- a/lustre/smfs/mds_kml.c +++ b/lustre/smfs/mds_kml.c @@ -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, diff --git a/lustre/smfs/smfs_api.h b/lustre/smfs/smfs_api.h index d642da8..cd97c0f 100644 --- a/lustre/smfs/smfs_api.h +++ b/lustre/smfs/smfs_api.h @@ -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); diff --git a/lustre/smfs/smfs_internal.h b/lustre/smfs/smfs_internal.h index e507032..05d4a63 100644 --- a/lustre/smfs/smfs_internal.h +++ b/lustre/smfs/smfs_internal.h @@ -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); -- 1.8.3.1