Whamcloud - gitweb
LU-8460 osc: max_pages_per_rpc should be chunk size aligned
[fs/lustre-release.git] / lustre / ofd / ofd_obd.c
index 5656ae9..c47b5bd 100644 (file)
@@ -23,7 +23,7 @@
  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2012, 2014 Intel Corporation.
+ * Copyright (c) 2012, 2015, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -70,9 +70,7 @@ static int ofd_export_stats_init(struct ofd_device *ofd,
 {
        struct obd_device       *obd = ofd_obd(ofd);
        struct nid_stat         *stats;
-       int                      num_stats;
-       int                      rc, newnid = 0;
-
+       int                      rc;
        ENTRY;
 
        LASSERT(obd->obd_uses_nid_stats);
@@ -81,44 +79,34 @@ static int ofd_export_stats_init(struct ofd_device *ofd,
                /* Self-export gets no proc entry */
                RETURN(0);
 
-       rc = lprocfs_exp_setup(exp, client_nid, &newnid);
-       if (rc) {
-               /* Mask error for already created
-                * /proc entries */
-               if (rc == -EALREADY)
-                       rc = 0;
-               RETURN(rc);
-       }
-
-       if (newnid == 0)
-               RETURN(0);
+       rc = lprocfs_exp_setup(exp, client_nid);
+       if (rc != 0)
+               /* Mask error for already created /proc entries */
+               RETURN(rc == -EALREADY ? 0 : rc);
 
        stats = exp->exp_nid_stats;
-       LASSERT(stats != NULL);
-
-       num_stats = NUM_OBD_STATS + LPROC_OFD_STATS_LAST;
-
-       stats->nid_stats = lprocfs_alloc_stats(num_stats,
-                                              LPROCFS_STATS_FLAG_NOPERCPU);
+       stats->nid_stats = lprocfs_alloc_stats(NUM_OBD_STATS +
+                                               LPROC_OFD_STATS_LAST,
+                                               LPROCFS_STATS_FLAG_NOPERCPU);
        if (stats->nid_stats == NULL)
-               return -ENOMEM;
+               RETURN(-ENOMEM);
 
        lprocfs_init_ops_stats(LPROC_OFD_STATS_LAST, stats->nid_stats);
+
        ofd_stats_counter_init(stats->nid_stats);
-       rc = lprocfs_register_stats(stats->nid_proc, "stats",
-                                   stats->nid_stats);
-       if (rc)
-               GOTO(clean, rc);
 
-       rc = lprocfs_nid_ldlm_stats_init(stats);
-       if (rc) {
+       rc = lprocfs_register_stats(stats->nid_proc, "stats", stats->nid_stats);
+       if (rc != 0) {
                lprocfs_free_stats(&stats->nid_stats);
-               GOTO(clean, rc);
+               GOTO(out, rc);
        }
 
-       RETURN(0);
-clean:
-       return rc;
+       rc = lprocfs_nid_ldlm_stats_init(stats);
+       if (rc != 0)
+               GOTO(out, rc);
+
+out:
+       RETURN(rc);
 }
 
 /**
@@ -176,6 +164,7 @@ static int ofd_parse_connect_data(const struct lu_env *env,
        fed->fed_group = data->ocd_group;
 
        data->ocd_connect_flags &= OST_CONNECT_SUPPORTED;
+       data->ocd_connect_flags2 &= OST_CONNECT_SUPPORTED2;
        data->ocd_version = LUSTRE_VERSION_CODE;
 
        /* Kindly make sure the SKIP_ORPHAN flag is from MDS. */
@@ -185,18 +174,45 @@ static int ofd_parse_connect_data(const struct lu_env *env,
        else if (data->ocd_connect_flags & OBD_CONNECT_SKIP_ORPHAN)
                RETURN(-EPROTO);
 
-       if (ofd_grant_param_supp(exp)) {
-               exp->exp_filter_data.fed_pagesize = data->ocd_blocksize;
-               /* ocd_{blocksize,inodespace} are log2 values */
-               data->ocd_blocksize  = ofd->ofd_blockbits;
-               data->ocd_inodespace = ofd->ofd_dt_conf.ddp_inodespace;
-               /* ocd_grant_extent is in 1K blocks */
-               data->ocd_grant_extent = ofd->ofd_dt_conf.ddp_grant_frag >> 10;
+       /* Determine optimal brw size before calculating grant */
+       if (OBD_FAIL_CHECK(OBD_FAIL_OST_BRW_SIZE)) {
+               data->ocd_brw_size = 65536;
+       } else if (OCD_HAS_FLAG(data, BRW_SIZE)) {
+               if (data->ocd_brw_size > ofd->ofd_brw_size)
+                       data->ocd_brw_size = ofd->ofd_brw_size;
+               if (data->ocd_brw_size == 0) {
+                       CERROR("%s: cli %s/%p ocd_connect_flags: "LPX64
+                              " ocd_version: %x ocd_grant: %d ocd_index: %u "
+                              "ocd_brw_size is unexpectedly zero, "
+                              "network data corruption?"
+                              "Refusing connection of this client\n",
+                              exp->exp_obd->obd_name,
+                              exp->exp_client_uuid.uuid,
+                              exp, data->ocd_connect_flags, data->ocd_version,
+                              data->ocd_grant, data->ocd_index);
+                       RETURN(-EPROTO);
+               }
        }
 
-       if (data->ocd_connect_flags & OBD_CONNECT_GRANT)
-               data->ocd_grant = ofd_grant_connect(env, exp, data->ocd_grant,
-                                                   new_connection);
+       if (OCD_HAS_FLAG(data, GRANT_PARAM)) {
+               /* client is reporting its page size, for future use */
+               exp->exp_filter_data.fed_pagebits = data->ocd_grant_blkbits;
+               data->ocd_grant_blkbits  = ofd->ofd_blockbits;
+               /* ddp_inodespace may not be power-of-two value, eg. for ldiskfs
+                * it's LDISKFS_DIR_REC_LEN(20) = 28. */
+               data->ocd_grant_inobits =
+                                      fls(ofd->ofd_dt_conf.ddp_inodespace - 1);
+               /* ocd_grant_tax_kb is in 1K byte blocks */
+               data->ocd_grant_tax_kb = ofd->ofd_dt_conf.ddp_extent_tax >> 10;
+               data->ocd_grant_max_blks = ofd->ofd_dt_conf.ddp_max_extent_blks;
+       }
+
+       if (OCD_HAS_FLAG(data, GRANT)) {
+               /* Save connect_data we have so far because ofd_grant_connect()
+                * uses it to calculate grant. */
+               exp->exp_connect_data = *data;
+               ofd_grant_connect(env, exp, data, new_connection);
+       }
 
        if (data->ocd_connect_flags & OBD_CONNECT_INDEX) {
                struct lr_server_data *lsd = &ofd->ofd_lut.lut_lsd;
@@ -219,24 +235,6 @@ static int ofd_parse_connect_data(const struct lu_env *env,
                        tgt_server_data_update(env, &ofd->ofd_lut, 0);
                }
        }
-       if (OBD_FAIL_CHECK(OBD_FAIL_OST_BRW_SIZE)) {
-               data->ocd_brw_size = 65536;
-       } else if (data->ocd_connect_flags & OBD_CONNECT_BRW_SIZE) {
-               data->ocd_brw_size = min(data->ocd_brw_size,
-                                        (__u32)DT_MAX_BRW_SIZE);
-               if (data->ocd_brw_size == 0) {
-                       CERROR("%s: cli %s/%p ocd_connect_flags: "LPX64
-                              " ocd_version: %x ocd_grant: %d ocd_index: %u "
-                              "ocd_brw_size is unexpectedly zero, "
-                              "network data corruption?"
-                              "Refusing connection of this client\n",
-                              exp->exp_obd->obd_name,
-                              exp->exp_client_uuid.uuid,
-                              exp, data->ocd_connect_flags, data->ocd_version,
-                              data->ocd_grant, data->ocd_index);
-                       RETURN(-EPROTO);
-               }
-       }
 
        if (data->ocd_connect_flags & OBD_CONNECT_CKSUM) {
                __u32 cksum_types = data->ocd_cksum_types;
@@ -309,13 +307,17 @@ static int ofd_obd_reconnect(const struct lu_env *env, struct obd_export *exp,
        if (exp == NULL || obd == NULL || cluuid == NULL)
                RETURN(-EINVAL);
 
+       rc = nodemap_add_member(*(lnet_nid_t *)client_nid, exp);
+       if (rc != 0 && rc != -EEXIST)
+               RETURN(rc);
+
        ofd = ofd_dev(obd->obd_lu_dev);
 
        rc = ofd_parse_connect_data(env, exp, data, false);
        if (rc == 0)
                ofd_export_stats_init(ofd, exp, client_nid);
-
-       nodemap_add_member(*(lnet_nid_t *)client_nid, exp);
+       else
+               nodemap_del_member(exp);
 
        RETURN(rc);
 }
@@ -345,7 +347,6 @@ static int ofd_obd_connect(const struct lu_env *env, struct obd_export **_exp,
        struct ofd_device       *ofd;
        struct lustre_handle     conn = { 0 };
        int                      rc;
-       lnet_nid_t              *client_nid;
        ENTRY;
 
        if (_exp == NULL || obd == NULL || cluuid == NULL)
@@ -360,15 +361,19 @@ static int ofd_obd_connect(const struct lu_env *env, struct obd_export **_exp,
        exp = class_conn2export(&conn);
        LASSERT(exp != NULL);
 
+       if (localdata != NULL) {
+               rc = nodemap_add_member(*(lnet_nid_t *)localdata, exp);
+               if (rc != 0 && rc != -EEXIST)
+                       GOTO(out, rc);
+       } else {
+               CDEBUG(D_HA, "%s: cannot find nodemap for client %s: "
+                      "nid is null\n", obd->obd_name, cluuid->uuid);
+       }
+
        rc = ofd_parse_connect_data(env, exp, data, true);
        if (rc)
                GOTO(out, rc);
 
-       if (localdata != NULL) {
-               client_nid = localdata;
-               nodemap_add_member(*client_nid, exp);
-       }
-
        if (obd->obd_replayable) {
                struct tg_export_data *ted = &exp->exp_target_data;
 
@@ -385,8 +390,8 @@ static int ofd_obd_connect(const struct lu_env *env, struct obd_export **_exp,
 
 out:
        if (rc != 0) {
-               nodemap_del_member(exp);
                class_disconnect(exp);
+               nodemap_del_member(exp);
                *_exp = NULL;
        } else {
                *_exp = exp;
@@ -419,7 +424,6 @@ int ofd_obd_disconnect(struct obd_export *exp)
        if (!(exp->exp_flags & OBD_OPT_FORCE))
                ofd_grant_sanity_check(ofd_obd(ofd), __FUNCTION__);
 
-       nodemap_del_member(exp);
        rc = server_disconnect_export(exp);
 
        ofd_grant_discard(exp);
@@ -435,6 +439,7 @@ int ofd_obd_disconnect(struct obd_export *exp)
                lu_env_fini(&env);
        }
 out:
+       nodemap_del_member(exp);
        class_export_put(exp);
        RETURN(rc);
 }
@@ -513,10 +518,8 @@ static int ofd_destroy_export(struct obd_export *exp)
        ofd_grant_discard(exp);
        ofd_fmd_cleanup(exp);
 
-       if (exp_connect_flags(exp) & OBD_CONNECT_GRANT_SHRINK) {
-               if (ofd->ofd_tot_granted_clients > 0)
-                       ofd->ofd_tot_granted_clients --;
-       }
+       if (exp_connect_flags(exp) & OBD_CONNECT_GRANT)
+               ofd->ofd_tot_granted_clients--;
 
        if (!(exp->exp_flags & OBD_OPT_FORCE))
                ofd_grant_sanity_check(exp->exp_obd, __FUNCTION__);
@@ -540,17 +543,20 @@ static int ofd_destroy_export(struct obd_export *exp)
 int ofd_postrecov(const struct lu_env *env, struct ofd_device *ofd)
 {
        struct lu_device *ldev = &ofd->ofd_dt_dev.dd_lu_dev;
-       struct lfsck_start_param lsp;
        int rc;
 
        CDEBUG(D_HA, "%s: recovery is over\n", ofd_name(ofd));
 
-       lsp.lsp_start = NULL;
-       lsp.lsp_index_valid = 0;
-       rc = lfsck_start(env, ofd->ofd_osd, &lsp);
-       if (rc != 0 && rc != -EALREADY)
-               CWARN("%s: auto trigger paused LFSCK failed: rc = %d\n",
-                     ofd_name(ofd), rc);
+       if (!ofd->ofd_skip_lfsck) {
+               struct lfsck_start_param lsp;
+
+               lsp.lsp_start = NULL;
+               lsp.lsp_index_valid = 0;
+               rc = lfsck_start(env, ofd->ofd_osd, &lsp);
+               if (rc != 0 && rc != -EALREADY)
+                       CWARN("%s: auto trigger paused LFSCK failed: rc = %d\n",
+                             ofd_name(ofd), rc);
+       }
 
        return ldev->ld_ops->ldo_recovery_complete(env, ldev);
 }
@@ -566,7 +572,7 @@ int ofd_postrecov(const struct lu_env *env, struct ofd_device *ofd)
  * \retval             0 if successful
  * \retval             negative value on error
  */
-int ofd_obd_postrecov(struct obd_device *obd)
+static int ofd_obd_postrecov(struct obd_device *obd)
 {
        struct lu_env            env;
        struct lu_device        *ldev = obd->obd_lu_dev;
@@ -640,19 +646,17 @@ static int ofd_set_info_async(const struct lu_env *env, struct obd_export *exp,
  * \param[in]  key     key name
  * \param[out] vallen  length of key value
  * \param[out] val     the key value to return
- * \param[in]  lsm     not used in OFD
  *
  * \retval             0 if successful
  * \retval             negative value on error
  */
 static int ofd_get_info(const struct lu_env *env, struct obd_export *exp,
-                       __u32 keylen, void *key, __u32 *vallen, void *val,
-                       struct lov_stripe_md *lsm)
+                       __u32 keylen, void *key, __u32 *vallen, void *val)
 {
        struct ofd_thread_info          *info;
        struct ofd_device               *ofd;
        struct ll_fiemap_info_key       *fm_key = key;
-       struct ll_user_fiemap           *fiemap = val;
+       struct fiemap                   *fiemap = val;
        int                              rc = 0;
 
        ENTRY;
@@ -667,7 +671,7 @@ static int ofd_get_info(const struct lu_env *env, struct obd_export *exp,
        if (KEY_IS(KEY_FIEMAP)) {
                info = ofd_info_init(env, exp);
 
-               rc = ostid_to_fid(&info->fti_fid, &fm_key->oa.o_oi,
+               rc = ostid_to_fid(&info->fti_fid, &fm_key->lfik_oa.o_oi,
                                  ofd->ofd_lut.lut_lsd.lsd_osd_index);
                if (rc != 0)
                        RETURN(rc);
@@ -702,16 +706,9 @@ int ofd_statfs_internal(const struct lu_env *env, struct ofd_device *ofd,
        int rc = 0;
        ENTRY;
 
-       down_read(&ofd->ofd_lastid_rwsem);
-       /* Currently, for safe, we do not distinguish which LAST_ID is broken,
-        * we may do that in the future.
-        * Return -ENOSPC until the LAST_ID rebuilt. */
-       if (unlikely(ofd->ofd_lastid_rebuilding))
-               GOTO(out, rc = -ENOSPC);
-
        spin_lock(&ofd->ofd_osfs_lock);
        if (cfs_time_before_64(ofd->ofd_osfs_age, max_age) || max_age == 0) {
-               obd_size unstable;
+               u64 unstable;
 
                /* statfs data are too old, get up-to-date one.
                 * we must be cautious here since multiple threads might be
@@ -743,11 +740,11 @@ int ofd_statfs_internal(const struct lu_env *env, struct ofd_device *ofd,
                unstable = ofd->ofd_osfs_inflight - unstable;
                ofd->ofd_osfs_unstable = 0;
                if (unstable) {
-                       /* some writes completed while we were running statfs
+                       /* some writes committed while we were running statfs
                         * w/o the ofd_osfs_lock. Those ones got added to
                         * the cached statfs data that we are about to crunch.
                         * Take them into account in the new statfs data */
-                       osfs->os_bavail -= min_t(obd_size, osfs->os_bavail,
+                       osfs->os_bavail -= min_t(u64, osfs->os_bavail,
                                               unstable >> ofd->ofd_blockbits);
                        /* However, we don't really know if those writes got
                         * accounted in the statfs call, so tell
@@ -781,12 +778,9 @@ int ofd_statfs_internal(const struct lu_env *env, struct ofd_device *ofd,
                if (from_cache)
                        *from_cache = 1;
        }
-
        GOTO(out, rc);
 
 out:
-       up_read(&ofd->ofd_lastid_rwsem);
-
        return rc;
 }
 
@@ -834,7 +828,7 @@ int ofd_statfs(const struct lu_env *env,  struct obd_export *exp,
               osfs->os_bfree << ofd->ofd_blockbits,
               osfs->os_bavail << ofd->ofd_blockbits);
 
-       osfs->os_bavail -= min_t(obd_size, osfs->os_bavail,
+       osfs->os_bavail -= min_t(u64, osfs->os_bavail,
                                 ((ofd->ofd_tot_dirty + ofd->ofd_tot_pending +
                                   osfs->os_bsize - 1) >> ofd->ofd_blockbits));
 
@@ -844,7 +838,7 @@ int ofd_statfs(const struct lu_env *env,  struct obd_export *exp,
                struct filter_export_data *fed;
 
                fed = &obd->obd_self_export->exp_filter_data;
-               osfs->os_bavail -= min_t(obd_size, osfs->os_bavail,
+               osfs->os_bavail -= min_t(u64, osfs->os_bavail,
                                         fed->fed_grant >> ofd->ofd_blockbits);
        }
 
@@ -862,7 +856,8 @@ int ofd_statfs(const struct lu_env *env,  struct obd_export *exp,
        if (ofd->ofd_raid_degraded)
                osfs->os_state |= OS_STATE_DEGRADED;
 
-       if (obd->obd_self_export != exp && ofd_grant_compat(exp, ofd)) {
+       if (obd->obd_self_export != exp && !ofd_grant_param_supp(exp) &&
+           ofd->ofd_blockbits > COMPAT_BSIZE_SHIFT) {
                /* clients which don't support OBD_CONNECT_GRANT_PARAM
                 * should not see a block size > page size, otherwise
                 * cl_lost_grant goes mad. Therefore, we emulate a 4KB (=2^12)
@@ -891,21 +886,19 @@ out:
 
  * \param[in] env      execution environment
  * \param[in] exp      OBD export of OFD device
- * \param[in] oinfo    obd_info with setattr parameters
- * \param[in] oti      not used in OFD
+ * \param[in] oa       setattr parameters
  *
  * \retval             0 if successful
  * \retval             negative value on error
  */
-int ofd_echo_setattr(const struct lu_env *env, struct obd_export *exp,
-                    struct obd_info *oinfo, struct obd_trans_info *oti)
+static int ofd_echo_setattr(const struct lu_env *env, struct obd_export *exp,
+                           struct obdo *oa)
 {
        struct ofd_thread_info  *info;
        struct ofd_device       *ofd = ofd_exp(exp);
        struct ldlm_namespace   *ns = ofd->ofd_namespace;
        struct ldlm_resource    *res;
        struct ofd_object       *fo;
-       struct obdo             *oa = oinfo->oi_oa;
        struct lu_fid           *fid = &oa->o_oi.oi_fid;
        struct filter_fid       *ff = NULL;
        int                      rc = 0;
@@ -918,8 +911,7 @@ int ofd_echo_setattr(const struct lu_env *env, struct obd_export *exp,
 
        /* This would be very bad - accidentally truncating a file when
         * changing the time or similar - bug 12203. */
-       if (oa->o_valid & OBD_MD_FLSIZE &&
-           oinfo->oi_policy.l_extent.end != OBD_OBJECT_EOF) {
+       if (oa->o_valid & OBD_MD_FLSIZE) {
                static char mdsinum[48];
 
                if (oa->o_valid & OBD_MD_FLFID)
@@ -994,14 +986,12 @@ out:
 int ofd_destroy_by_fid(const struct lu_env *env, struct ofd_device *ofd,
                       const struct lu_fid *fid, int orphan)
 {
-       struct ofd_thread_info  *info = ofd_info(env);
-       struct lustre_handle     lockh;
-       __u64                    flags = LDLM_FL_AST_DISCARD_DATA;
-       __u64                    rc = 0;
-       ldlm_policy_data_t       policy = {
-                                       .l_extent = { 0, OBD_OBJECT_EOF }
-                                };
-       struct ofd_object       *fo;
+       struct ofd_thread_info *info = ofd_info(env);
+       struct lustre_handle lockh;
+       union ldlm_policy_data policy = { .l_extent = { 0, OBD_OBJECT_EOF } };
+       struct ofd_object *fo;
+       __u64 flags = LDLM_FL_AST_DISCARD_DATA;
+       __u64 rc = 0;
 
        ENTRY;
 
@@ -1039,7 +1029,6 @@ int ofd_destroy_by_fid(const struct lu_env *env, struct ofd_device *ofd,
  * \param[in] env      execution environment
  * \param[in] exp      OBD export of OFD device
  * \param[in] oa       obdo structure with FID
- * \param[in] oti      not used in OFD
  *
  * Note: this is OBD API method which is common API for server OBDs and
  * client OBDs. Thus some parameters used in client OBDs may not be used
@@ -1048,8 +1037,8 @@ int ofd_destroy_by_fid(const struct lu_env *env, struct ofd_device *ofd,
  * \retval             0 if successful
  * \retval             negative value on error
  */
-int ofd_echo_destroy(const struct lu_env *env, struct obd_export *exp,
-                    struct obdo *oa, struct obd_trans_info *oti)
+static int ofd_echo_destroy(const struct lu_env *env, struct obd_export *exp,
+                           struct obdo *oa)
 {
        struct ofd_device       *ofd = ofd_exp(exp);
        struct lu_fid           *fid = &oa->o_oi.oi_fid;
@@ -1086,8 +1075,6 @@ out:
  * \param[in]  env     execution environment
  * \param[in]  exp     OBD export of OFD device
  * \param[in]  oa      obdo structure with FID sequence to use
- * \param[out] ea      contains object ID/SEQ to return
- * \param[in]  oti     not used in OFD
  *
  * Note: this is OBD API method which is common API for server OBDs and
  * client OBDs. Thus some parameters used in client OBDs may not be used
@@ -1096,15 +1083,16 @@ out:
  * \retval             0 if successful
  * \retval             negative value on error
  */
-int ofd_echo_create(const struct lu_env *env, struct obd_export *exp,
-                   struct obdo *oa, struct obd_trans_info *oti)
+static int ofd_echo_create(const struct lu_env *env, struct obd_export *exp,
+                          struct obdo *oa)
 {
        struct ofd_device       *ofd = ofd_exp(exp);
        struct ofd_thread_info  *info;
-       obd_seq                  seq = ostid_seq(&oa->o_oi);
+       u64                      seq = ostid_seq(&oa->o_oi);
        struct ofd_seq          *oseq;
        int                      rc = 0, diff = 1;
-       obd_id                   next_id;
+       long                     granted;
+       u64                      next_id;
        int                      count;
 
        ENTRY;
@@ -1131,8 +1119,10 @@ int ofd_echo_create(const struct lu_env *env, struct obd_export *exp,
        }
 
        mutex_lock(&oseq->os_create_lock);
-       rc = ofd_grant_create(env, ofd_obd(ofd)->obd_self_export, &diff);
-       if (rc < 0) {
+       granted = ofd_grant_create(env, ofd_obd(ofd)->obd_self_export, &diff);
+       if (granted < 0) {
+               rc = granted;
+               granted = 0;
                CDEBUG(D_HA, "%s: failed to acquire grant space for "
                       "precreate (%d): rc = %d\n", ofd_name(ofd), diff, rc);
                diff = 0;
@@ -1152,7 +1142,7 @@ int ofd_echo_create(const struct lu_env *env, struct obd_export *exp,
                rc = 0;
        }
 
-       ofd_grant_commit(env, ofd_obd(ofd)->obd_self_export, rc);
+       ofd_grant_commit(ofd_obd(ofd)->obd_self_export, granted, rc);
 out:
        mutex_unlock(&oseq->os_create_lock);
        ofd_seq_put(env, oseq);
@@ -1171,18 +1161,18 @@ out_sem:
  *
  * \param[in]    env   execution environment
  * \param[in]    exp   OBD export of OFD device
- * \param[in,out] oinfo        contains FID of object to get attributes from and
+ * \param[in,out] oa   contains FID of object to get attributes from and
  *                     is used to return attributes back
  *
  * \retval             0 if successful
  * \retval             negative value on error
  */
-int ofd_echo_getattr(const struct lu_env *env, struct obd_export *exp,
-                    struct obd_info *oinfo)
+static int ofd_echo_getattr(const struct lu_env *env, struct obd_export *exp,
+                           struct obdo *oa)
 {
        struct ofd_device       *ofd = ofd_exp(exp);
        struct ofd_thread_info  *info;
-       struct lu_fid           *fid = &oinfo->oi_oa->o_oi.oi_fid;
+       struct lu_fid           *fid = &oa->o_oi.oi_fid;
        struct ofd_object       *fo;
        int                      rc = 0;
 
@@ -1196,18 +1186,18 @@ int ofd_echo_getattr(const struct lu_env *env, struct obd_export *exp,
 
        LASSERT(fo != NULL);
        rc = ofd_attr_get(env, fo, &info->fti_attr);
-       oinfo->oi_oa->o_valid = OBD_MD_FLID;
+       oa->o_valid = OBD_MD_FLID;
        if (rc == 0) {
                __u64 curr_version;
 
-               obdo_from_la(oinfo->oi_oa, &info->fti_attr,
+               obdo_from_la(oa, &info->fti_attr,
                             OFD_VALID_FLAGS | LA_UID | LA_GID);
 
                /* Store object version in reply */
                curr_version = dt_version_get(env, ofd_object_child(fo));
                if ((__s64)curr_version != -EOPNOTSUPP) {
-                       oinfo->oi_oa->o_valid |= OBD_MD_FLDATAVERSION;
-                       oinfo->oi_oa->o_data_version = curr_version;
+                       oa->o_valid |= OBD_MD_FLDATAVERSION;
+                       oa->o_data_version = curr_version;
                }
        }
 
@@ -1302,8 +1292,8 @@ out:
  * \retval             0 if successful
  * \retval             negative value on error
  */
-int ofd_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
-                 void *karg, void *uarg)
+static int ofd_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
+                        void *karg, void __user *uarg)
 {
        struct lu_env            env;
        struct ofd_device       *ofd = ofd_exp(exp);
@@ -1320,6 +1310,7 @@ int ofd_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
        switch (cmd) {
        case OBD_IOC_ABORT_RECOVERY:
                CERROR("%s: aborting recovery\n", obd->obd_name);
+               obd->obd_abort_recovery = 1;
                target_stop_recovery_thread(obd);
                break;
        case OBD_IOC_SYNC:
@@ -1380,24 +1371,14 @@ int ofd_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
  * special actions, it just invokes target_recovery_cleanup().
  *
  * \param[in] obd      OBD device of OFD
- * \param[in] stage    cleanup stage
  *
  * \retval             0
  */
-static int ofd_precleanup(struct obd_device *obd, enum obd_cleanup_stage stage)
+static int ofd_precleanup(struct obd_device *obd)
 {
-       int rc = 0;
-
        ENTRY;
-
-       switch(stage) {
-       case OBD_CLEANUP_EARLY:
-               break;
-       case OBD_CLEANUP_EXPORTS:
-               target_cleanup_recovery(obd);
-               break;
-       }
-       RETURN(rc);
+       target_cleanup_recovery(obd);
+       RETURN(0);
 }
 
 /**