diff options
author | Sean Hefty <sean.hefty@intel.com> | 2013-05-29 13:09:32 -0400 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2013-06-21 02:35:44 -0400 |
commit | 209cf2a751f9ff2a516102339e54fcac0176fa78 (patch) | |
tree | 0af9e0cde64256311f60986cd55463af44bfcf57 /drivers/infiniband | |
parent | eebe4c3a62aadb64ba30bde97b96d656e369d934 (diff) |
RDMA/ucma: Allow user space to pass AF_IB into resolve
Allow user space applications to call resolve_addr using AF_IB. To
support sockaddr_ib, we need to define a new structure capable of
handling the larger address size.
Signed-off-by: Sean Hefty <sean.hefty@intel.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/core/ucma.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/drivers/infiniband/core/ucma.c b/drivers/infiniband/core/ucma.c index 22ed97ef7da3..00ce99044a48 100644 --- a/drivers/infiniband/core/ucma.c +++ b/drivers/infiniband/core/ucma.c | |||
@@ -577,6 +577,33 @@ static ssize_t ucma_resolve_ip(struct ucma_file *file, | |||
577 | return ret; | 577 | return ret; |
578 | } | 578 | } |
579 | 579 | ||
580 | static ssize_t ucma_resolve_addr(struct ucma_file *file, | ||
581 | const char __user *inbuf, | ||
582 | int in_len, int out_len) | ||
583 | { | ||
584 | struct rdma_ucm_resolve_addr cmd; | ||
585 | struct sockaddr *src, *dst; | ||
586 | struct ucma_context *ctx; | ||
587 | int ret; | ||
588 | |||
589 | if (copy_from_user(&cmd, inbuf, sizeof(cmd))) | ||
590 | return -EFAULT; | ||
591 | |||
592 | src = (struct sockaddr *) &cmd.src_addr; | ||
593 | dst = (struct sockaddr *) &cmd.dst_addr; | ||
594 | if (cmd.reserved || (cmd.src_size && (cmd.src_size != rdma_addr_size(src))) || | ||
595 | !cmd.dst_size || (cmd.dst_size != rdma_addr_size(dst))) | ||
596 | return -EINVAL; | ||
597 | |||
598 | ctx = ucma_get_ctx(file, cmd.id); | ||
599 | if (IS_ERR(ctx)) | ||
600 | return PTR_ERR(ctx); | ||
601 | |||
602 | ret = rdma_resolve_addr(ctx->cm_id, src, dst, cmd.timeout_ms); | ||
603 | ucma_put_ctx(ctx); | ||
604 | return ret; | ||
605 | } | ||
606 | |||
580 | static ssize_t ucma_resolve_route(struct ucma_file *file, | 607 | static ssize_t ucma_resolve_route(struct ucma_file *file, |
581 | const char __user *inbuf, | 608 | const char __user *inbuf, |
582 | int in_len, int out_len) | 609 | int in_len, int out_len) |
@@ -1423,7 +1450,8 @@ static ssize_t (*ucma_cmd_table[])(struct ucma_file *file, | |||
1423 | [RDMA_USER_CM_CMD_LEAVE_MCAST] = ucma_leave_multicast, | 1450 | [RDMA_USER_CM_CMD_LEAVE_MCAST] = ucma_leave_multicast, |
1424 | [RDMA_USER_CM_CMD_MIGRATE_ID] = ucma_migrate_id, | 1451 | [RDMA_USER_CM_CMD_MIGRATE_ID] = ucma_migrate_id, |
1425 | [RDMA_USER_CM_CMD_QUERY] = ucma_query, | 1452 | [RDMA_USER_CM_CMD_QUERY] = ucma_query, |
1426 | [RDMA_USER_CM_CMD_BIND] = ucma_bind | 1453 | [RDMA_USER_CM_CMD_BIND] = ucma_bind, |
1454 | [RDMA_USER_CM_CMD_RESOLVE_ADDR] = ucma_resolve_addr | ||
1427 | }; | 1455 | }; |
1428 | 1456 | ||
1429 | static ssize_t ucma_write(struct file *filp, const char __user *buf, | 1457 | static ssize_t ucma_write(struct file *filp, const char __user *buf, |