From 98aa1465b9295b9585677fe9becc59ffa586e613 Mon Sep 17 00:00:00 2001 From: huanghua Date: Wed, 9 Aug 2006 09:54:04 +0000 Subject: [PATCH] (1) pass create flag from client to CMM/MDD in struct md_create_spec; (2) return object flag to client; (3) do ioctl for ATTR_ATTR_FLAGS instead of setattr(): sanity 52 --- lustre/cmm/cmm_object.c | 4 ++-- lustre/include/md_object.h | 11 +++++---- lustre/mdd/mdd_handler.c | 14 ++++-------- lustre/mdd/mdd_internal.h | 5 ++-- lustre/mdd/mdd_lov.c | 25 +++++++++++--------- lustre/mdt/mdt_handler.c | 2 +- lustre/mdt/mdt_lib.c | 4 ++-- lustre/mdt/mdt_open.c | 26 ++++++++++----------- lustre/osd/osd_handler.c | 57 ++++++++++++++++++++++++++++------------------ lustre/osd/osd_internal.h | 1 + 10 files changed, 83 insertions(+), 66 deletions(-) diff --git a/lustre/cmm/cmm_object.c b/lustre/cmm/cmm_object.c index c9b4806..14af9d1 100644 --- a/lustre/cmm/cmm_object.c +++ b/lustre/cmm/cmm_object.c @@ -367,13 +367,13 @@ static int cml_create(const struct lu_context *ctx, struct md_object *mo_p, 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); } diff --git a/lustre/include/md_object.h b/lustre/include/md_object.h index 53e2a0b..b14881b 100644 --- a/lustre/include/md_object.h +++ b/lustre/include/md_object.h @@ -74,6 +74,8 @@ struct md_create_spec { int eadatalen; } sp_ea; } u; + /* create flag from client: such as MDS_OPEN_CREAT, and others */ + __u32 sp_cr_flags; }; /* @@ -131,8 +133,9 @@ struct md_dir_operations { 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, @@ -344,11 +347,11 @@ static inline int mdo_create(const struct lu_context *cx, struct md_object *p, } 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, diff --git a/lustre/mdd/mdd_handler.c b/lustre/mdd/mdd_handler.c index cfb6685..592d7b3 100644 --- a/lustre/mdd/mdd_handler.c +++ b/lustre/mdd/mdd_handler.c @@ -1078,7 +1078,7 @@ static int __mdd_object_initialize(const struct lu_context *ctxt, 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); @@ -1086,9 +1086,9 @@ static int mdd_create_data(const struct lu_context *ctxt, 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); @@ -1099,8 +1099,7 @@ static int mdd_create_data(const struct lu_context *ctxt, /* * 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); @@ -1183,11 +1182,8 @@ static int mdd_create(const struct lu_context *ctxt, struct md_object *pobj, /* 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); } diff --git a/lustre/mdd/mdd_internal.h b/lustre/mdd/mdd_internal.h index 7ce55c7..b87fa3b 100644 --- a/lustre/mdd/mdd_internal.h +++ b/lustre/mdd/mdd_internal.h @@ -63,8 +63,9 @@ int mdd_lov_set_md(const struct lu_context *ctxt, struct md_object *pobj, 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, diff --git a/lustre/mdd/mdd_lov.c b/lustre/mdd/mdd_lov.c index 058f82a..fbe9bfe 100644 --- a/lustre/mdd/mdd_lov.c +++ b/lustre/mdd/mdd_lov.c @@ -385,18 +385,21 @@ static void obdo_from_la(struct obdo *dst, struct lu_attr *la, obd_flag valid) 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(); @@ -409,8 +412,8 @@ int mdd_lov_create(const struct lu_context *ctxt, struct mdd_device *mdd, 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); diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 7c636b5..6637926 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -173,7 +173,7 @@ void mdt_pack_attr2body(struct mdt_body *b, const struct lu_attr *attr, { 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)) diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c index c2c3f55..4099515 100644 --- a/lustre/mdt/mdt_lib.c +++ b/lustre/mdt/mdt_lib.c @@ -188,10 +188,10 @@ static int mdt_create_unpack(struct mdt_thread_info *info) 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) { @@ -304,13 +304,13 @@ static int mdt_open_unpack(struct mdt_thread_info *info) 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? */ diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index febc65a..cd0f8d9 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -82,8 +82,7 @@ static int mdt_create_data_obj(struct mdt_thread_info *info, 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); } @@ -312,21 +311,20 @@ int mdt_open_by_fid(struct mdt_thread_info* info, const struct lu_fid *fid, __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, @@ -366,9 +364,10 @@ int mdt_reint_open(struct mdt_thread_info *info) 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, @@ -383,7 +382,8 @@ int mdt_reint_open(struct mdt_thread_info *info) 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 */ @@ -391,15 +391,15 @@ int mdt_reint_open(struct mdt_thread_info *info) 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; @@ -415,7 +415,7 @@ int mdt_reint_open(struct mdt_thread_info *info) 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 */ @@ -446,7 +446,7 @@ int mdt_reint_open(struct mdt_thread_info *info) } /* 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: diff --git a/lustre/osd/osd_handler.c b/lustre/osd/osd_handler.c index f2f7e74d..337e4b3 100644 --- a/lustre/osd/osd_handler.c +++ b/lustre/osd/osd_handler.c @@ -621,33 +621,46 @@ static int osd_attr_set(const struct lu_context *ctxt, 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; } @@ -1934,7 +1947,7 @@ static int osd_inode_getattr(const struct lu_context *ctx, 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; diff --git a/lustre/osd/osd_internal.h b/lustre/osd/osd_internal.h index 2690d44..ce0f5d9 100644 --- a/lustre/osd/osd_internal.h +++ b/lustre/osd/osd_internal.h @@ -58,6 +58,7 @@ struct osd_thread_info { struct lu_fid oti_fid; struct osd_inode_id oti_id; + struct iattr oti_iattr; /* * XXX temporary: Buffer for fid->name conversion. */ -- 1.8.3.1