- rc = PtlMEAttach(bulk->b_connection->c_peer.peer_ni, bulk->b_portal,
- local_id, bulk->b_xid, 0, PTL_UNLINK, PTL_INS_AFTER,
- &bulk->b_me_h);
+ iov = ptlrpc_get_bulk_iov (desc);
+ if (iov == NULL)
+ return (-ENOMEM);
+
+ desc->bd_md.start = iov;
+ desc->bd_md.niov = 0;
+ desc->bd_md.length = 0;
+ desc->bd_md.threshold = 1;
+ desc->bd_md.options = PTL_MD_OP_PUT | PTL_MD_IOV;
+ desc->bd_md.user_ptr = desc;
+ desc->bd_md.eventq = bulk_sink_eq;
+
+ list_for_each_safe(tmp, next, &desc->bd_page_list) {
+ struct ptlrpc_bulk_page *bulk;
+ bulk = list_entry(tmp, struct ptlrpc_bulk_page, bp_link);
+
+ LASSERT (desc->bd_md.niov < desc->bd_page_count);
+
+ if (desc->bd_md.niov == 0)
+ xid = bulk->bp_xid;
+ LASSERT (xid == bulk->bp_xid); /* should all be the same */
+
+ iov[desc->bd_md.niov].iov_base = bulk->bp_buf;
+ iov[desc->bd_md.niov].iov_len = bulk->bp_buflen;
+ desc->bd_md.niov++;
+ desc->bd_md.length += bulk->bp_buflen;
+ }
+
+ LASSERT (desc->bd_md.niov == desc->bd_page_count);
+ LASSERT (desc->bd_md.niov != 0);
+
+ source_id.nid = desc->bd_connection->c_peer.peer_nid;
+ source_id.pid = PTL_PID_ANY;
+
+ rc = PtlMEAttach(desc->bd_connection->c_peer.peer_ni,
+ desc->bd_portal, source_id, xid, 0,
+ PTL_UNLINK, PTL_INS_AFTER, &desc->bd_me_h);
+
+ ptlrpc_put_bulk_iov (desc, iov);
+