Whamcloud - gitweb
LU-3866 hsm: permission checks on HSM operations
[fs/lustre-release.git] / lustre / mdc / mdc_request.c
index 2d2167c..ab9a375 100644 (file)
@@ -368,27 +368,45 @@ static int mdc_xattr_common(struct obd_export *exp,const struct req_format *fmt,
                                      input_size);
         }
 
-        rc = ptlrpc_request_pack(req, LUSTRE_MDS_VERSION, opcode);
-        if (rc) {
-                ptlrpc_request_free(req);
-                RETURN(rc);
-        }
+       /* Flush local XATTR locks to get rid of a possible cancel RPC */
+       if (opcode == MDS_REINT && fid_is_sane(fid) &&
+           exp->exp_connect_data.ocd_ibits_known & MDS_INODELOCK_XATTR) {
+               CFS_LIST_HEAD(cancels);
+               int count;
+
+               /* Without that packing would fail */
+               if (input_size == 0)
+                       req_capsule_set_size(&req->rq_pill, &RMF_EADATA,
+                                            RCL_CLIENT, 0);
+
+               count = mdc_resource_get_unused(exp, fid,
+                                               &cancels, LCK_EX,
+                                               MDS_INODELOCK_XATTR);
+
+               rc = mdc_prep_elc_req(exp, req, MDS_REINT, &cancels, count);
+               if (rc) {
+                       ptlrpc_request_free(req);
+                       RETURN(rc);
+               }
+       } else {
+               rc = ptlrpc_request_pack(req, LUSTRE_MDS_VERSION, opcode);
+               if (rc) {
+                       ptlrpc_request_free(req);
+                       RETURN(rc);
+               }
+       }
 
         if (opcode == MDS_REINT) {
                 struct mdt_rec_setxattr *rec;
 
                 CLASSERT(sizeof(struct mdt_rec_setxattr) ==
                          sizeof(struct mdt_rec_reint));
-                rec = req_capsule_client_get(&req->rq_pill, &RMF_REC_REINT);
-                rec->sx_opcode = REINT_SETXATTR;
-                /* TODO:
-                 *  cfs_curproc_fs{u,g}id() should replace
-                 *  current->fs{u,g}id for portability.
-                 */
-                rec->sx_fsuid  = cfs_curproc_fsuid();
-                rec->sx_fsgid  = cfs_curproc_fsgid();
-                rec->sx_cap    = cfs_curproc_cap_pack();
-                rec->sx_suppgid1 = suppgid;
+               rec = req_capsule_client_get(&req->rq_pill, &RMF_REC_REINT);
+               rec->sx_opcode = REINT_SETXATTR;
+               rec->sx_fsuid  = current_fsuid();
+               rec->sx_fsgid  = current_fsgid();
+               rec->sx_cap    = cfs_curproc_cap_pack();
+               rec->sx_suppgid1 = suppgid;
                 rec->sx_suppgid2 = -1;
                 rec->sx_fid    = *fid;
                 rec->sx_valid  = valid | OBD_MD_FLCTIME;
@@ -824,13 +842,29 @@ static void mdc_close_handle_reply(struct ptlrpc_request *req,
 int mdc_close(struct obd_export *exp, struct md_op_data *op_data,
               struct md_open_data *mod, struct ptlrpc_request **request)
 {
-        struct obd_device     *obd = class_exp2obd(exp);
-        struct ptlrpc_request *req;
-        int                    rc;
-        ENTRY;
+       struct obd_device     *obd = class_exp2obd(exp);
+       struct ptlrpc_request *req;
+       struct req_format     *req_fmt;
+       int                    rc;
+       int                    saved_rc = 0;
+       ENTRY;
 
-        *request = NULL;
-        req = ptlrpc_request_alloc(class_exp2cliimp(exp), &RQF_MDS_CLOSE);
+       req_fmt = &RQF_MDS_CLOSE;
+       if (op_data->op_bias & MDS_HSM_RELEASE) {
+               req_fmt = &RQF_MDS_RELEASE_CLOSE;
+
+               /* allocate a FID for volatile file */
+               rc = mdc_fid_alloc(exp, &op_data->op_fid2, op_data);
+               if (rc < 0) {
+                       CERROR("%s: "DFID" failed to allocate FID: %d\n",
+                              obd->obd_name, PFID(&op_data->op_fid1), rc);
+                       /* save the errcode and proceed to close */
+                       saved_rc = rc;
+               }
+       }
+
+       *request = NULL;
+       req = ptlrpc_request_alloc(class_exp2cliimp(exp), req_fmt);
         if (req == NULL)
                 RETURN(-ENOMEM);
 
@@ -920,7 +954,7 @@ int mdc_close(struct obd_export *exp, struct md_op_data *op_data,
         }
         *request = req;
         mdc_close_handle_reply(req, op_data, rc);
-        RETURN(rc);
+        RETURN(rc < 0 ? rc : saved_rc);
 }
 
 int mdc_done_writing(struct obd_export *exp, struct md_op_data *op_data,
@@ -1037,19 +1071,19 @@ EXPORT_SYMBOL(mdc_sendpage);
 #endif
 
 int mdc_readpage(struct obd_export *exp, struct md_op_data *op_data,
-                 struct page **pages, struct ptlrpc_request **request)
-{
-        struct ptlrpc_request   *req;
-        struct ptlrpc_bulk_desc *desc;
-        int                      i;
-        cfs_waitq_t              waitq;
-        int                      resends = 0;
-        struct l_wait_info       lwi;
-        int                      rc;
-        ENTRY;
+                struct page **pages, struct ptlrpc_request **request)
+{
+       struct ptlrpc_request   *req;
+       struct ptlrpc_bulk_desc *desc;
+       int                      i;
+       wait_queue_head_t        waitq;
+       int                      resends = 0;
+       struct l_wait_info       lwi;
+       int                      rc;
+       ENTRY;
 
-        *request = NULL;
-        cfs_waitq_init(&waitq);
+       *request = NULL;
+       init_waitqueue_head(&waitq);
 
 restart_bulk:
         req = ptlrpc_request_alloc(class_exp2cliimp(exp), &RQF_MDS_READPAGE);
@@ -1234,7 +1268,7 @@ static int mdc_ioc_hsm_progress(struct obd_export *exp,
        if (req == NULL)
                GOTO(out, rc = -ENOMEM);
 
-       mdc_pack_body(req, NULL, NULL, OBD_MD_FLRMTPERM, 0, 0, 0);
+       mdc_pack_body(req, NULL, NULL, OBD_MD_FLRMTPERM, 0, -1, 0);
 
        /* Copy hsm_progress struct */
        req_hpk = req_capsule_client_get(&req->rq_pill, &RMF_MDS_HSM_PROGRESS);
@@ -1266,7 +1300,7 @@ static int mdc_ioc_hsm_ct_register(struct obd_import *imp, __u32 archives)
        if (req == NULL)
                GOTO(out, rc = -ENOMEM);
 
-       mdc_pack_body(req, NULL, NULL, OBD_MD_FLRMTPERM, 0, 0, 0);
+       mdc_pack_body(req, NULL, NULL, OBD_MD_FLRMTPERM, 0, -1, 0);
 
        /* Copy hsm_progress struct */
        archive_mask = req_capsule_client_get(&req->rq_pill,
@@ -1341,7 +1375,7 @@ static int mdc_ioc_hsm_ct_unregister(struct obd_import *imp)
        if (req == NULL)
                GOTO(out, rc = -ENOMEM);
 
-       mdc_pack_body(req, NULL, NULL, OBD_MD_FLRMTPERM, 0, 0, 0);
+       mdc_pack_body(req, NULL, NULL, OBD_MD_FLRMTPERM, 0, -1, 0);
 
        ptlrpc_request_set_replen(req);
 
@@ -1464,7 +1498,7 @@ static int mdc_ioc_hsm_request(struct obd_export *exp,
                RETURN(rc);
        }
 
-       mdc_pack_body(req, NULL, NULL, OBD_MD_FLRMTPERM, 0, 0, 0);
+       mdc_pack_body(req, NULL, NULL, OBD_MD_FLRMTPERM, 0, -1, 0);
 
        /* Copy hsm_request struct */
        req_hr = req_capsule_client_get(&req->rq_pill, &RMF_MDS_HSM_REQUEST);
@@ -1497,16 +1531,16 @@ out:
 
 static struct kuc_hdr *changelog_kuc_hdr(char *buf, int len, int flags)
 {
-        struct kuc_hdr *lh = (struct kuc_hdr *)buf;
+       struct kuc_hdr *lh = (struct kuc_hdr *)buf;
 
-        LASSERT(len <= CR_MAXSIZE);
+       LASSERT(len <= KUC_CHANGELOG_MSG_MAXSIZE);
 
-        lh->kuc_magic = KUC_MAGIC;
-        lh->kuc_transport = KUC_TRANSPORT_CHANGELOG;
-        lh->kuc_flags = flags;
-        lh->kuc_msgtype = CL_RECORD;
-        lh->kuc_msglen = len;
-        return lh;
+       lh->kuc_magic = KUC_MAGIC;
+       lh->kuc_transport = KUC_TRANSPORT_CHANGELOG;
+       lh->kuc_flags = flags;
+       lh->kuc_msgtype = CL_RECORD;
+       lh->kuc_msglen = len;
+       return lh;
 }
 
 #define D_CHANGELOG 0
@@ -1564,18 +1598,18 @@ static int changelog_kkuc_cb(const struct lu_env *env, struct llog_handle *llh,
 
 static int mdc_changelog_send_thread(void *csdata)
 {
-        struct changelog_show *cs = csdata;
-        struct llog_ctxt *ctxt = NULL;
-        struct llog_handle *llh = NULL;
-        struct kuc_hdr *kuch;
-        int rc;
+       struct changelog_show *cs = csdata;
+       struct llog_ctxt *ctxt = NULL;
+       struct llog_handle *llh = NULL;
+       struct kuc_hdr *kuch;
+       int rc;
 
-        CDEBUG(D_CHANGELOG, "changelog to fp=%p start "LPU64"\n",
-               cs->cs_fp, cs->cs_startrec);
+       CDEBUG(D_CHANGELOG, "changelog to fp=%p start "LPU64"\n",
+              cs->cs_fp, cs->cs_startrec);
 
-        OBD_ALLOC(cs->cs_buf, CR_MAXSIZE);
-        if (cs->cs_buf == NULL)
-                GOTO(out, rc = -ENOMEM);
+       OBD_ALLOC(cs->cs_buf, KUC_CHANGELOG_MSG_MAXSIZE);
+       if (cs->cs_buf == NULL)
+               GOTO(out, rc = -ENOMEM);
 
         /* Set up the remote catalog handle */
         ctxt = llog_get_context(cs->cs_obd, LLOG_CHANGELOG_REPL_CTXT);
@@ -1610,7 +1644,7 @@ out:
         if (ctxt)
                 llog_ctxt_put(ctxt);
        if (cs->cs_buf)
-               OBD_FREE(cs->cs_buf, CR_MAXSIZE);
+               OBD_FREE(cs->cs_buf, KUC_CHANGELOG_MSG_MAXSIZE);
        OBD_FREE_PTR(cs);
        return rc;
 }
@@ -1802,10 +1836,10 @@ static int mdc_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
         int rc;
         ENTRY;
 
-        if (!cfs_try_module_get(THIS_MODULE)) {
-                CERROR("Can't get module. Is it alive?");
-                return -EINVAL;
-        }
+       if (!try_module_get(THIS_MODULE)) {
+               CERROR("Can't get module. Is it alive?");
+               return -EINVAL;
+       }
         switch (cmd) {
         case OBD_IOC_CHANGELOG_SEND:
                 rc = mdc_ioc_changelog_send(obd, karg);
@@ -1824,6 +1858,9 @@ static int mdc_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
                GOTO(out, rc);
        case LL_IOC_HSM_CT_START:
                rc = mdc_ioc_hsm_ct_start(exp, karg);
+               /* ignore if it was already registered on this MDS. */
+               if (rc == -EEXIST)
+                       rc = 0;
                GOTO(out, rc);
        case LL_IOC_HSM_PROGRESS:
                rc = mdc_ioc_hsm_progress(exp, karg);
@@ -1833,6 +1870,7 @@ static int mdc_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
                GOTO(out, rc);
        case LL_IOC_HSM_STATE_SET:
                rc = mdc_ioc_hsm_state_set(exp, karg);
+               GOTO(out, rc);
        case LL_IOC_HSM_ACTION:
                rc = mdc_ioc_hsm_current_action(exp, karg);
                GOTO(out, rc);
@@ -1901,44 +1939,42 @@ static int mdc_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
 
                 GOTO(out, rc = 0);
         }
-        case OBD_IOC_QUOTACTL: {
-                struct if_quotactl *qctl = karg;
-                struct obd_quotactl *oqctl;
+       case OBD_IOC_QUOTACTL: {
+               struct if_quotactl *qctl = karg;
+               struct obd_quotactl *oqctl;
 
-                OBD_ALLOC_PTR(oqctl);
-                if (!oqctl)
-                        RETURN(-ENOMEM);
+               OBD_ALLOC_PTR(oqctl);
+               if (oqctl == NULL)
+                       GOTO(out, rc = -ENOMEM);
 
-                QCTL_COPY(oqctl, qctl);
-                rc = obd_quotactl(exp, oqctl);
-                if (rc == 0) {
-                        QCTL_COPY(qctl, oqctl);
-                        qctl->qc_valid = QC_MDTIDX;
-                        qctl->obd_uuid = obd->u.cli.cl_target_uuid;
-                }
-                OBD_FREE_PTR(oqctl);
-                break;
-        }
-       case LL_IOC_GET_CONNECT_FLAGS: {
-               if (copy_to_user(uarg,
-                                    exp_connect_flags_ptr(exp),
-                                    sizeof(__u64)))
-                       GOTO(out, rc = -EFAULT);
-               else
-                       GOTO(out, rc = 0);
+               QCTL_COPY(oqctl, qctl);
+               rc = obd_quotactl(exp, oqctl);
+               if (rc == 0) {
+                       QCTL_COPY(qctl, oqctl);
+                       qctl->qc_valid = QC_MDTIDX;
+                       qctl->obd_uuid = obd->u.cli.cl_target_uuid;
+               }
+
+               OBD_FREE_PTR(oqctl);
+               GOTO(out, rc);
        }
-       case LL_IOC_LOV_SWAP_LAYOUTS: {
+       case LL_IOC_GET_CONNECT_FLAGS:
+               if (copy_to_user(uarg, exp_connect_flags_ptr(exp),
+                                sizeof(*exp_connect_flags_ptr(exp))))
+                       GOTO(out, rc = -EFAULT);
+
+               GOTO(out, rc = 0);
+       case LL_IOC_LOV_SWAP_LAYOUTS:
                rc = mdc_ioc_swap_layouts(exp, karg);
-               break;
+               GOTO(out, rc);
+       default:
+               CERROR("unrecognised ioctl: cmd = %#x\n", cmd);
+               GOTO(out, rc = -ENOTTY);
        }
-        default:
-                CERROR("mdc_ioctl(): unrecognised ioctl %#x\n", cmd);
-                GOTO(out, rc = -ENOTTY);
-        }
 out:
-        cfs_module_put(THIS_MODULE);
+       module_put(THIS_MODULE);
 
-        return rc;
+       return rc;
 }
 
 int mdc_get_info_rpc(struct obd_export *exp,
@@ -2012,11 +2048,9 @@ static void lustre_swab_hal(struct hsm_action_list *h)
        __swab32s(&h->hal_count);
        __swab32s(&h->hal_archive_id);
        __swab64s(&h->hal_flags);
-       hai = hai_zero(h);
-       for (i = 0; i < h->hal_count; i++) {
+       hai = hai_first(h);
+       for (i = 0; i < h->hal_count; i++, hai = hai_next(hai))
                lustre_swab_hai(hai);
-               hai = hai_next(hai);
-       }
 }
 
 static void lustre_swab_kuch(struct kuc_hdr *l)
@@ -2043,19 +2077,10 @@ static int mdc_ioc_hsm_ct_start(struct obd_export *exp,
               lk->lk_uid, lk->lk_group, lk->lk_flags);
 
        if (lk->lk_flags & LK_FLG_STOP) {
-               rc = libcfs_kkuc_group_rem(lk->lk_uid, lk->lk_group);
                /* Unregister with the coordinator */
-               if (rc == 0)
-                       rc = mdc_ioc_hsm_ct_unregister(imp);
+               rc = mdc_ioc_hsm_ct_unregister(imp);
        } else {
-               struct file *fp = fget(lk->lk_wfd);
-
-               rc = libcfs_kkuc_group_add(fp, lk->lk_uid, lk->lk_group,
-                                          lk->lk_data);
-               if (rc && fp)
-                       fput(fp);
-               if (rc == 0)
-                       rc = mdc_ioc_hsm_ct_register(imp, archive);
+               rc = mdc_ioc_hsm_ct_register(imp, archive);
        }
 
        return rc;
@@ -2100,21 +2125,27 @@ static int mdc_hsm_copytool_send(int len, void *val)
 /**
  * callback function passed to kuc for re-registering each HSM copytool
  * running on MDC, after MDT shutdown/recovery.
- * @param data archive id served by the copytool
+ * @param data copytool registration data
  * @param cb_arg callback argument (obd_import)
  */
-static int mdc_hsm_ct_reregister(__u32 data, void *cb_arg)
+static int mdc_hsm_ct_reregister(void *data, void *cb_arg)
 {
+       struct kkuc_ct_data     *kcd = data;
        struct obd_import       *imp = (struct obd_import *)cb_arg;
-       __u32                    archive = data;
        int                      rc;
 
-       CDEBUG(D_HA, "recover copytool registration to MDT (archive=%#x)\n",
-              archive);
-       rc = mdc_ioc_hsm_ct_register(imp, archive);
+       if (kcd == NULL || kcd->kcd_magic != KKUC_CT_DATA_MAGIC)
+               return -EPROTO;
+
+       if (!obd_uuid_equals(&kcd->kcd_uuid, &imp->imp_obd->obd_uuid))
+               return 0;
+
+       CDEBUG(D_HA, "%s: recover copytool registration to MDT (archive=%#x)\n",
+              imp->imp_obd->obd_name, kcd->kcd_archive);
+       rc = mdc_ioc_hsm_ct_register(imp, kcd->kcd_archive);
 
        /* ignore error if the copytool is already registered */
-       return ((rc != 0) && (rc != -EEXIST)) ? rc : 0;
+       return (rc == -EEXIST) ? 0 : rc;
 }
 
 /**
@@ -2166,15 +2197,6 @@ int mdc_set_info_async(const struct lu_env *env,
                 sptlrpc_import_flush_my_ctx(imp);
                 RETURN(0);
         }
-        if (KEY_IS(KEY_MDS_CONN)) {
-                /* mds-mds import */
-               spin_lock(&imp->imp_lock);
-               imp->imp_server_timeout = 1;
-               spin_unlock(&imp->imp_lock);
-                imp->imp_client->cli_request_portal = MDS_MDS_PORTAL;
-                CDEBUG(D_OTHER, "%s: timeout / 2\n", exp->exp_obd->obd_name);
-                RETURN(0);
-        }
         if (KEY_IS(KEY_CHANGELOG_CLEAR)) {
                 rc = do_set_info_async(imp, MDS_SET_INFO, LUSTRE_MDS_VERSION,
                                        keylen, key, vallen, val, set);
@@ -2312,8 +2334,8 @@ static int mdc_unpin(struct obd_export *exp, struct obd_client_handle *handle,
         RETURN(rc);
 }
 
-int mdc_sync(struct obd_export *exp, const struct lu_fid *fid,
-             struct obd_capa *oc, struct ptlrpc_request **request)
+int mdc_fsync(struct obd_export *exp, const struct lu_fid *fid,
+             struct obd_capa *oc, struct ptlrpc_request **request)
 {
         struct ptlrpc_request *req;
         int                    rc;
@@ -2380,7 +2402,7 @@ static int mdc_import_event(struct obd_device *obd, struct obd_import *imp,
         }
        case IMP_EVENT_ACTIVE:
                rc = obd_notify_observer(obd, obd, OBD_NOTIFY_ACTIVE, NULL);
-               /* restore re-establish kuc registration after reconnecting */
+               /* redo the kuc registration after reconnecting */
                if (rc == 0)
                        rc = mdc_kuc_reregister(imp);
                break;
@@ -2444,21 +2466,23 @@ struct ldlm_valblock_ops inode_lvbo = {
 
 static int mdc_setup(struct obd_device *obd, struct lustre_cfg *cfg)
 {
-        struct client_obd *cli = &obd->u.cli;
-        struct lprocfs_static_vars lvars = { 0 };
-        int rc;
-        ENTRY;
+       struct client_obd               *cli = &obd->u.cli;
+       struct lprocfs_static_vars      lvars = { 0 };
+       int                             rc;
+       ENTRY;
 
         OBD_ALLOC(cli->cl_rpc_lock, sizeof (*cli->cl_rpc_lock));
         if (!cli->cl_rpc_lock)
                 RETURN(-ENOMEM);
         mdc_init_rpc_lock(cli->cl_rpc_lock);
 
-        ptlrpcd_addref();
+       rc = ptlrpcd_addref();
+       if (rc < 0)
+               GOTO(err_rpc_lock, rc);
 
         OBD_ALLOC(cli->cl_close_lock, sizeof (*cli->cl_close_lock));
         if (!cli->cl_close_lock)
-                GOTO(err_rpc_lock, rc = -ENOMEM);
+                GOTO(err_ptlrpcd_decref, rc = -ENOMEM);
         mdc_init_rpc_lock(cli->cl_close_lock);
 
         rc = client_obd_setup(obd, cfg);
@@ -2466,6 +2490,7 @@ static int mdc_setup(struct obd_device *obd, struct lustre_cfg *cfg)
                 GOTO(err_close_lock, rc);
         lprocfs_mdc_init_vars(&lvars);
         lprocfs_obd_setup(obd, lvars.obd_vars);
+       lprocfs_alloc_md_stats(obd, 0);
         sptlrpc_lprocfs_cliobd_attach(obd);
         ptlrpc_lprocfs_register_obd(obd);
 
@@ -2483,9 +2508,10 @@ static int mdc_setup(struct obd_device *obd, struct lustre_cfg *cfg)
 
 err_close_lock:
         OBD_FREE(cli->cl_close_lock, sizeof (*cli->cl_close_lock));
+err_ptlrpcd_decref:
+        ptlrpcd_decref();
 err_rpc_lock:
         OBD_FREE(cli->cl_rpc_lock, sizeof (*cli->cl_rpc_lock));
-        ptlrpcd_decref();
         RETURN(rc);
 }
 
@@ -2521,13 +2547,14 @@ static int mdc_precleanup(struct obd_device *obd, enum obd_cleanup_stage stage)
         case OBD_CLEANUP_EARLY:
                 break;
         case OBD_CLEANUP_EXPORTS:
-                /* Failsafe, ok if racy */
-                if (obd->obd_type->typ_refcnt <= 1)
-                        libcfs_kkuc_group_rem(0, KUC_GRP_HSM);
+               /* Failsafe, ok if racy */
+               if (obd->obd_type->typ_refcnt <= 1)
+                       libcfs_kkuc_group_rem(0, KUC_GRP_HSM, NULL);
 
                 obd_cleanup_client_import(obd);
                 ptlrpc_lprocfs_unregister_obd(obd);
                 lprocfs_obd_cleanup(obd);
+               lprocfs_free_md_stats(obd);
 
                 rc = obd_llog_finish(obd, 0);
                 if (rc != 0)
@@ -2698,27 +2725,6 @@ static int mdc_renew_capa(struct obd_export *exp, struct obd_capa *oc,
         RETURN(0);
 }
 
-static int mdc_connect(const struct lu_env *env,
-                       struct obd_export **exp,
-                       struct obd_device *obd, struct obd_uuid *cluuid,
-                       struct obd_connect_data *data,
-                       void *localdata)
-{
-       struct obd_import *imp = obd->u.cli.cl_import;
-
-       /* mds-mds import features */
-       if (data && (data->ocd_connect_flags & OBD_CONNECT_MDS_MDS)) {
-               spin_lock(&imp->imp_lock);
-               imp->imp_server_timeout = 1;
-               spin_unlock(&imp->imp_lock);
-                imp->imp_client->cli_request_portal = MDS_MDS_PORTAL;
-                CDEBUG(D_OTHER, "%s: Set 'mds' portal and timeout\n",
-                       obd->obd_name);
-        }
-
-        return client_connect_import(env, exp, obd, cluuid, data, NULL);
-}
-
 struct obd_ops mdc_obd_ops = {
         .o_owner            = THIS_MODULE,
         .o_setup            = mdc_setup,
@@ -2726,7 +2732,7 @@ struct obd_ops mdc_obd_ops = {
         .o_cleanup          = mdc_cleanup,
         .o_add_conn         = client_import_add_conn,
         .o_del_conn         = client_import_del_conn,
-        .o_connect          = mdc_connect,
+        .o_connect          = client_connect_import,
         .o_disconnect       = client_disconnect_export,
         .o_iocontrol        = mdc_iocontrol,
         .o_set_info_async   = mdc_set_info_async,
@@ -2763,7 +2769,7 @@ struct md_ops mdc_md_ops = {
         .m_setattr          = mdc_setattr,
         .m_setxattr         = mdc_setxattr,
         .m_getxattr         = mdc_getxattr,
-        .m_sync             = mdc_sync,
+       .m_fsync            = mdc_fsync,
         .m_readpage         = mdc_readpage,
         .m_unlink           = mdc_unlink,
         .m_cancel_unused    = mdc_cancel_unused,