/** * Create a "free floating" memory descriptor - a MD that is not associated * with a ME. Such MDs are usually used in LNetPut() and LNetGet() operations. * * \param umd,unlink See the discussion for LNetMDAttach(). * \param handle On successful returns, a handle to the newly created MD is * saved here. This handle can be used later in LNetMDUnlink(), LNetPut(), * and LNetGet() operations. * * \retval 0 On success. * \retval -EINVAL If \a umd is not valid. * \retval -ENOMEM If new MD cannot be allocated. * \retval -ENOENT \a umd.eq_handle does not point to a valid EQ. Note that * it's OK to supply a NULL \a umd.eq_handle by calling * LNetInvalidateHandle() on it. */ int LNetMDBind(struct lnet_md umd, enum lnet_unlink unlink, struct lnet_handle_md *handle) { struct lnet_libmd *md; int cpt; int rc; LASSERT(the_lnet.ln_refcount > 0); if (lnet_md_validate(&umd)) return -EINVAL; if ((umd.options & (LNET_MD_OP_GET | LNET_MD_OP_PUT))) { CERROR("Invalid option: GET|PUT illegal on active MDs\n"); return -EINVAL; } md = lnet_md_alloc(&umd); if (!md) return -ENOMEM; rc = lnet_md_build(md, &umd, unlink); if (rc) goto out_free; cpt = lnet_res_lock_current(); rc = lnet_md_link(md, umd.eq_handle, cpt); if (rc) goto out_unlock; lnet_md2handle(handle, md); lnet_res_unlock(cpt); return 0; out_unlock: lnet_res_unlock(cpt); out_free: lnet_md_free(md); return rc; }
/** * Create a "free floating" memory descriptor - a MD that is not associated * with a ME. Such MDs are usually used in LNetPut() and LNetGet() operations. * * \param umd,unlink See the discussion for LNetMDAttach(). * \param handle On successful returns, a handle to the newly created MD is * saved here. This handle can be used later in LNetMDUnlink(), LNetPut(), * and LNetGet() operations. * * \retval 0 On success. * \retval -EINVAL If \a umd is not valid. * \retval -ENOMEM If new MD cannot be allocated. * \retval -ENOENT \a umd.eq_handle does not point to a valid EQ. Note that * it's OK to supply a NULL \a umd.eq_handle by calling * LNetInvalidateHandle() on it. */ int LNetMDBind(lnet_md_t umd, lnet_unlink_t unlink, lnet_handle_md_t *handle) { lnet_libmd_t *md; int cpt; int rc; LASSERT (the_lnet.ln_init); LASSERT (the_lnet.ln_refcount > 0); 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; rc = lnet_md_build(md, &umd, unlink); cpt = lnet_res_lock_current(); if (rc != 0) goto failed; rc = lnet_md_link(md, umd.eq_handle, cpt); if (rc != 0) goto failed; lnet_md2handle(handle, md); lnet_res_unlock(cpt); return 0; failed: lnet_md_free_locked(md); lnet_res_unlock(cpt); return rc; }