X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lnet%2Flnet%2Flib-md.c;h=7cfce404152b388c20259d625c7c3c9627269462;hb=e8ad5c163bfe4085a3132872374bc50b38cb9564;hp=228f7d6ec0cc4f5d2d7635346e49cc88fbef40de;hpb=70e80ade90af09300396706b8910e196a7928520;p=fs%2Flustre-release.git diff --git a/lnet/lnet/lib-md.c b/lnet/lnet/lib-md.c index 228f7d6..7cfce40 100644 --- a/lnet/lnet/lib-md.c +++ b/lnet/lnet/lib-md.c @@ -16,8 +16,8 @@ * 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 @@ -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,7 +77,8 @@ lnet_md_unlink(lnet_libmd_t *md) LASSERT (md->md_eq->eq_refcount >= 0); } - list_del (&md->md_list); + LASSERT (!cfs_list_empty(&md->md_list)); + cfs_list_del_init (&md->md_list); lnet_md_free(md); } @@ -95,7 +96,7 @@ lib_md_build(lnet_libmd_t *lmd, lnet_md_t *umd, int unlink) * otherwise caller may only lnet_md_free() it. */ - if (!LNetHandleIsEqual (umd->eq_handle, LNET_EQ_NONE)) { + if (!LNetHandleIsInvalid (umd->eq_handle)) { eq = lnet_handle2eq(&umd->eq_handle); if (eq == NULL) return -ENOENT; @@ -130,7 +131,7 @@ lib_md_build(lnet_libmd_t *lmd, lnet_md_t *umd, int unlink) memcpy(lmd->md_iov.iov, umd->start, niov * sizeof (lmd->md_iov.iov[0])); - for (i = 0; i < niov; i++) { + for (i = 0; i < (int)niov; i++) { /* We take the base address on trust */ if (lmd->md_iov.iov[i].iov_len <= 0) /* invalid length */ return -EINVAL; @@ -153,7 +154,7 @@ lib_md_build(lnet_libmd_t *lmd, lnet_md_t *umd, int unlink) memcpy(lmd->md_iov.kiov, umd->start, niov * sizeof (lmd->md_iov.kiov[0])); - for (i = 0; i < niov; i++) { + for (i = 0; i < (int)niov; i++) { /* We take the page pointer on trust */ if (lmd->md_iov.kiov[i].kiov_offset + lmd->md_iov.kiov[i].kiov_len > CFS_PAGE_SIZE ) @@ -177,7 +178,7 @@ lib_md_build(lnet_libmd_t *lmd, lnet_md_t *umd, int unlink) if ((umd->options & LNET_MD_MAX_SIZE) != 0 && /* max size used */ (umd->max_size < 0 || - umd->max_size > umd->length)) // illegal max_size + umd->max_size > (int)umd->length)) // illegal max_size return -EINVAL; } @@ -186,7 +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); - 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; } @@ -211,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) { @@ -220,11 +240,15 @@ 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) { + CERROR("Invalid option: no MD_OP set\n"); + return -EINVAL; + } + md = lnet_md_alloc(&umd); if (md == NULL) return -ENOMEM; @@ -239,6 +263,8 @@ LNetMDAttach(lnet_handle_me_t meh, lnet_md_t umd, } 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; @@ -266,11 +292,15 @@ 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) { + CERROR("Invalid option: GET|PUT illegal on active MDs\n"); + return -EINVAL; + } + md = lnet_md_alloc(&umd); if (md == NULL) return -ENOMEM;