static int cml_create_data(const struct lu_context *ctx,
struct md_object *p, struct md_object *o,
- const void *eadata, int eadatalen,
+ const struct md_create_spec *spec,
struct md_attr *ma)
{
int rc;
ENTRY;
rc = mdo_create_data(ctx, md_object_next(p), md_object_next(o),
- eadata, eadatalen, ma);
+ spec, ma);
RETURN(rc);
}
int eadatalen;
} sp_ea;
} u;
+ /* create flag from client: such as MDS_OPEN_CREAT, and others */
+ __u32 sp_cr_flags;
};
/*
struct md_attr *);
/* This method is used for creating data object for this meta object*/
int (*mdo_create_data)(const struct lu_context *cx, struct md_object *p,
- struct md_object *o, const void *eadata,
- int eadatalen, struct md_attr *ma);
+ struct md_object *o,
+ const struct md_create_spec *spec,
+ struct md_attr *ma);
int (*mdo_rename)(const struct lu_context *ctxt,
struct md_object *spobj, struct md_object *tpobj,
const struct lu_fid *lf, const char *sname,
}
static inline int mdo_create_data(const struct lu_context *cx,
struct md_object *p, struct md_object *c,
- const void *eadata, int eadatalen,
+ const struct md_create_spec *spec,
struct md_attr *ma)
{
LASSERT(c->mo_dir_ops->mdo_create_data);
- return c->mo_dir_ops->mdo_create_data(cx, p, c, eadata, eadatalen, ma);
+ return c->mo_dir_ops->mdo_create_data(cx, p, c, spec, ma);
}
static inline int mdo_rename(const struct lu_context *cx,
static int mdd_create_data(const struct lu_context *ctxt,
struct md_object *pobj, struct md_object *cobj,
- const void *eadata, int eadatasize,
+ const struct md_create_spec *spec,
struct md_attr *ma)
{
struct mdd_device *mdd = mdo2mdd(pobj);
struct mdd_object *son = md2mdd_obj(cobj);
struct lu_attr *attr = &ma->ma_attr;
struct lov_mds_md *lmm = NULL;
+ int lmm_size = 0;
struct thandle *handle;
- int lmm_size = 0;
- int rc;
+ int rc;
ENTRY;
mdd_txn_param_build(ctxt, &MDD_TXN_CREATE_DATA);
/*
* XXX: should take transaction handle.
*/
- rc = mdd_lov_create(ctxt, mdd, mdo, son, &lmm, &lmm_size, eadata,
- eadatasize, attr);
+ rc = mdd_lov_create(ctxt, mdd, mdo, son, &lmm, &lmm_size, spec, attr);
if (rc == 0) {
rc = mdd_lov_set_md(ctxt, pobj, cobj, lmm,
lmm_size, attr->la_mode, handle);
/* no RPC inside the transaction, so OST objects should be created at
* first */
if (S_ISREG(attr->la_mode)) {
- const void *eadata = spec->u.sp_ea.eadata;
- int eadatasize = spec->u.sp_ea.eadatalen;
-
rc = mdd_lov_create(ctxt, mdd, mdo, son, &lmm, &lmm_size,
- eadata, eadatasize, attr);
+ spec, attr);
if (rc)
RETURN(rc);
}
int lmm_size, int mode, struct thandle *handle);
int mdd_lov_create(const struct lu_context *ctxt, struct mdd_device *mdd,
struct mdd_object *parent, struct mdd_object *child,
- struct lov_mds_md **lmm, int *lmm_size, const void *eadata,
- int eadatasize, struct lu_attr *la);
+ struct lov_mds_md **lmm, int *lmm_size,
+ const struct md_create_spec *spec, struct lu_attr *la);
+
int mdd_get_md(const struct lu_context *ctxt, struct md_object *obj,
void *md, int *md_size);
int mdd_unlink_log(const struct lu_context *ctxt, struct mdd_device *mdd,
int mdd_lov_create(const struct lu_context *ctxt, struct mdd_device *mdd,
struct mdd_object *parent, struct mdd_object *child,
- struct lov_mds_md **lmm, int *lmm_size, const void *eadata,
- int eadatasize, struct lu_attr *la)
+ struct lov_mds_md **lmm, int *lmm_size,
+ const struct md_create_spec *spec, struct lu_attr *la)
{
- struct obd_device *obd = mdd2_obd(mdd);
- struct obd_export *lov_exp = obd->u.mds.mds_osc_exp;
- struct obdo *oa;
- struct lov_stripe_md *lsm = NULL;
- int rc = 0;
+ struct obd_device *obd = mdd2_obd(mdd);
+ struct obd_export *lov_exp = obd->u.mds.mds_osc_exp;
+ struct obdo *oa;
+ struct lov_stripe_md *lsm = NULL;
+ const void *eadata = spec->u.sp_ea.eadata;
+/* int eadatasize = spec->u.sp_ea.eadatalen;*/
+ __u32 create_flags = spec->sp_cr_flags;
+ int rc = 0;
ENTRY;
- if (la->la_flags & MDS_OPEN_DELAY_CREATE ||
- !(la->la_flags & FMODE_WRITE))
+ if (create_flags & MDS_OPEN_DELAY_CREATE ||
+ !(create_flags & FMODE_WRITE))
RETURN(0);
oa = obdo_alloc();
OBD_MD_FLMODE | OBD_MD_FLUID | OBD_MD_FLGID;
oa->o_size = 0;
- if (!(la->la_flags & MDS_OPEN_HAS_OBJS)) {
- if (la->la_flags & MDS_OPEN_HAS_EA) {
+ if (!(create_flags & MDS_OPEN_HAS_OBJS)) {
+ if (create_flags & MDS_OPEN_HAS_EA) {
LASSERT(eadata != NULL);
rc = obd_iocontrol(OBD_IOC_LOV_SETSTRIPE, lov_exp,
0, &lsm, (void*)eadata);
{
b->valid |= OBD_MD_FLCTIME | OBD_MD_FLUID |
OBD_MD_FLGID | OBD_MD_FLTYPE |
- OBD_MD_FLMODE | OBD_MD_FLNLINK |
+ OBD_MD_FLMODE | OBD_MD_FLNLINK | OBD_MD_FLFLAGS |
OBD_MD_FLATIME | OBD_MD_FLMTIME ; /* added by huanghua */
if (!S_ISREG(attr->la_mode))
attr->la_rdev = rec->cr_rdev;
attr->la_uid = rec->cr_fsuid;
attr->la_gid = rec->cr_fsgid;
- attr->la_flags = rec->cr_flags;
attr->la_ctime = rec->cr_time;
attr->la_mtime = rec->cr_time;
attr->la_atime = rec->cr_time;
+ info->mti_spec.sp_cr_flags = rec->cr_flags;
rr->rr_name = req_capsule_client_get(pill, &RMF_NAME);
if (rr->rr_name) {
rr->rr_fid1 = &rec->cr_fid1;
rr->rr_fid2 = &rec->cr_fid2;
attr->la_mode = rec->cr_mode;
- attr->la_flags = rec->cr_flags;
attr->la_rdev = rec->cr_rdev;
attr->la_uid = rec->cr_fsuid;
attr->la_gid = rec->cr_fsgid;
attr->la_ctime = rec->cr_time;
attr->la_mtime = rec->cr_time;
attr->la_atime = rec->cr_time;
+ info->mti_spec.sp_cr_flags = rec->cr_flags;
rr->rr_name = req_capsule_client_get(pill, &RMF_NAME);
if (rr->rr_name == NULL)
/*XXX: what about open by FID? */
struct md_create_spec *spec = &info->mti_spec;
return mdo_create_data(info->mti_ctxt, mdt_object_child(p),
- mdt_object_child(o), spec->u.sp_ea.eadata,
- spec->u.sp_ea.eadatalen, ma);
+ mdt_object_child(o), spec, ma);
}
__u32 flags)
{
struct mdt_object *o;
- struct lu_attr *la = &info->mti_attr.ma_attr;
int rc;
ENTRY;
o = mdt_object_find(info->mti_ctxt, info->mti_mdt, fid);
if (!IS_ERR(o)) {
if (mdt_object_exists(info->mti_ctxt, &o->mot_obj.mo_lu) > 0) {
- if (la->la_flags & MDS_OPEN_EXCL &&
- la->la_flags & MDS_OPEN_CREAT)
+ if (flags & MDS_OPEN_EXCL &&
+ flags & MDS_OPEN_CREAT)
rc = -EEXIST;
else
rc = mdt_mfd_open(info, NULL, o, flags, 0);
} else {
rc = -ENOENT;
- if (la->la_flags & MDS_OPEN_CREAT) {
+ if (flags & MDS_OPEN_CREAT) {
rc = mo_object_create(info->mti_ctxt,
mdt_object_child(o),
&info->mti_spec,
struct lu_fid *child_fid = &info->mti_tmp_fid1;
struct md_attr *ma = &info->mti_attr;
struct lu_attr *la = &ma->ma_attr;
+ __u32 create_flags = info->mti_spec.sp_cr_flags;
+ struct mdt_reint_record *rr = &info->mti_rr;
int result;
int created = 0;
- struct mdt_reint_record *rr = &info->mti_rr;
ENTRY;
req_capsule_set_size(&info->mti_pill, &RMF_MDT_MD, RCL_SERVER,
if (rr->rr_name[0] == 0) {
/* reint partial remote open */
- RETURN(mdt_open_by_fid(info, rr->rr_fid1, la->la_flags));
+ result = mdt_open_by_fid(info, rr->rr_fid1, create_flags);
+ RETURN(result);
}
/* we now have no resent message, so it must be an intent */
LASSERT(info->mti_pill.rc_fmt == &RQF_LDLM_INTENT_OPEN);
CDEBUG(D_INODE, "I am going to create "DFID3"/("DFID3":%s) "
- "flag=%x mode=%06o\n",
+ "cr_flag=%x mode=%06o\n",
PFID3(rr->rr_fid1), PFID3(rr->rr_fid2),
- rr->rr_name, la->la_flags, la->la_mode);
+ rr->rr_name, create_flags, la->la_mode);
ldlm_rep = req_capsule_server_get(&info->mti_pill, &RMF_DLM_REP);
intent_set_disposition(ldlm_rep, DISP_LOOKUP_EXECD);
lh = &info->mti_lh[MDT_LH_PARENT];
- if (!(la->la_flags & MDS_OPEN_CREAT))
+ if (!(create_flags & MDS_OPEN_CREAT))
lh->mlh_mode = LCK_CR;
else
lh->mlh_mode = LCK_EX;
if (result == -ENOENT) {
intent_set_disposition(ldlm_rep, DISP_LOOKUP_NEG);
- if (!(la->la_flags & MDS_OPEN_CREAT))
+ if (!(create_flags & MDS_OPEN_CREAT))
GOTO(out_parent, result);
*child_fid = *info->mti_rr.rr_fid2;
/* new object will be created. see the following */
}
/* Try to open it now. */
- result = mdt_mfd_open(info, parent, child, la->la_flags, created);
+ result = mdt_mfd_open(info, parent, child, create_flags, created);
GOTO(finish_open, result);
finish_open:
static int osd_inode_setattr(const struct lu_context *ctx,
struct inode *inode, const struct lu_attr *attr)
{
- struct iattr iattr;
- int rc;
+ struct osd_thread_info *info = lu_context_key_get(ctx, &osd_key);
+ struct dentry *dentry = &info->oti_dentry;
+ struct iattr *iattr = &info->oti_iattr;
+ int rc;
+
+ dentry->d_inode = inode;
+ if (attr->la_valid & ATTR_ATTR_FLAG) {
+ /* this is ioctl */
+ rc = -ENOTTY;
+ if (inode->i_fop->ioctl)
+ rc = inode->i_fop->ioctl(inode, NULL, EXT3_IOC_SETFLAGS,
+ (long)&attr->la_flags);
+ return rc;
+ }
+
+ iattr->ia_valid = attr->la_valid;
+ iattr->ia_mode = attr->la_mode;
+ iattr->ia_uid = attr->la_uid;
+ iattr->ia_gid = attr->la_gid;
+ iattr->ia_size = attr->la_size;
+ iattr->ia_attr_flags = attr->la_flags;
+ LTIME_S(iattr->ia_atime) = attr->la_atime;
+ LTIME_S(iattr->ia_mtime) = attr->la_mtime;
+ LTIME_S(iattr->ia_ctime) = attr->la_ctime;
- iattr.ia_valid = attr->la_valid;
- iattr.ia_mode = attr->la_mode;
- iattr.ia_uid = attr->la_uid;
- iattr.ia_gid = attr->la_gid;
- iattr.ia_size = attr->la_size;
- LTIME_S(iattr.ia_atime) = attr->la_atime;
- LTIME_S(iattr.ia_mtime) = attr->la_mtime;
- LTIME_S(iattr.ia_ctime) = attr->la_ctime;
/* TODO: handle ATTR_SIZE & truncate in the future */
- //iattr.ia_valid &= ~ATTR_SIZE;
+ //iattr->ia_valid &= ~ATTR_SIZE;
/* Don't allow setattr to change file type */
- if (iattr.ia_valid & ATTR_MODE)
- iattr.ia_mode = (inode->i_mode & S_IFMT) |
- (iattr.ia_mode & ~S_IFMT);
-
-// if (inode->i_op->setattr) {
-// rc = inode->i_op->setattr(dentry, iattr);
-// } else
- {
- rc = inode_change_ok(inode, &iattr);
+ if (iattr->ia_valid & ATTR_MODE)
+ iattr->ia_mode = (inode->i_mode & S_IFMT) |
+ (iattr->ia_mode & ~S_IFMT);
+
+ if (inode->i_op->setattr) {
+ rc = inode->i_op->setattr(dentry, iattr);
+ } else {
+ rc = inode_change_ok(inode, iattr);
if (!rc)
- rc = inode_setattr(inode, &iattr);
+ rc = inode_setattr(inode, iattr);
}
return rc;
}
attr->la_blocks = inode->i_blocks;
attr->la_uid = inode->i_uid;
attr->la_gid = inode->i_gid;
-// attr->la_flags = inode->i_flags;
+ attr->la_flags = inode->i_flags;
attr->la_nlink = inode->i_nlink;
attr->la_rdev = inode->i_rdev;
return 0;
struct lu_fid oti_fid;
struct osd_inode_id oti_id;
+ struct iattr oti_iattr;
/*
* XXX temporary: Buffer for fid->name conversion.
*/