X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Fmd_object.h;h=6f818b50655641169f45e6904218d7b9aeb54c75;hb=577e7fc5c4e1795edddb1e9c33ec16d1b0b46f24;hp=ceb85a852ac27a6dade46cae4e2e3486ccd9e908;hpb=14c1444535f2474268741795fabcec8541741f31;p=fs%2Flustre-release.git diff --git a/lustre/include/md_object.h b/lustre/include/md_object.h index ceb85a8..6f818b5 100644 --- a/lustre/include/md_object.h +++ b/lustre/include/md_object.h @@ -41,7 +41,7 @@ #ifndef _LUSTRE_MD_OBJECT_H #define _LUSTRE_MD_OBJECT_H -/* +/** \defgroup md md * Sub-class of lu_object with methods common for "meta-data" objects in MDT * stack. * @@ -49,19 +49,20 @@ * them, and treat them as directories. * * Examples: mdt, cmm, and mdt are implementations of md interface. + * @{ */ /* * super-class definitions. */ -#include +#include #include struct md_device; struct md_device_operations; struct md_object; - +struct obd_export; enum { UCRED_INVALID = -1, @@ -72,31 +73,35 @@ enum { struct md_ucred { __u32 mu_valid; - __u32 mu_o_uid; - __u32 mu_o_gid; - __u32 mu_o_fsuid; - __u32 mu_o_fsgid; - __u32 mu_uid; - __u32 mu_gid; - __u32 mu_fsuid; - __u32 mu_fsgid; - __u32 mu_suppgids[2]; - cfs_cap_t mu_cap; - __u32 mu_umask; - struct group_info *mu_ginfo; - struct md_identity *mu_identity; + __u32 mu_o_uid; + __u32 mu_o_gid; + __u32 mu_o_fsuid; + __u32 mu_o_fsgid; + __u32 mu_uid; + __u32 mu_gid; + __u32 mu_fsuid; + __u32 mu_fsgid; + __u32 mu_suppgids[2]; + cfs_cap_t mu_cap; + __u32 mu_umask; + struct group_info *mu_ginfo; + struct md_identity *mu_identity; }; -#define MD_CAPAINFO_MAX 5 +enum { + MD_CAPAINFO_MAX = 5 +}; -/* there are at most 5 fids in one operation, see rename, NOTE the last one +/** there are at most 5 fids in one operation, see rename, NOTE the last one * is a temporary one used for is_subdir() */ struct md_capainfo { + __u32 mc_auth; + __u32 mc_padding; const struct lu_fid *mc_fid[MD_CAPAINFO_MAX]; struct lustre_capa *mc_capa[MD_CAPAINFO_MAX]; }; -/* +/** * Implemented in mdd/mdd_handler.c. * * XXX should be moved into separate .h/.c together with all md security @@ -105,7 +110,7 @@ struct md_capainfo { struct md_ucred *md_ucred(const struct lu_env *env); struct md_capainfo *md_capainfo(const struct lu_env *env); -/* metadata attributes */ +/** metadata attributes */ enum ma_valid { MA_INODE = (1 << 0), MA_LOV = (1 << 1), @@ -150,37 +155,41 @@ struct md_attr { struct lustre_capa *ma_capa; }; -/* Additional parameters for create */ +/** Additional parameters for create */ struct md_op_spec { union { - /* symlink target */ + /** symlink target */ const char *sp_symname; - /* parent FID for cross-ref mkdir */ + /** parent FID for cross-ref mkdir */ const struct lu_fid *sp_pfid; - /* eadata for regular files */ + /** eadata for regular files */ struct md_spec_reg { - /* lov objs exist already */ + /** lov objs exist already */ const struct lu_fid *fid; - int no_lov_create; const void *eadata; int eadatalen; } sp_ea; } u; - - /* Create flag from client: such as MDS_OPEN_CREAT, and others. */ + /** don't create lov objects or llog cookie - this replay */ + int no_create; + + /** Create flag from client: such as MDS_OPEN_CREAT, and others. */ __u32 sp_cr_flags; - /* Should mdd do lookup sanity check or not. */ + /** Should mdd do lookup sanity check or not. */ int sp_cr_lookup; - /* Current lock mode for parent dir where create is performing. */ + /** Current lock mode for parent dir where create is performing. */ mdl_mode_t sp_cr_mode; - /* Check for split */ + /** Check for split */ int sp_ck_split; + + /** to create directory */ + const struct dt_index_features *sp_feat; }; -/* +/** * Operations implemented for each md object (both directory and leaf). */ struct md_object_operations { @@ -213,7 +222,7 @@ struct md_object_operations { int (*moo_readlink)(const struct lu_env *env, struct md_object *obj, struct lu_buf *buf); - /* part of cross-ref operation */ + /** part of cross-ref operation */ int (*moo_object_create)(const struct lu_env *env, struct md_object *obj, const struct md_op_spec *spec, @@ -232,13 +241,20 @@ struct md_object_operations { int (*moo_close)(const struct lu_env *env, struct md_object *obj, struct md_attr *ma); - + int (*moo_capa_get)(const struct lu_env *, struct md_object *, struct lustre_capa *, int renewal); + int (*moo_object_sync)(const struct lu_env *, struct md_object *); + dt_obj_version_t (*moo_version_get)(const struct lu_env *, + struct md_object *); + void (*moo_version_set)(const struct lu_env *, struct md_object *, + dt_obj_version_t); + int (*moo_path)(const struct lu_env *env, struct md_object *obj, + char *path, int pathlen, __u64 *recno, int *linkno); }; -/* +/** * Operations implemented for each directory object. */ struct md_dir_operations { @@ -258,7 +274,7 @@ struct md_dir_operations { struct md_op_spec *spec, struct md_attr *ma); - /* This method is used for creating data object for this meta object*/ + /** This method is used for creating data object for this meta object*/ int (*mdo_create_data)(const struct lu_env *env, struct md_object *p, struct md_object *o, const struct md_op_spec *spec, @@ -277,7 +293,7 @@ struct md_dir_operations { struct md_object *cobj, const struct lu_name *lname, struct md_attr *ma); - /* partial ops for cross-ref case */ + /** partial ops for cross-ref case */ int (*mdo_name_insert)(const struct lu_env *env, struct md_object *obj, const struct lu_name *lname, @@ -295,7 +311,7 @@ struct md_dir_operations { }; struct md_device_operations { - /* meta-data device related handlers. */ + /** meta-data device related handlers. */ int (*mdo_root_get)(const struct lu_env *env, struct md_device *m, struct lu_fid *f); @@ -312,30 +328,113 @@ struct md_device_operations { int (*mdo_update_capa_key)(const struct lu_env *env, struct md_device *m, struct lustre_capa_key *key); + + int (*mdo_llog_ctxt_get)(const struct lu_env *env, + struct md_device *m, int idx, void **h); + + int (*mdo_iocontrol)(const struct lu_env *env, struct md_device *m, + unsigned int cmd, int len, void *data); + +#ifdef HAVE_QUOTA_SUPPORT + struct md_quota_operations { + int (*mqo_notify)(const struct lu_env *env, + struct md_device *m); + + int (*mqo_setup)(const struct lu_env *env, + struct md_device *m, + void *data); + + int (*mqo_cleanup)(const struct lu_env *env, + struct md_device *m); + + int (*mqo_recovery)(const struct lu_env *env, + struct md_device *m); + + int (*mqo_check)(const struct lu_env *env, + struct md_device *m, + struct obd_export *exp, + __u32 type); + + int (*mqo_on)(const struct lu_env *env, + struct md_device *m, + __u32 type); + + int (*mqo_off)(const struct lu_env *env, + struct md_device *m, + __u32 type); + + int (*mqo_setinfo)(const struct lu_env *env, + struct md_device *m, + __u32 type, + __u32 id, + struct obd_dqinfo *dqinfo); + + int (*mqo_getinfo)(const struct lu_env *env, + const struct md_device *m, + __u32 type, + __u32 id, + struct obd_dqinfo *dqinfo); + + int (*mqo_setquota)(const struct lu_env *env, + struct md_device *m, + __u32 type, + __u32 id, + struct obd_dqblk *dqblk); + + int (*mqo_getquota)(const struct lu_env *env, + const struct md_device *m, + __u32 type, + __u32 id, + struct obd_dqblk *dqblk); + + int (*mqo_getoinfo)(const struct lu_env *env, + const struct md_device *m, + __u32 type, + __u32 id, + struct obd_dqinfo *dqinfo); + + int (*mqo_getoquota)(const struct lu_env *env, + const struct md_device *m, + __u32 type, + __u32 id, + struct obd_dqblk *dqblk); + + int (*mqo_invalidate)(const struct lu_env *env, + struct md_device *m, + __u32 type); + + int (*mqo_finvalidate)(const struct lu_env *env, + struct md_device *m, + __u32 type); + } mdo_quota; +#endif }; enum md_upcall_event { - /*sync the md layer*/ + /** Sync the md layer*/ MD_LOV_SYNC = (1 << 0), - MD_NO_TRANS = (1 << 1), /* Just for split, no need trans, for replay */ - MD_LOV_CONFIG = (1 << 2) + /** Just for split, no need trans, for replay */ + MD_NO_TRANS = (1 << 1), + MD_LOV_CONFIG = (1 << 2), + /** Trigger quota recovery */ + MD_LOV_QUOTA = (1 << 3) }; struct md_upcall { - /* this lock protects upcall using against its removal + /** this lock protects upcall using against its removal * read lock is for usage the upcall, write - for init/fini */ struct rw_semaphore mu_upcall_sem; - /* device to call, upper layer normally */ + /** device to call, upper layer normally */ struct md_device *mu_upcall_dev; - /* upcall function */ + /** upcall function */ int (*mu_upcall)(const struct lu_env *env, struct md_device *md, - enum md_upcall_event ev); + enum md_upcall_event ev, void *data); }; struct md_device { - struct lu_device md_lu_dev; - struct md_device_operations *md_ops; - struct md_upcall md_upcall; + struct lu_device md_lu_dev; + const struct md_device_operations *md_ops; + struct md_upcall md_upcall; }; static inline void md_upcall_init(struct md_device *m, void *upcl) @@ -361,23 +460,56 @@ static inline void md_upcall_fini(struct md_device *m) } static inline int md_do_upcall(const struct lu_env *env, struct md_device *m, - enum md_upcall_event ev) + enum md_upcall_event ev, void *data) { int rc = 0; down_read(&m->md_upcall.mu_upcall_sem); if (m->md_upcall.mu_upcall_dev != NULL && m->md_upcall.mu_upcall_dev->md_upcall.mu_upcall != NULL) { rc = m->md_upcall.mu_upcall_dev->md_upcall.mu_upcall(env, - m->md_upcall.mu_upcall_dev, ev); + m->md_upcall.mu_upcall_dev, + ev, data); } up_read(&m->md_upcall.mu_upcall_sem); return rc; } struct md_object { - struct lu_object mo_lu; - struct md_object_operations *mo_ops; - struct md_dir_operations *mo_dir_ops; + struct lu_object mo_lu; + const struct md_object_operations *mo_ops; + const struct md_dir_operations *mo_dir_ops; +}; + +/** + * md-server site. + */ +struct md_site { + struct lu_site ms_lu; + /** + * mds number of this site. + */ + mdsno_t ms_node_id; + /** + * Fid location database + */ + struct lu_server_fld *ms_server_fld; + struct lu_client_fld *ms_client_fld; + + /** + * Server Seq Manager + */ + struct lu_server_seq *ms_server_seq; + + /** + * Controller Seq Manager + */ + struct lu_server_seq *ms_control_seq; + struct obd_export *ms_control_exp; + + /** + * Client Seq Manager + */ + struct lu_client_seq *ms_client_seq; }; static inline int lu_device_is_md(const struct lu_device *d) @@ -387,7 +519,7 @@ static inline int lu_device_is_md(const struct lu_device *d) static inline struct md_device *lu2md_dev(const struct lu_device *d) { - LASSERT(lu_device_is_md(d)); + LASSERT(IS_ERR(d) || lu_device_is_md(d)); return container_of0(d, struct md_device, md_lu_dev); } @@ -398,7 +530,7 @@ static inline struct lu_device *md2lu_dev(struct md_device *d) static inline struct md_object *lu2md(const struct lu_object *o) { - LASSERT(lu_device_is_md(o->lo_dev)); + LASSERT(o == NULL || IS_ERR(o) || lu_device_is_md(o->lo_dev)); return container_of0(o, struct md_object, mo_lu); } @@ -409,21 +541,34 @@ static inline struct md_object *md_object_next(const struct md_object *obj) static inline struct md_device *md_obj2dev(const struct md_object *o) { - LASSERT(lu_device_is_md(o->mo_lu.lo_dev)); + LASSERT(o == NULL || IS_ERR(o) || lu_device_is_md(o->mo_lu.lo_dev)); return container_of0(o->mo_lu.lo_dev, struct md_device, md_lu_dev); } +static inline struct md_site *lu_site2md(const struct lu_site *s) +{ + return container_of0(s, struct md_site, ms_lu); +} + static inline int md_device_init(struct md_device *md, struct lu_device_type *t) { - return lu_device_init(&md->md_lu_dev, t); + return lu_device_init(&md->md_lu_dev, t); } static inline void md_device_fini(struct md_device *md) { - lu_device_fini(&md->md_lu_dev); + lu_device_fini(&md->md_lu_dev); } -/* md operations */ +static inline struct md_object *md_object_find_slice(const struct lu_env *env, + struct md_device *md, + const struct lu_fid *f) +{ + return lu2md(lu_object_find_slice(env, md2lu_dev(md), f, NULL)); +} + + +/** md operations */ static inline int mo_permission(const struct lu_env *env, struct md_object *p, struct md_object *c, @@ -551,12 +696,34 @@ static inline int mo_capa_get(const struct lu_env *env, return m->mo_ops->moo_capa_get(env, m, c, renewal); } +static inline int mo_path(const struct lu_env *env, struct md_object *m, + char *path, int pathlen, __u64 *recno, int *linkno) +{ + if (m->mo_ops->moo_path == NULL) + return -ENOSYS; + return m->mo_ops->moo_path(env, m, path, pathlen, recno, linkno); +} + static inline int mo_object_sync(const struct lu_env *env, struct md_object *m) { LASSERT(m->mo_ops->moo_object_sync); return m->mo_ops->moo_object_sync(env, m); } +static inline dt_obj_version_t mo_version_get(const struct lu_env *env, + struct md_object *m) +{ + LASSERT(m->mo_ops->moo_version_get); + return m->mo_ops->moo_version_get(env, m); +} + +static inline void mo_version_set(const struct lu_env *env, + struct md_object *m, dt_obj_version_t ver) +{ + LASSERT(m->mo_ops->moo_version_set); + return m->mo_ops->moo_version_set(env, m, ver); +} + static inline int mdo_lookup(const struct lu_env *env, struct md_object *p, const struct lu_name *lname, @@ -675,4 +842,54 @@ static inline int mdo_rename_tgt(const struct lu_env *env, } } +struct dt_device; +/** + * Structure to hold object information. This is used to create object + * \pre llod_dir exist + */ +struct lu_local_obj_desc { + const char *llod_dir; + const char *llod_name; + __u32 llod_oid; + int llod_is_index; + const struct dt_index_features * llod_feat; + struct list_head llod_linkage; +}; + +struct md_object *llo_store_resolve(const struct lu_env *env, + struct md_device *md, + struct dt_device *dt, + const char *path, + struct lu_fid *fid); + +struct md_object *llo_store_open(const struct lu_env *env, + struct md_device *md, + struct dt_device *dt, + const char *dirname, + const char *objname, + struct lu_fid *fid); + +struct md_object *llo_store_create_index(const struct lu_env *env, + struct md_device *md, + struct dt_device *dt, + const char *dirname, + const char *objname, + const struct lu_fid *fid, + const struct dt_index_features *feat); + +struct md_object *llo_store_create(const struct lu_env *env, + struct md_device *md, + struct dt_device *dt, + const char *dirname, + const char *objname, + const struct lu_fid *fid); + +void llo_local_obj_register(struct lu_local_obj_desc *); +void llo_local_obj_unregister(struct lu_local_obj_desc *); + +int llo_local_objects_setup(const struct lu_env *env, + struct md_device * md, + struct dt_device * dt); + +/** @} md */ #endif /* _LINUX_MD_OBJECT_H */