X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lnet%2Flnet%2Flib-md.c;h=7cfce404152b388c20259d625c7c3c9627269462;hb=e8ad5c163bfe4085a3132872374bc50b38cb9564;hp=6c988f21c2a2977a2455369a28c109f66ec0264d;hpb=2c2100329b3a57ee8fc3dff9e7cef18768a6f788;p=fs%2Flustre-release.git diff --git a/lnet/lnet/lib-md.c b/lnet/lnet/lib-md.c index 6c988f2..7cfce40 100644 --- a/lnet/lnet/lib-md.c +++ b/lnet/lnet/lib-md.c @@ -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)