add setxattr kml post hook for reint set md to master mds.
#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)
#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
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;
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);
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.
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;
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.
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;
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",
fsfilt_set_md(obd, dchild->d_inode, handle, rec->ur_eadata,
rec->ur_eadatalen, EA_LOV);
}
+#endif
EXIT;
break;
}
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)
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);
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)
{
[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,
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)
[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,
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);
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);