+struct temp_comp {
+ struct mgs_target_info *comp_tmti;
+ struct mgs_target_info *comp_mti;
+ struct fs_db *comp_fsdb;
+ struct obd_device *comp_obd;
+};
+
+struct mgs_thread_info {
+ struct lustre_cfg_bufs mgi_bufs;
+ char mgi_fsname[MTI_NAME_MAXLEN];
+ struct cfg_marker mgi_marker;
+ struct temp_comp mgi_comp;
+};
+
+extern struct lu_context_key mgs_thread_key;
+
+static inline struct mgs_thread_info *mgs_env_info(const struct lu_env *env)
+{
+ struct mgs_thread_info *info;
+ int rc;
+
+ info = lu_context_key_get(&env->le_ctx, &mgs_thread_key);
+ if (info == NULL) {
+ rc = lu_env_refill((struct lu_env *)env);
+ if (rc != 0)
+ return ERR_PTR(rc);
+ info = lu_context_key_get(&env->le_ctx, &mgs_thread_key);
+ }
+ LASSERT(info != NULL);
+ return info;
+}
+
+extern const struct lu_device_operations mgs_lu_ops;
+
+static inline int lu_device_is_mgs(struct lu_device *d)
+{
+ return ergo(d != NULL && d->ld_ops != NULL, d->ld_ops == &mgs_lu_ops);
+}
+
+static inline struct mgs_device* lu2mgs_dev(struct lu_device *d)
+{
+ LASSERT(lu_device_is_mgs(d));
+ return container_of0(d, struct mgs_device, mgs_dt_dev.dd_lu_dev);
+}
+
+static inline struct mgs_device *exp2mgs_dev(struct obd_export *exp)
+{
+ return lu2mgs_dev(exp->exp_obd->obd_lu_dev);
+}
+
+static inline struct lu_device *mgs2lu_dev(struct mgs_device *d)
+{
+ return (&d->mgs_dt_dev.dd_lu_dev);
+}
+
+static inline struct mgs_device *dt2mgs_dev(struct dt_device *d)
+{
+ LASSERT(lu_device_is_mgs(&d->dd_lu_dev));
+ return container_of0(d, struct mgs_device, mgs_dt_dev);
+}
+
+static inline struct mgs_object *lu2mgs_obj(struct lu_object *o)
+{
+ LASSERT(ergo(o != NULL, lu_device_is_mgs(o->lo_dev)));
+ return container_of0(o, struct mgs_object, mgo_obj.do_lu);
+}
+
+static inline struct lu_object *mgs2lu_obj(struct mgs_object *obj)
+{
+ return &obj->mgo_obj.do_lu;
+}
+
+static inline struct mgs_object *mgs_obj(const struct lu_object *o)
+{
+ LASSERT(lu_device_is_mgs(o->lo_dev));
+ return container_of0(o, struct mgs_object, mgo_obj.do_lu);
+}
+
+static inline struct mgs_object *dt2mgs_obj(const struct dt_object *d)
+{
+ return mgs_obj(&d->do_lu);
+}
+
+static inline struct dt_object* mgs_object_child(struct mgs_object *o)
+{
+ return container_of0(lu_object_next(mgs2lu_obj(o)),
+ struct dt_object, do_lu);
+}
+
+static inline struct dt_object *dt_object_child(struct dt_object *o)
+{
+ return container_of0(lu_object_next(&(o)->do_lu),
+ struct dt_object, do_lu);
+}
+struct mgs_direntry {
+ struct list_head mde_list;
+ char *mde_name;
+ int mde_len;
+};
+
+static inline void mgs_direntry_free(struct mgs_direntry *de)
+{
+ LASSERT(list_empty(&de->mde_list));
+ if (de) {
+ LASSERT(de->mde_len);
+ OBD_FREE(de->mde_name, de->mde_len);
+ OBD_FREE_PTR(de);
+ }
+}
+
+static inline struct mgs_direntry *mgs_direntry_alloc(int len)
+{
+ struct mgs_direntry *de;
+
+ OBD_ALLOC_PTR(de);
+ if (de == NULL)
+ return NULL;
+
+ OBD_ALLOC(de->mde_name, len);
+ if (de->mde_name == NULL) {
+ OBD_FREE_PTR(de);
+ return NULL;
+ }
+
+ de->mde_len = len;
+ INIT_LIST_HEAD(&de->mde_list);
+
+ return de;
+}
+
+/* mgs_llog.c */
+int class_dentry_readdir(const struct lu_env *env, struct mgs_device *mgs,
+ struct list_head *list);
+