diff options
Diffstat (limited to 'drivers/infiniband/core/nldev.c')
| -rw-r--r-- | drivers/infiniband/core/nldev.c | 56 | 
1 files changed, 37 insertions, 19 deletions
diff --git a/drivers/infiniband/core/nldev.c b/drivers/infiniband/core/nldev.c index 2fae850a3eff..0dcd1aa6f683 100644 --- a/drivers/infiniband/core/nldev.c +++ b/drivers/infiniband/core/nldev.c @@ -142,27 +142,34 @@ static int nldev_get_doit(struct sk_buff *skb, struct nlmsghdr *nlh,  	index = nla_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); -	device = __ib_device_get_by_index(index); +	device = ib_device_get_by_index(index);  	if (!device)  		return -EINVAL;  	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); -	if (!msg) -		return -ENOMEM; +	if (!msg) { +		err = -ENOMEM; +		goto err; +	}  	nlh = nlmsg_put(msg, NETLINK_CB(skb).portid, nlh->nlmsg_seq,  			RDMA_NL_GET_TYPE(RDMA_NL_NLDEV, RDMA_NLDEV_CMD_GET),  			0, 0);  	err = fill_dev_info(msg, device); -	if (err) { -		nlmsg_free(msg); -		return err; -	} +	if (err) +		goto err_free;  	nlmsg_end(msg, nlh); +	put_device(&device->dev);  	return rdma_nl_unicast(msg, NETLINK_CB(skb).portid); + +err_free: +	nlmsg_free(msg); +err: +	put_device(&device->dev); +	return err;  }  static int _nldev_get_dumpit(struct ib_device *device, @@ -220,31 +227,40 @@ static int nldev_port_get_doit(struct sk_buff *skb, struct nlmsghdr *nlh,  		return -EINVAL;  	index = nla_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); -	device = __ib_device_get_by_index(index); +	device = ib_device_get_by_index(index);  	if (!device)  		return -EINVAL;  	port = nla_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]); -	if (!rdma_is_port_valid(device, port)) -		return -EINVAL; +	if (!rdma_is_port_valid(device, port)) { +		err = -EINVAL; +		goto err; +	}  	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); -	if (!msg) -		return -ENOMEM; +	if (!msg) { +		err = -ENOMEM; +		goto err; +	}  	nlh = nlmsg_put(msg, NETLINK_CB(skb).portid, nlh->nlmsg_seq,  			RDMA_NL_GET_TYPE(RDMA_NL_NLDEV, RDMA_NLDEV_CMD_GET),  			0, 0);  	err = fill_port_info(msg, device, port); -	if (err) { -		nlmsg_free(msg); -		return err; -	} +	if (err) +		goto err_free;  	nlmsg_end(msg, nlh); +	put_device(&device->dev);  	return rdma_nl_unicast(msg, NETLINK_CB(skb).portid); + +err_free: +	nlmsg_free(msg); +err: +	put_device(&device->dev); +	return err;  }  static int nldev_port_get_dumpit(struct sk_buff *skb, @@ -265,7 +281,7 @@ static int nldev_port_get_dumpit(struct sk_buff *skb,  		return -EINVAL;  	ifindex = nla_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); -	device = __ib_device_get_by_index(ifindex); +	device = ib_device_get_by_index(ifindex);  	if (!device)  		return -EINVAL; @@ -299,11 +315,13 @@ static int nldev_port_get_dumpit(struct sk_buff *skb,  		nlmsg_end(skb, nlh);  	} -out:	cb->args[0] = idx; +out: +	put_device(&device->dev); +	cb->args[0] = idx;  	return skb->len;  } -static const struct rdma_nl_cbs nldev_cb_table[] = { +static const struct rdma_nl_cbs nldev_cb_table[RDMA_NLDEV_NUM_OPS] = {  	[RDMA_NLDEV_CMD_GET] = {  		.doit = nldev_get_doit,  		.dump = nldev_get_dumpit,  |