X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lnet%2Flnet%2Flib-md.c;h=6c988f21c2a2977a2455369a28c109f66ec0264d;hb=6f695370c5d5a37f05c5bcc6e73649e3b7d40d36;hp=ecd8f0734e251ca521f3486851193746e2e98854;hpb=85f59695534ddd167fa491c091ed64b1504cdaf7;p=fs%2Flustre-release.git diff --git a/lnet/lnet/lib-md.c b/lnet/lnet/lib-md.c index ecd8f07..6c988f2 100644 --- a/lnet/lnet/lib-md.c +++ b/lnet/lnet/lib-md.c @@ -1,25 +1,41 @@ /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=8:tabstop=8: * - * lib/lib-md.c - * Memory Descriptor management routines + * GPL HEADER START + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * - * Copyright (c) 2001-2003 Cluster File Systems, Inc. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. * - * This file is part of Lustre, http://www.lustre.org + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). * - * Lustre is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf * - * Lustre is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. * - * You should have received a copy of the GNU General Public License - * along with Lustre; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * GPL HEADER END + */ +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Use is subject to license terms. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. + * + * lnet/lnet/lib-md.c + * + * Memory Descriptor management routines */ #define DEBUG_SUBSYSTEM S_LNET @@ -61,7 +77,8 @@ lnet_md_unlink(lnet_libmd_t *md) 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); } @@ -79,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; @@ -114,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; @@ -137,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 ) @@ -161,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; } @@ -170,6 +187,7 @@ 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); return 0; @@ -204,11 +222,14 @@ 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 */ return -EINVAL; + if ((umd.options & (LNET_MD_OP_GET | LNET_MD_OP_PUT)) == 0) + return -EINVAL; + md = lnet_md_alloc(&umd); if (md == NULL) return -ENOMEM; @@ -223,6 +244,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; @@ -250,11 +273,14 @@ 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 */ return -EINVAL; + if ((umd.options & (LNET_MD_OP_GET | LNET_MD_OP_PUT)) != 0) + return -EINVAL; + md = lnet_md_alloc(&umd); if (md == NULL) return -ENOMEM; @@ -284,7 +310,7 @@ LNetMDUnlink (lnet_handle_md_t mdh) LASSERT (the_lnet.ln_init); LASSERT (the_lnet.ln_refcount > 0); - + LNET_LOCK(); md = lnet_handle2md(&mdh); @@ -299,14 +325,7 @@ LNetMDUnlink (lnet_handle_md_t mdh) if (md->md_eq != NULL && md->md_refcount == 0) { - memset(&ev, 0, sizeof(ev)); - - ev.type = LNET_EVENT_UNLINK; - ev.status = 0; - ev.unlinked = 1; - lnet_md_deconstruct(md, &ev.md); - lnet_md2handle(&ev.md_handle, md); - + lnet_build_unlink_event(md, &ev); lnet_enq_event_locked(md->md_eq, &ev); } @@ -315,4 +334,3 @@ LNetMDUnlink (lnet_handle_md_t mdh) LNET_UNLOCK(); return 0; } -