* in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see [sun.com URL with a
- * copy of GPLv2].
+ * version 2 along with this program; If not, see
+ * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
LASSERT (md->md_eq->eq_refcount >= 0);
}
- list_del (&md->md_list);
+ LASSERT (!list_empty(&md->md_list));
+ list_del_init (&md->md_list);
lnet_md_free(md);
}
/* 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);
return 0;
}
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)
{
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)
} else {
rc = lib_md_build(md, &umd, unlink);
if (rc == 0) {
+ the_lnet.ln_portals[me->me_portal].ptl_ml_version++;
+
me->me_md = md;
md->md_me = me;
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)