+static int cobd_dt_preprw(int cmd, struct obd_export *exp,
+ struct obdo *oa, int objcount,
+ struct obd_ioobj *obj, int niocount,
+ struct niobuf_remote *nb,
+ struct niobuf_local *res,
+ struct obd_trans_info *oti,
+ struct lustre_capa *capa)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = obd_preprw(cmd, cobd_exp, oa, objcount, obj,
+ niocount, nb, res, oti, capa);
+ RETURN(rc);
+}
+
+static int cobd_dt_commitrw(int cmd, struct obd_export *exp, struct obdo *oa,
+ int objcount, struct obd_ioobj *obj,
+ int niocount, struct niobuf_local *local,
+ struct obd_trans_info *oti, int rc)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int err = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ err = obd_commitrw(cmd, cobd_exp, oa, objcount, obj,
+ niocount, local, oti, rc);
+ RETURN(err);
+}
+
+static int cobd_dt_adjust_kms(struct obd_export *exp,
+ struct lov_stripe_md *lsm,
+ obd_off size, int shrink)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = obd_adjust_kms(cobd_exp, lsm, size, shrink);
+
+ RETURN(rc);
+}
+
+static int cobd_dt_llog_init(struct obd_device *obd,
+ struct obd_llogs *llogs,
+ struct obd_device *disk_obd,
+ int count, struct llog_catid *logid)
+{
+ struct obd_export *cobd_exp;
+ struct obd_device *cobd_obd;
+ int rc = 0;
+ ENTRY;
+
+ cobd_exp = cobd_get_exp(obd);
+ cobd_obd = class_exp2obd(cobd_exp);
+
+ rc = obd_llog_init(cobd_obd, &cobd_obd->obd_llogs,
+ disk_obd, count, logid);
+ RETURN(rc);
+}
+
+static int cobd_dt_llog_finish(struct obd_device *obd,
+ struct obd_llogs *llogs,
+ int count)
+{
+ struct obd_export *cobd_exp;
+ struct obd_device *cobd_obd;
+ int rc = 0;
+ ENTRY;
+
+ cobd_exp = cobd_get_exp(obd);
+ cobd_obd = class_exp2obd(cobd_exp);
+
+ rc = obd_llog_finish(cobd_obd, &cobd_obd->obd_llogs, count);
+ RETURN(rc);
+}
+
+static int cobd_dt_init_ea_size(struct obd_export *exp, int easize,
+ int cookiesize)
+{
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ cobd_exp = cobd_get_exp(exp->exp_obd);
+ rc = obd_init_ea_size(cobd_exp, easize, cookiesize);
+ RETURN(rc);
+}
+
+static int cobd_dt_import_event(struct obd_device *obd,
+ struct obd_import *imp,
+ enum obd_import_event event)
+{
+ struct obd_export *cobd_exp;
+ ENTRY;
+
+ cobd_exp = cobd_get_exp(obd);
+ obd_import_event(class_exp2obd(cobd_exp), imp, event);
+ RETURN(0);
+}
+
+/* metadata related stuff */
+static int cobd_md_getstatus(struct obd_export *exp,
+ struct lustre_id *rootid)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = md_getstatus(cobd_exp, rootid);
+ RETURN(rc);
+}
+
+static int cobd_md_getattr(struct obd_export *exp, struct lustre_id *id,
+ __u64 valid, const char *xattr_name,
+ const void *xattr_data, unsigned int xattr_datalen,
+ unsigned int ea_size, struct obd_capa *ocapa,
+ struct ptlrpc_request **request)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = md_getattr(cobd_exp, id, valid, xattr_name, xattr_data,
+ xattr_datalen, ea_size, ocapa, request);
+ RETURN(rc);
+}
+
+static int cobd_md_req2lustre_md(struct obd_export *mdc_exp,
+ struct ptlrpc_request *req,
+ unsigned int offset,
+ struct obd_export *osc_exp,
+ struct lustre_md *md)
+{
+ struct obd_device *obd = class_exp2obd(mdc_exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ mdc_exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = md_req2lustre_md(cobd_exp, req, offset, osc_exp, md);
+ RETURN(rc);
+}
+
+static int cobd_md_change_cbdata(struct obd_export *exp, struct lustre_id *id,
+ ldlm_iterator_t it, void *data)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = md_change_cbdata(cobd_exp, id, it, data);
+ RETURN(rc);
+}
+
+static int cobd_md_getattr_lock(struct obd_export *exp, struct lustre_id *id,
+ char *filename, int namelen, __u64 valid,
+ unsigned int ea_size, struct ptlrpc_request **request)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = md_getattr_lock(cobd_exp, id, filename, namelen,
+ valid, ea_size, request);
+ RETURN(rc);
+}
+
+static int cobd_md_create(struct obd_export *exp, struct mdc_op_data *op_data,
+ const void *data, int datalen, int mode,
+ __u32 uid, __u32 gid, __u64 rdev,
+ struct ptlrpc_request **request)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = md_create(cobd_exp, op_data, data, datalen, mode,
+ uid, gid, rdev, request);
+ RETURN(rc);
+}
+
+static int cobd_md_unlink(struct obd_export *exp,
+ struct mdc_op_data *data,
+ struct ptlrpc_request **request)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = md_unlink(cobd_exp, data, request);
+ RETURN(rc);
+}
+
+static int cobd_md_valid_attrs(struct obd_export *exp,
+ struct lustre_id *id)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = md_valid_attrs(cobd_exp, id);
+ RETURN(rc);
+}
+
+static int cobd_md_rename(struct obd_export *exp, struct mdc_op_data *data,
+ const char *old, int oldlen, const char *new,
+ int newlen, struct ptlrpc_request **request)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = md_rename(cobd_exp, data, old, oldlen, new, newlen, request);
+ RETURN(rc);
+}
+
+static int cobd_md_link(struct obd_export *exp, struct mdc_op_data *data,
+ struct ptlrpc_request **request)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = md_link(cobd_exp, data, request);
+ RETURN(rc);
+}
+
+static int cobd_md_setattr(struct obd_export *exp, struct mdc_op_data *data,
+ struct iattr *iattr, void *ea, int ealen, void *ea2,
+ int ea2len, void *ea3, int ea3len,
+ struct ptlrpc_request **request)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = md_setattr(cobd_exp, data, iattr, ea,
+ ealen, ea2, ea2len, ea3, ea3len, request);
+ RETURN(rc);
+}
+
+static int cobd_md_readpage(struct obd_export *exp,
+ struct lustre_id *mdc_id,
+ __u64 offset, struct page *page,
+ struct ptlrpc_request **request)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = md_readpage(cobd_exp, mdc_id, offset, page, request);
+ RETURN(rc);
+}
+
+static int cobd_md_close(struct obd_export *exp, struct mdc_op_data *op_data,
+ struct obd_client_handle *och,
+ struct ptlrpc_request **request)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = md_close(cobd_exp, op_data, och, request);
+ RETURN(rc);
+}
+
+static int cobd_md_done_writing(struct obd_export *exp,
+ struct obdo *obdo)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = md_done_writing(cobd_exp, obdo);
+ RETURN(rc);
+}
+
+static int cobd_md_sync(struct obd_export *exp, struct lustre_id *id,
+ struct ptlrpc_request **request)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = md_sync(cobd_exp, id, request);
+ RETURN(rc);
+}
+
+static int cobd_md_set_open_replay_data(struct obd_export *exp,
+ struct obd_client_handle *och,
+ struct ptlrpc_request *open_req)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = md_set_open_replay_data(cobd_exp, och, open_req);
+ RETURN(rc);
+}
+
+static int cobd_md_clear_open_replay_data(struct obd_export *exp,
+ struct obd_client_handle *och)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = md_clear_open_replay_data(cobd_exp, och);
+ RETURN(rc);
+}
+
+static int cobd_md_store_inode_generation(struct obd_export *exp,
+ struct ptlrpc_request *req,
+ int reqoff, int repoff)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = md_store_inode_generation(cobd_exp, req, reqoff, repoff);
+ RETURN(rc);
+}
+
+static int cobd_md_set_lock_data(struct obd_export *exp,
+ __u64 *l, void *data)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = md_set_lock_data(cobd_exp, l, data);
+ RETURN(rc);
+}
+
+static int cobd_md_enqueue(struct obd_export *exp, int lock_type,
+ struct lookup_intent *it, int lock_mode,
+ struct mdc_op_data *data, struct lustre_handle *lockh,
+ void *lmm, int lmmsize,
+ ldlm_completion_callback cb_completion,
+ ldlm_blocking_callback cb_blocking, void *cb_data)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = md_enqueue(cobd_exp, lock_type, it, lock_mode, data,
+ lockh, lmm, lmmsize, cb_completion, cb_blocking,
+ cb_data);
+ RETURN(rc);
+}
+
+static int cobd_md_intent_lock(struct obd_export *exp, struct lustre_id *pid,
+ const char *name, int len, void *lmm, int lmmsize,
+ struct lustre_id *cid, struct lookup_intent *it,
+ int lookup_flags, struct ptlrpc_request **reqp,
+ ldlm_blocking_callback cb_blocking)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ lookup_flags |= LOOKUP_COBD;
+ cobd_exp = cobd_get_exp(obd);
+
+ rc = md_intent_lock(cobd_exp, pid, name, len, lmm, lmmsize,
+ cid, it, lookup_flags, reqp, cb_blocking);
+ RETURN(rc);
+}
+
+static struct obd_device *cobd_md_get_real_obd(struct obd_export *exp,
+ struct lustre_id *id)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ ENTRY;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(NULL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ RETURN(md_get_real_obd(cobd_exp, id));
+}
+
+static int cobd_md_change_cbdata_name(struct obd_export *exp,
+ struct lustre_id *id, char *name,
+ int namelen, struct lustre_id *id2,
+ ldlm_iterator_t it, void *data)
+{
+ struct obd_device *obd = class_exp2obd(exp);
+ struct obd_export *cobd_exp;
+ int rc = 0;
+
+ if (obd == NULL) {
+ CERROR("invalid client cookie "LPX64"\n",
+ exp->exp_handle.h_cookie);
+ RETURN(-EINVAL);
+ }
+ cobd_exp = cobd_get_exp(obd);
+ rc = md_change_cbdata_name(cobd_exp, id, name, namelen,
+ id2, it, data);
+ RETURN(rc);
+}
+
+static struct obd_ops cobd_obd_ops = {
+ .o_owner = THIS_MODULE,
+ .o_attach = cobd_attach,
+ .o_detach = cobd_detach,
+ .o_setup = cobd_setup,
+ .o_cleanup = cobd_cleanup,
+ .o_connect = cobd_connect,
+ .o_disconnect = cobd_disconnect,
+ .o_set_info = cobd_set_info,
+ .o_get_info = cobd_get_info,
+ .o_statfs = cobd_statfs,
+ .o_iocontrol = cobd_iocontrol,
+ .o_notify = cobd_notify,
+ .o_pin = cobd_pin,
+ .o_unpin = cobd_unpin,
+
+ .o_packmd = cobd_dt_packmd,
+ .o_unpackmd = cobd_dt_unpackmd,
+ .o_create = cobd_dt_create,
+ .o_destroy = cobd_dt_destroy,
+ .o_precleanup = cobd_dt_precleanup,
+ .o_getattr = cobd_dt_getattr,
+ .o_getattr_async = cobd_dt_getattr_async,
+ .o_setattr = cobd_dt_setattr,
+ .o_brw = cobd_dt_brw,
+ .o_brw_async = cobd_dt_brw_async,
+ .o_prep_async_page = cobd_dt_prep_async_page,
+ .o_queue_async_io = cobd_dt_queue_async_io,
+ .o_set_async_flags = cobd_dt_set_async_flags,
+ .o_queue_group_io = cobd_dt_queue_group_io,
+ .o_trigger_group_io = cobd_dt_trigger_group_io,
+ .o_teardown_async_page = cobd_dt_teardown_async_page,
+ .o_preprw = cobd_dt_preprw,
+ .o_punch = cobd_dt_punch,
+ .o_sync = cobd_dt_sync,
+ .o_enqueue = cobd_dt_enqueue,
+ .o_match = cobd_dt_match,
+ .o_change_cbdata = cobd_dt_change_cbdata,
+ .o_cancel = cobd_dt_cancel,
+ .o_cancel_unused = cobd_dt_cancel_unused,
+ .o_commitrw = cobd_dt_commitrw,
+ .o_llog_init = cobd_dt_llog_init,
+ .o_llog_finish = cobd_dt_llog_finish,
+ .o_import_event = cobd_dt_import_event,
+ .o_init_ea_size = cobd_dt_init_ea_size,
+ .o_adjust_kms = cobd_dt_adjust_kms,
+};