diff options
Diffstat (limited to 'net/rds/rdma.c')
-rw-r--r-- | net/rds/rdma.c | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/net/rds/rdma.c b/net/rds/rdma.c index 8dc83d2caa58..4c64daa1f5d5 100644 --- a/net/rds/rdma.c +++ b/net/rds/rdma.c | |||
@@ -317,6 +317,30 @@ int rds_get_mr(struct rds_sock *rs, char __user *optval, int optlen) | |||
317 | return __rds_rdma_map(rs, &args, NULL, NULL); | 317 | return __rds_rdma_map(rs, &args, NULL, NULL); |
318 | } | 318 | } |
319 | 319 | ||
320 | int rds_get_mr_for_dest(struct rds_sock *rs, char __user *optval, int optlen) | ||
321 | { | ||
322 | struct rds_get_mr_for_dest_args args; | ||
323 | struct rds_get_mr_args new_args; | ||
324 | |||
325 | if (optlen != sizeof(struct rds_get_mr_for_dest_args)) | ||
326 | return -EINVAL; | ||
327 | |||
328 | if (copy_from_user(&args, (struct rds_get_mr_for_dest_args __user *)optval, | ||
329 | sizeof(struct rds_get_mr_for_dest_args))) | ||
330 | return -EFAULT; | ||
331 | |||
332 | /* | ||
333 | * Initially, just behave like get_mr(). | ||
334 | * TODO: Implement get_mr as wrapper around this | ||
335 | * and deprecate it. | ||
336 | */ | ||
337 | new_args.vec = args.vec; | ||
338 | new_args.cookie_addr = args.cookie_addr; | ||
339 | new_args.flags = args.flags; | ||
340 | |||
341 | return __rds_rdma_map(rs, &new_args, NULL, NULL); | ||
342 | } | ||
343 | |||
320 | /* | 344 | /* |
321 | * Free the MR indicated by the given R_Key | 345 | * Free the MR indicated by the given R_Key |
322 | */ | 346 | */ |
@@ -607,8 +631,8 @@ int rds_cmsg_rdma_args(struct rds_sock *rs, struct rds_message *rm, | |||
607 | { | 631 | { |
608 | struct rds_rdma_op *op; | 632 | struct rds_rdma_op *op; |
609 | 633 | ||
610 | if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct rds_rdma_args)) | 634 | if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct rds_rdma_args)) || |
611 | || rm->m_rdma_op != NULL) | 635 | rm->m_rdma_op != NULL) |
612 | return -EINVAL; | 636 | return -EINVAL; |
613 | 637 | ||
614 | op = rds_rdma_prepare(rs, CMSG_DATA(cmsg)); | 638 | op = rds_rdma_prepare(rs, CMSG_DATA(cmsg)); |
@@ -631,8 +655,8 @@ int rds_cmsg_rdma_dest(struct rds_sock *rs, struct rds_message *rm, | |||
631 | u32 r_key; | 655 | u32 r_key; |
632 | int err = 0; | 656 | int err = 0; |
633 | 657 | ||
634 | if (cmsg->cmsg_len < CMSG_LEN(sizeof(rds_rdma_cookie_t)) | 658 | if (cmsg->cmsg_len < CMSG_LEN(sizeof(rds_rdma_cookie_t)) || |
635 | || rm->m_rdma_cookie != 0) | 659 | rm->m_rdma_cookie != 0) |
636 | return -EINVAL; | 660 | return -EINVAL; |
637 | 661 | ||
638 | memcpy(&rm->m_rdma_cookie, CMSG_DATA(cmsg), sizeof(rm->m_rdma_cookie)); | 662 | memcpy(&rm->m_rdma_cookie, CMSG_DATA(cmsg), sizeof(rm->m_rdma_cookie)); |
@@ -668,8 +692,8 @@ int rds_cmsg_rdma_dest(struct rds_sock *rs, struct rds_message *rm, | |||
668 | int rds_cmsg_rdma_map(struct rds_sock *rs, struct rds_message *rm, | 692 | int rds_cmsg_rdma_map(struct rds_sock *rs, struct rds_message *rm, |
669 | struct cmsghdr *cmsg) | 693 | struct cmsghdr *cmsg) |
670 | { | 694 | { |
671 | if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct rds_get_mr_args)) | 695 | if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct rds_get_mr_args)) || |
672 | || rm->m_rdma_cookie != 0) | 696 | rm->m_rdma_cookie != 0) |
673 | return -EINVAL; | 697 | return -EINVAL; |
674 | 698 | ||
675 | return __rds_rdma_map(rs, CMSG_DATA(cmsg), &rm->m_rdma_cookie, &rm->m_rdma_mr); | 699 | return __rds_rdma_map(rs, CMSG_DATA(cmsg), &rm->m_rdma_cookie, &rm->m_rdma_mr); |