Whamcloud - gitweb
b21619 hash ME on RDMA portal i=isaac i=maxim
[fs/lustre-release.git] / lnet / lnet / lib-md.c
index 6c988f2..7cfce40 100644 (file)
@@ -26,7 +26,7 @@
  * GPL HEADER END
  */
 /*
- * Copyright  2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  */
 /*
@@ -77,8 +77,8 @@ lnet_md_unlink(lnet_libmd_t *md)
                 LASSERT (md->md_eq->eq_refcount >= 0);
         }
 
-        LASSERT (!list_empty(&md->md_list));
-        list_del_init (&md->md_list);
+        LASSERT (!cfs_list_empty(&md->md_list));
+        cfs_list_del_init (&md->md_list);
         lnet_md_free(md);
 }
 
@@ -187,8 +187,8 @@ lib_md_build(lnet_libmd_t *lmd, lnet_md_t *umd, int unlink)
 
         /* It's good; let handle2md succeed and add to active mds */
         lnet_initialise_handle (&lmd->md_lh, LNET_COOKIE_TYPE_MD);
-        LASSERT (list_empty(&lmd->md_list));
-        list_add (&lmd->md_list, &the_lnet.ln_active_mds);
+        LASSERT (cfs_list_empty(&lmd->md_list));
+        cfs_list_add (&lmd->md_list, &the_lnet.ln_active_mds);
 
         return 0;
 }
@@ -213,6 +213,24 @@ lnet_md_deconstruct(lnet_libmd_t *lmd, lnet_md_t *umd)
 }
 
 int
+lnet_md_validate(lnet_md_t *umd)
+{
+        if (umd->start == NULL) {
+                CERROR("MD start pointer can not be NULL\n");
+                return -EINVAL;
+        }
+
+        if ((umd->options & (LNET_MD_KIOV | LNET_MD_IOVEC)) != 0 &&
+            umd->length > LNET_MAX_IOV) {
+                CERROR("Invalid option: too many fragments %u, %d max\n",
+                       umd->length, LNET_MAX_IOV);
+                return -EINVAL;
+        }
+
+        return 0;
+}
+
+int
 LNetMDAttach(lnet_handle_me_t meh, lnet_md_t umd,
              lnet_unlink_t unlink, lnet_handle_md_t *handle)
 {
@@ -223,12 +241,13 @@ LNetMDAttach(lnet_handle_me_t meh, lnet_md_t umd,
         LASSERT (the_lnet.ln_init);
         LASSERT (the_lnet.ln_refcount > 0);
 
-        if ((umd.options & (LNET_MD_KIOV | LNET_MD_IOVEC)) != 0 &&
-            umd.length > LNET_MAX_IOV) /* too many fragments */
+        if (lnet_md_validate(&umd) != 0)
                 return -EINVAL;
 
-        if ((umd.options & (LNET_MD_OP_GET | LNET_MD_OP_PUT)) == 0)
+        if ((umd.options & (LNET_MD_OP_GET | LNET_MD_OP_PUT)) == 0) {
+                CERROR("Invalid option: no MD_OP set\n");
                 return -EINVAL;
+        }
 
         md = lnet_md_alloc(&umd);
         if (md == NULL)
@@ -274,12 +293,13 @@ LNetMDBind(lnet_md_t umd, lnet_unlink_t unlink, lnet_handle_md_t *handle)
         LASSERT (the_lnet.ln_init);
         LASSERT (the_lnet.ln_refcount > 0);
 
-        if ((umd.options & (LNET_MD_KIOV | LNET_MD_IOVEC)) != 0 &&
-            umd.length > LNET_MAX_IOV) /* too many fragments */
+        if (lnet_md_validate(&umd) != 0)
                 return -EINVAL;
 
-        if ((umd.options & (LNET_MD_OP_GET | LNET_MD_OP_PUT)) != 0)
+        if ((umd.options & (LNET_MD_OP_GET | LNET_MD_OP_PUT)) != 0) {
+                CERROR("Invalid option: GET|PUT illegal on active MDs\n");
                 return -EINVAL;
+        }
 
         md = lnet_md_alloc(&umd);
         if (md == NULL)