Whamcloud - gitweb
LU-7623 Update obd iocontrol methods with __user attribute
[fs/lustre-release.git] / lustre / ofd / ofd_obd.c
index ff047ca..1be25b5 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/
@@ -297,13 +297,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);
 }
@@ -333,7 +337,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)
@@ -348,15 +351,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;
 
@@ -373,8 +380,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;
@@ -407,7 +414,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);
@@ -423,6 +429,7 @@ int ofd_obd_disconnect(struct obd_export *exp)
                lu_env_fini(&env);
        }
 out:
+       nodemap_del_member(exp);
        class_export_put(exp);
        RETURN(rc);
 }
@@ -528,17 +535,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);
 }
@@ -688,13 +698,6 @@ 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) {
                u64 unstable;
@@ -729,7 +732,7 @@ 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 */
@@ -767,12 +770,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;
 }
 
@@ -877,20 +877,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] oa       setattr parameters
  *
  * \retval             0 if successful
  * \retval             negative value on error
  */
 static int ofd_echo_setattr(const struct lu_env *env, struct obd_export *exp,
-                           struct obd_info *oinfo)
+                           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;
@@ -903,8 +902,7 @@ static 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)
@@ -979,14 +977,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;
 
@@ -1086,6 +1082,7 @@ static int ofd_echo_create(const struct lu_env *env, struct obd_export *exp,
        u64                      seq = ostid_seq(&oa->o_oi);
        struct ofd_seq          *oseq;
        int                      rc = 0, diff = 1;
+       long                     granted;
        u64                      next_id;
        int                      count;
 
@@ -1113,8 +1110,10 @@ static 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;
@@ -1134,7 +1133,7 @@ static 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);
@@ -1153,18 +1152,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
  */
 static int ofd_echo_getattr(const struct lu_env *env, struct obd_export *exp,
-                           struct obd_info *oinfo)
+                           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;
 
@@ -1178,18 +1177,18 @@ static 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;
                }
        }
 
@@ -1285,7 +1284,7 @@ out:
  * \retval             negative value on error
  */
 static int ofd_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
-                        void *karg, void *uarg)
+                        void *karg, void __user *uarg)
 {
        struct lu_env            env;
        struct ofd_device       *ofd = ofd_exp(exp);
@@ -1302,6 +1301,7 @@ static 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:
@@ -1362,24 +1362,14 @@ static 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);
 }
 
 /**