return container_of(ctx, struct verbs_context, context);
}
+#define verbs_get_ctx_op(ctx, op) { \
+ struct verbs_context *vctx = verbs_get_ctx(xrcd->context); \
+ return (!vctx || \
+ (vctx->sz < sizeof(*vctx) - offsetof(struct verbs_context, op)) || \
+ !vctx->op) ? NULL : vctx; }
+
static inline struct verbs_device *verbs_get_device(
const struct ibv_device *dev)
{
*/
struct ibv_xrcd *ibv_open_xrcd(struct ibv_context *context, int fd, int oflags)
{
- struct verbs_context vctx = verbs_get_ctx(xrcd->context);
-
- if (!vctx || vctx->sz
+ struct verbs_context *vctx = verbs_get_ctx_op(context, open_xrcd);
+ return vctx ? vctx->open_xrcd(context, fd, oflags) : NULL;
}
/**
*/
int ibv_close_xrcd(struct ibv_xrcd *xrcd)
{
- struct verbs_context vctx = verbs_get_ctx(xrcd->context);
+ struct verbs_context *vctx = verbs_get_ctx(xrcd->context);
return vctx->close_xrcd(xrcd);
}