From: nikita Date: Fri, 4 Aug 2006 13:58:48 +0000 (+0000) Subject: lu_object: store file type (regular, directory, etc.) in lu_object_header X-Git-Tag: v1_8_0_110~486^2~1278 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=020f6cbaa1284ea2df327f587e8c56e07e3ed40a;p=fs%2Flustre-release.git lu_object: store file type (regular, directory, etc.) in lu_object_header --- diff --git a/lustre/include/lu_object.h b/lustre/include/lu_object.h index b5831b9..05f41835 100644 --- a/lustre/include/lu_object.h +++ b/lustre/include/lu_object.h @@ -404,6 +404,14 @@ enum lu_object_header_flags { LU_OBJECT_HEARD_BANSHEE = 0, }; +enum lu_object_header_attr { + /* + * UNIX file type is stored in S_IFMT bits. + */ + LU_OBJECT_FT_START = (1 << 12), /* S_IFIFO */ + LU_OBJECT_FT_END = (1 << 15), /* S_IFREG */ +}; + /* * "Compound" object, consisting of multiple layers. * @@ -430,6 +438,11 @@ struct lu_object_header { */ struct lu_fid loh_fid; /* + * Common object attributes, cached for efficiency. From enum + * lu_object_header_attr. + */ + __u32 loh_attr; + /* * Linkage into per-site hash table. Protected by site guard lock. */ struct hlist_node loh_hash; diff --git a/lustre/mdd/mdd_handler.c b/lustre/mdd/mdd_handler.c index 99dfb0e..57c3d75 100644 --- a/lustre/mdd/mdd_handler.c +++ b/lustre/mdd/mdd_handler.c @@ -140,19 +140,21 @@ static int mdd_attr_get(const struct lu_context *ctxt, next = mdd_object_child(mdd_obj); rc = next->do_ops->do_attr_get(ctxt, next, &ma->ma_attr); if (rc == 0) { + LASSERT((ma->ma_attr.la_mode & S_IFMT) == + (obj->mo_lu.lo_header->loh_attr & S_IFMT)); ma->ma_valid |= MA_INODE; - if ((S_ISREG(ma->ma_attr.la_mode) + if ((S_ISREG(ma->ma_attr.la_mode) || S_ISDIR(ma->ma_attr.la_mode)) && ma->ma_lmm != 0 && ma->ma_lmm_size > 0) { rc = mdd_get_md(ctxt, obj, ma->ma_lmm,&ma->ma_lmm_size); - if (rc > 0) { + if (rc > 0) { ma->ma_valid |= MA_LOV; rc = 0; } } /*TODO: get DIREA for directory */ } - CDEBUG(D_INODE, "after getattr rc = %d, ma_valid = "LPX64"\n", + CDEBUG(D_INODE, "after getattr rc = %d, ma_valid = "LPX64"\n", rc, ma->ma_valid); RETURN(rc); } @@ -679,23 +681,15 @@ static int mdd_unlink(const struct lu_context *ctxt, struct md_object *pobj, struct mdd_device *mdd = mdo2mdd(pobj); struct mdd_object *mdd_pobj = md2mdd_obj(pobj); struct mdd_object *mdd_cobj = md2mdd_obj(cobj); - struct dt_object *dt_cobj = mdd_object_child(mdd_cobj); struct thandle *handle; - struct lu_attr *la = &mdd_ctx_info(ctxt)->mti_la; int rc; ENTRY; - /* sanity checks */ - rc = dt_cobj->do_ops->do_attr_get(ctxt, dt_cobj, la); - if (rc == 0) { - if (S_ISDIR(la->la_mode)) { - if (!S_ISDIR(ma->ma_attr.la_mode)) - rc = -EISDIR; - } else if (S_ISDIR(ma->ma_attr.la_mode)) - rc = -ENOTDIR; - } - if (rc != 0) - RETURN(rc); + if (S_ISDIR(cobj->mo_lu.lo_header->loh_attr)) { + if (!S_ISDIR(ma->ma_attr.la_mode)) + RETURN(-EISDIR); + } else if (S_ISDIR(ma->ma_attr.la_mode)) + RETURN(-ENOTDIR); mdd_txn_param_build(ctxt, &MDD_TXN_UNLINK); handle = mdd_trans_start(ctxt, mdd); @@ -705,7 +699,7 @@ static int mdd_unlink(const struct lu_context *ctxt, struct md_object *pobj, mdd_lock2(ctxt, mdd_pobj, mdd_cobj); /* rmdir checks */ - if (S_ISDIR(la->la_mode)) { + if (S_ISDIR(cobj->mo_lu.lo_header->loh_attr)) { rc = mdd_dir_is_empty(ctxt, mdd_cobj); if (rc != 0) GOTO(cleanup, rc); @@ -922,7 +916,7 @@ static int __mdd_object_initialize(const struct lu_context *ctxt, return rc; } -static int mdd_create_data_object(const struct lu_context *ctxt, +static int mdd_create_data_object(const struct lu_context *ctxt, struct md_object *pobj, struct md_object *cobj, const void *eadata, int eadatasize, struct md_attr *ma) @@ -935,7 +929,7 @@ static int mdd_create_data_object(const struct lu_context *ctxt, int lmm_size = 0; int rc; ENTRY; - + rc = mdd_lov_create(ctxt, mdd, mdo, son, &lmm, &lmm_size, eadata, eadatasize, attr); if (rc) @@ -950,14 +944,14 @@ static int mdd_create_data_object(const struct lu_context *ctxt, RETURN(rc); } -static int mdd_create_sanity_check(const struct lu_context *ctxt, +static int mdd_create_sanity_check(const struct lu_context *ctxt, struct mdd_device *mdd, - struct md_object *pobj, + struct md_object *pobj, const char *name, struct md_attr *ma) { struct lu_fid *fid; int rc; - + fid = &mdd_ctx_info(ctxt)->mti_fid; rc = mdd_lookup(ctxt, pobj, name, fid); if (rc != -ENOENT) { @@ -976,10 +970,10 @@ static int mdd_create_sanity_check(const struct lu_context *ctxt, rc = 0; break; default: - rc = -EINVAL; + rc = -EINVAL; break; } - RETURN(rc); + RETURN(rc); } /* @@ -987,7 +981,7 @@ static int mdd_create_sanity_check(const struct lu_context *ctxt, */ static int mdd_create(const struct lu_context *ctxt, struct md_object *pobj, const char *name, struct md_object *child, - const char *target_name, const void *eadata, + const char *target_name, const void *eadata, int eadatasize, struct md_attr* ma) { struct mdd_device *mdd = mdo2mdd(pobj); @@ -1008,12 +1002,12 @@ static int mdd_create(const struct lu_context *ctxt, struct md_object *pobj, * first */ if (S_ISREG(attr->la_mode)) { - rc = mdd_lov_create(ctxt, mdd, mdo, son, &lmm, &lmm_size, + rc = mdd_lov_create(ctxt, mdd, mdo, son, &lmm, &lmm_size, eadata, eadatasize, attr); if (rc) RETURN(rc); } - + mdd_txn_param_build(ctxt, &MDD_TXN_MKDIR); handle = mdd_trans_start(ctxt, mdd); if (IS_ERR(handle)) @@ -1066,7 +1060,7 @@ static int mdd_create(const struct lu_context *ctxt, struct md_object *pobj, rc = __mdd_object_create(ctxt, son, ma, handle); if (rc) GOTO(cleanup, rc); - + created = 1; rc = __mdd_object_initialize(ctxt, mdo, son, ma, handle); @@ -1221,7 +1215,7 @@ static int mdd_root_get(const struct lu_context *ctx, } static int mdd_statfs(const struct lu_context *ctx, - struct md_device *m, struct kstatfs *sfs) + struct md_device *m, struct kstatfs *sfs) { struct mdd_device *mdd = lu2mdd_dev(&m->md_lu_dev); int rc; @@ -1235,7 +1229,7 @@ static int mdd_statfs(const struct lu_context *ctx, static int mdd_get_maxsize(const struct lu_context *ctx, struct md_device *m, int *md_size, - int *cookie_size) + int *cookie_size) { struct mdd_device *mdd = lu2mdd_dev(&m->md_lu_dev); int rc; @@ -1246,7 +1240,7 @@ static int mdd_get_maxsize(const struct lu_context *ctx, if (rc) RETURN(rc); rc = mdd_lov_cookiesize(ctx, mdd, cookie_size); - + RETURN(rc); } @@ -1337,7 +1331,7 @@ static int mdd_readpage(const struct lu_context *ctxt, struct md_object *obj, mdd_lock(ctxt, mdd, DT_READ_LOCK); if (dt_try_as_dir(ctxt, next)) - rc = next->do_ops->do_readpage(ctxt, next, rdpg); + rc = next->do_ops->do_readpage(ctxt, next, rdpg); else rc = -ENOTDIR; mdd_unlock(ctxt, mdd, DT_READ_LOCK); diff --git a/lustre/mdd/mdd_internal.h b/lustre/mdd/mdd_internal.h index 0c076f3..c507f2b 100644 --- a/lustre/mdd/mdd_internal.h +++ b/lustre/mdd/mdd_internal.h @@ -48,12 +48,11 @@ struct mdd_object { struct mdd_thread_info { struct txn_param mti_param; struct lu_fid mti_fid; - struct lu_attr mti_la; struct lov_desc mti_ld; struct lov_mds_md mti_lmm; }; -int mdd_init_obd(const struct lu_context *ctxt, struct mdd_device *mdd, +int mdd_init_obd(const struct lu_context *ctxt, struct mdd_device *mdd, char *dev); int mdd_xattr_set(const struct lu_context *ctxt, struct md_object *obj, const void *buf, int buf_len, const char *name, int fl); @@ -61,12 +60,12 @@ int mdd_lov_set_md(const struct lu_context *ctxt, struct md_object *pobj, struct md_object *child, struct lov_mds_md *lmm, int lmm_size, int mode); int mdd_lov_create(const struct lu_context *ctxt, struct mdd_device *mdd, - struct mdd_object *parent, struct mdd_object *child, + 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); 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_unlink_log(const struct lu_context *ctxt, struct mdd_device *mdd, struct mdd_object *mdd_cobj, struct md_attr *ma); struct mdd_thread_info *mdd_ctx_info(const struct lu_context *ctx); @@ -120,7 +119,7 @@ static inline struct dt_object* mdd_object_child(struct mdd_object *o) } static inline struct obd_device *mdd2_obd(struct mdd_device *mdd) { - return mdd->mdd_md_dev.md_lu_dev.ld_obd; + return mdd->mdd_md_dev.md_lu_dev.ld_obd; } int mdd_lov_mdsize(const struct lu_context *ctxt, struct mdd_device *mdd, diff --git a/lustre/osd/osd_handler.c b/lustre/osd/osd_handler.c index 9add481..7087751 100644 --- a/lustre/osd/osd_handler.c +++ b/lustre/osd/osd_handler.c @@ -300,6 +300,7 @@ static void osd_object_init0(struct osd_object *obj) { LASSERT(obj->oo_inode != NULL); obj->oo_dt.do_body_ops = &osd_body_ops; + obj->oo_dt.do_lu.lo_header->loh_attr |= obj->oo_inode->i_mode & S_IFMT; } static int osd_object_init(const struct lu_context *ctxt, struct lu_object *l)