(ptlrpc_is_bulk_desc_kvec(type) &&
ops->add_iov_frag != NULL));
+ OBD_ALLOC_PTR(desc);
+ if (desc == NULL)
+ return NULL;
if (type & PTLRPC_BULK_BUF_KIOV) {
- OBD_ALLOC(desc,
- offsetof(struct ptlrpc_bulk_desc,
- bd_u.bd_kiov.bd_vec[nfrags]));
+ OBD_ALLOC_LARGE(GET_KIOV(desc),
+ nfrags * sizeof(*GET_KIOV(desc)));
+ if (GET_KIOV(desc) == NULL)
+ goto out;
} else {
- OBD_ALLOC(desc,
- offsetof(struct ptlrpc_bulk_desc,
- bd_u.bd_kvec.bd_kvec[nfrags]));
+ OBD_ALLOC_LARGE(GET_KVEC(desc),
+ nfrags * sizeof(*GET_KVEC(desc)));
+ if (GET_KVEC(desc) == NULL)
+ goto out;
}
- if (!desc)
- return NULL;
-
spin_lock_init(&desc->bd_lock);
init_waitqueue_head(&desc->bd_waitq);
desc->bd_max_iov = nfrags;
LNetInvalidateHandle(&desc->bd_mds[i]);
return desc;
+out:
+ OBD_FREE_PTR(desc);
+ return NULL;
}
/**
desc->bd_frag_ops->release_frags(desc);
if (ptlrpc_is_bulk_desc_kiov(desc->bd_type))
- OBD_FREE(desc, offsetof(struct ptlrpc_bulk_desc,
- bd_u.bd_kiov.bd_vec[desc->bd_max_iov]));
+ OBD_FREE_LARGE(GET_KIOV(desc),
+ desc->bd_max_iov * sizeof(*GET_KIOV(desc)));
else
- OBD_FREE(desc, offsetof(struct ptlrpc_bulk_desc,
- bd_u.bd_kvec.bd_kvec[desc->
- bd_max_iov]));
-
+ OBD_FREE_LARGE(GET_KVEC(desc),
+ desc->bd_max_iov * sizeof(*GET_KVEC(desc)));
+ OBD_FREE_PTR(desc);
EXIT;
}
EXPORT_SYMBOL(ptlrpc_free_bulk);
if (!msg) {
ptlrpc_request_cache_free(req);
return i;
- }
- req->rq_reqbuf = msg;
- req->rq_reqbuf_len = size;
- req->rq_pool = pool;
+ }
+ req->rq_reqbuf = msg;
+ req->rq_reqbuf_len = size;
+ req->rq_pool = pool;
spin_lock(&pool->prp_lock);
list_add_tail(&req->rq_list, &pool->prp_req_list);
}
__u64 old_mbits = req->rq_mbits;
if ((bd->bd_import->imp_connect_data.ocd_connect_flags &
- OBD_CONNECT_BULK_MBITS) != 0)
+ OBD_CONNECT_BULK_MBITS) != 0) {
req->rq_mbits = ptlrpc_next_xid();
- else /* old version transfers rq_xid to peer as matchbits */
- req->rq_mbits = req->rq_xid = ptlrpc_next_xid();
-
+ } else {/* old version transfers rq_xid to peer as matchbits */
+ spin_lock(&req->rq_import->imp_lock);
+ list_del_init(&req->rq_unreplied_list);
+ ptlrpc_assign_next_xid_nolock(req);
+ req->rq_mbits = req->rq_xid;
+ spin_unlock(&req->rq_import->imp_lock);
+ }
CDEBUG(D_HA, "resend bulk old x"LPU64" new x"LPU64"\n",
old_mbits, req->rq_mbits);
}