Whamcloud - gitweb
LU-7623 Update obd iocontrol methods with __user attribute
[fs/lustre-release.git] / lustre / obdecho / echo_client.c
index c117b7a..e435f5d 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2014, Intel Corporation.
+ * Copyright (c) 2011, 2015, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -67,7 +67,7 @@ struct echo_device {
        struct echo_client_obd   *ed_ec;
 
        struct cl_site            ed_site_myself;
-       struct cl_site           *ed_site;
+       struct lu_site           *ed_site;
        struct lu_device         *ed_next;
        int                       ed_next_ismd;
        struct lu_client_seq     *ed_cl_seq;
@@ -230,7 +230,7 @@ struct echo_thread_info {
        struct md_attr          eti_ma;
        struct lu_name          eti_lname;
        /* per-thread values, can be re-used */
-       void                    *eti_big_lmm;
+       void                    *eti_big_lmm; /* may be vmalloc'd */
        int                     eti_big_lmmsize;
        char                    eti_name[20];
        struct lu_buf           eti_buf;
@@ -584,9 +584,6 @@ static struct lu_device_operations echo_device_lu_ops = {
 
 /** @} echo_lu_dev_ops */
 
-static struct cl_device_operations echo_device_cl_ops = {
-};
-
 /** \defgroup echo_init Setup and teardown
  *
  * Init and fini functions for echo client.
@@ -605,21 +602,23 @@ static int echo_site_init(const struct lu_env *env, struct echo_device *ed)
                 return rc;
         }
 
-        rc = lu_site_init_finish(&site->cs_lu);
-        if (rc)
-                return rc;
+       rc = lu_site_init_finish(&site->cs_lu);
+       if (rc) {
+               cl_site_fini(site);
+               return rc;
+       }
 
-        ed->ed_site = site;
-        return 0;
+       ed->ed_site = &site->cs_lu;
+       return 0;
 }
 
 static void echo_site_fini(const struct lu_env *env, struct echo_device *ed)
 {
-        if (ed->ed_site) {
-                if (!ed->ed_next_ismd)
-                        cl_site_fini(ed->ed_site);
-                ed->ed_site = NULL;
-        }
+       if (ed->ed_site) {
+               if (!ed->ed_next_ismd)
+                       lu_site_fini(ed->ed_site);
+               ed->ed_site = NULL;
+       }
 }
 
 static void *echo_thread_key_init(const struct lu_context *ctx,
@@ -841,7 +840,6 @@ static struct lu_device *echo_device_alloc(const struct lu_env *env,
                 GOTO(out, rc);
 
         cd->cd_lu_dev.ld_ops = &echo_device_lu_ops;
-        cd->cd_ops = &echo_device_cl_ops;
 
         cleanup = 2;
         obd = class_name2obd(lustre_cfg_string(cfg, 0));
@@ -918,11 +916,10 @@ static struct lu_device *echo_device_alloc(const struct lu_env *env,
                         GOTO(out, rc = -EINVAL);
                 }
 
-                next = ld;
-                /* For MD echo client, it will use the site in MDS stack */
-                ed->ed_site_myself.cs_lu = *ls;
-                ed->ed_site = &ed->ed_site_myself;
-                ed->ed_cl.cd_lu_dev.ld_site = &ed->ed_site_myself.cs_lu;
+               next = ld;
+               /* For MD echo client, it will use the site in MDS stack */
+               ed->ed_site = ls;
+               ed->ed_cl.cd_lu_dev.ld_site = ls;
                rc = echo_fid_init(ed, obd->obd_name, lu_site2seq(ls));
                if (rc) {
                        CERROR("echo fid init error %d\n", rc);
@@ -955,7 +952,7 @@ static struct lu_device *echo_device_alloc(const struct lu_env *env,
                         if (next->ld_site != NULL)
                                 GOTO(out, rc = -EBUSY);
 
-                        next->ld_site = &ed->ed_site->cs_lu;
+                        next->ld_site = ed->ed_site;
                         rc = next->ld_type->ldt_ops->ldto_device_init(env, next,
                                                      next->ld_type->ldt_name,
                                                      NULL);
@@ -1028,7 +1025,7 @@ static struct lu_device *echo_device_free(const struct lu_env *env,
         CDEBUG(D_INFO, "echo device:%p is going to be freed, next = %p\n",
                ed, next);
 
-        lu_site_purge(env, &ed->ed_site->cs_lu, -1);
+       lu_site_purge(env, ed->ed_site, -1);
 
         /* check if there are objects still alive.
          * It shouldn't have any object because lu_site_purge would cleanup
@@ -1041,7 +1038,7 @@ static struct lu_device *echo_device_free(const struct lu_env *env,
        spin_unlock(&ec->ec_lock);
 
        /* purge again */
-       lu_site_purge(env, &ed->ed_site->cs_lu, -1);
+       lu_site_purge(env, ed->ed_site, -1);
 
        CDEBUG(D_INFO,
               "Waiting for the reference of echo object to be dropped\n");
@@ -1054,7 +1051,7 @@ static struct lu_device *echo_device_free(const struct lu_env *env,
                       "wait for 1 second\n");
                set_current_state(TASK_UNINTERRUPTIBLE);
                schedule_timeout(cfs_time_seconds(1));
-               lu_site_purge(env, &ed->ed_site->cs_lu, -1);
+               lu_site_purge(env, ed->ed_site, -1);
                spin_lock(&ec->ec_lock);
        }
        spin_unlock(&ec->ec_lock);
@@ -1071,7 +1068,7 @@ static struct lu_device *echo_device_free(const struct lu_env *env,
        while (next && !ed->ed_next_ismd)
                next = next->ld_type->ldt_ops->ldto_device_free(env, next);
 
-        LASSERT(ed->ed_site == lu2cl_site(d->ld_site));
+        LASSERT(ed->ed_site == d->ld_site);
         echo_site_fini(env, ed);
         cl_device_fini(&ed->ed_cl);
         OBD_FREE_PTR(ed);
@@ -1118,7 +1115,7 @@ cl_echo_object_find(struct echo_device *d, const struct ost_id *oi)
        struct cl_object *obj;
        struct lov_oinfo *oinfo = NULL;
        struct lu_fid *fid;
-       int refcheck;
+       __u16  refcheck;
        int rc;
        ENTRY;
 
@@ -1178,7 +1175,7 @@ static int cl_echo_object_put(struct echo_object *eco)
 {
         struct lu_env *env;
         struct cl_object *obj = echo_obj2cl(eco);
-        int refcheck;
+       __u16  refcheck;
         ENTRY;
 
         env = cl_env_get(&refcheck);
@@ -1298,9 +1295,9 @@ static int cl_echo_object_brw(struct echo_object *eco, int rw, u64 offset,
         struct cl_page          *clp;
         struct lustre_handle    lh = { 0 };
         int page_size = cl_page_size(obj);
-        int refcheck;
         int rc;
         int i;
+       __u16 refcheck;
         ENTRY;
 
        LASSERT((offset & ~PAGE_MASK) == 0);
@@ -2063,7 +2060,7 @@ static int echo_md_handler(struct echo_device *ed, int command,
        struct echo_thread_info *info;
         struct lu_device      *ld = ed->ed_next;
         struct lu_env         *env;
-        int                    refcheck;
+       __u16                  refcheck;
         struct lu_object      *parent;
         char                  *name = NULL;
         int                    namelen = data->ioc_plen2;
@@ -2358,27 +2355,27 @@ static int echo_client_kbrw(struct echo_device *ed, int rw, struct obdo *oa,
                 RETURN(-ENOMEM);
         }
 
-        for (i = 0, pgp = pga, off = offset;
-             i < npages;
+       for (i = 0, pgp = pga, off = offset;
+            i < npages;
             i++, pgp++, off += PAGE_CACHE_SIZE) {
 
-                LASSERT (pgp->pg == NULL);      /* for cleanup */
+               LASSERT(pgp->pg == NULL);       /* for cleanup */
 
-                rc = -ENOMEM;
-                OBD_PAGE_ALLOC(pgp->pg, gfp_mask);
-                if (pgp->pg == NULL)
-                        goto out;
+               rc = -ENOMEM;
+               pgp->pg = alloc_page(gfp_mask);
+               if (pgp->pg == NULL)
+                       goto out;
 
-                pages[i] = pgp->pg;
+               pages[i] = pgp->pg;
                pgp->count = PAGE_CACHE_SIZE;
-                pgp->off = off;
-                pgp->flag = brw_flags;
+               pgp->off = off;
+               pgp->flag = brw_flags;
 
                if (verify)
                        echo_client_page_debug_setup(pgp->pg, rw,
                                                     ostid_id(&oa->o_oi), off,
                                                     pgp->count);
-        }
+       }
 
         /* brw mode can only be used at client */
         LASSERT(ed->ed_next != NULL);
@@ -2400,7 +2397,7 @@ static int echo_client_kbrw(struct echo_device *ed, int rw, struct obdo *oa,
                        if (vrc != 0 && rc == 0)
                                rc = vrc;
                }
-               OBD_PAGE_FREE(pgp->pg);
+               __free_page(pgp->pg);
         }
         OBD_FREE(pga, npages * sizeof(*pga));
         OBD_FREE(pages, npages * sizeof(*pages));
@@ -2558,7 +2555,7 @@ static int echo_client_brw_ioctl(const struct lu_env *env, int rw,
 
 static int
 echo_client_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
-                      void *karg, void *uarg)
+                     void *karg, void __user *uarg)
 {
 #ifdef HAVE_SERVER_SUPPORT
        struct tgt_session_info *tsi;
@@ -2647,7 +2644,7 @@ echo_client_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
        }
         case OBD_IOC_ECHO_ALLOC_SEQ: {
                 struct lu_env   *cl_env;
-                int              refcheck;
+               __u16            refcheck;
                 __u64            seq;
                 int              max_count;
 
@@ -2891,27 +2888,6 @@ static struct obd_ops echo_client_obd_ops = {
         .o_disconnect  = echo_client_disconnect
 };
 
-static int echo_client_init(void)
-{
-        int rc;
-
-       rc = lu_kmem_init(echo_caches);
-       if (rc == 0) {
-               rc = class_register_type(&echo_client_obd_ops, NULL, true, NULL,
-                                        LUSTRE_ECHO_CLIENT_NAME,
-                                        &echo_device_type);
-               if (rc)
-                       lu_kmem_fini(echo_caches);
-       }
-       return rc;
-}
-
-static void echo_client_exit(void)
-{
-        class_unregister_type(LUSTRE_ECHO_CLIENT_NAME);
-        lu_kmem_fini(echo_caches);
-}
-
 static int __init obdecho_init(void)
 {
         int rc;
@@ -2932,7 +2908,14 @@ static int __init obdecho_init(void)
                goto failed_1;
 # endif
 
-        rc = echo_client_init();
+       rc = lu_kmem_init(echo_caches);
+       if (rc == 0) {
+               rc = class_register_type(&echo_client_obd_ops, NULL, true, NULL,
+                                        LUSTRE_ECHO_CLIENT_NAME,
+                                        &echo_device_type);
+               if (rc)
+                       lu_kmem_fini(echo_caches);
+       }
 
 # ifdef HAVE_SERVER_SUPPORT
         if (rc == 0)
@@ -2946,18 +2929,19 @@ failed_0:
         RETURN(rc);
 }
 
-static void /*__exit*/ obdecho_exit(void)
+static void __exit obdecho_exit(void)
 {
-        echo_client_exit();
+       class_unregister_type(LUSTRE_ECHO_CLIENT_NAME);
+       lu_kmem_fini(echo_caches);
 
-# ifdef HAVE_SERVER_SUPPORT
-        class_unregister_type(LUSTRE_ECHO_NAME);
-        echo_persistent_pages_fini();
-# endif
+#ifdef HAVE_SERVER_SUPPORT
+       class_unregister_type(LUSTRE_ECHO_NAME);
+       echo_persistent_pages_fini();
+#endif
 }
 
-MODULE_AUTHOR("Sun Microsystems, Inc. <http://www.lustre.org/>");
-MODULE_DESCRIPTION("Lustre Testing Echo OBD driver");
+MODULE_AUTHOR("OpenSFS, Inc. <http://www.lustre.org/>");
+MODULE_DESCRIPTION("Lustre Echo Client test driver");
 MODULE_VERSION(LUSTRE_VERSION_STRING);
 MODULE_LICENSE("GPL");