提交 e6dd731c 编写于 作者: S Sven Wegener

ipvs: Use ERR_PTR for returning errors from make_receive_sock() and make_send_sock()

The additional information we now return to the caller is currently not used,
but will be used to return errors to user space.
Signed-off-by: NSven Wegener <sven.wegener@stealer.net>
Acked-by: NSimon Horman <horms@verge.net.au>
上级 d5640050
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <linux/in.h> #include <linux/in.h>
#include <linux/igmp.h> /* for ip_mc_join_group */ #include <linux/igmp.h> /* for ip_mc_join_group */
#include <linux/udp.h> #include <linux/udp.h>
#include <linux/err.h>
#include <net/ip.h> #include <net/ip.h>
#include <net/sock.h> #include <net/sock.h>
...@@ -576,14 +577,17 @@ static int bind_mcastif_addr(struct socket *sock, char *ifname) ...@@ -576,14 +577,17 @@ static int bind_mcastif_addr(struct socket *sock, char *ifname)
static struct socket * make_send_sock(void) static struct socket * make_send_sock(void)
{ {
struct socket *sock; struct socket *sock;
int result;
/* First create a socket */ /* First create a socket */
if (sock_create_kern(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock) < 0) { result = sock_create_kern(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock);
if (result < 0) {
IP_VS_ERR("Error during creation of socket; terminating\n"); IP_VS_ERR("Error during creation of socket; terminating\n");
return NULL; return ERR_PTR(result);
} }
if (set_mcast_if(sock->sk, ip_vs_master_mcast_ifn) < 0) { result = set_mcast_if(sock->sk, ip_vs_master_mcast_ifn);
if (result < 0) {
IP_VS_ERR("Error setting outbound mcast interface\n"); IP_VS_ERR("Error setting outbound mcast interface\n");
goto error; goto error;
} }
...@@ -591,14 +595,15 @@ static struct socket * make_send_sock(void) ...@@ -591,14 +595,15 @@ static struct socket * make_send_sock(void)
set_mcast_loop(sock->sk, 0); set_mcast_loop(sock->sk, 0);
set_mcast_ttl(sock->sk, 1); set_mcast_ttl(sock->sk, 1);
if (bind_mcastif_addr(sock, ip_vs_master_mcast_ifn) < 0) { result = bind_mcastif_addr(sock, ip_vs_master_mcast_ifn);
if (result < 0) {
IP_VS_ERR("Error binding address of the mcast interface\n"); IP_VS_ERR("Error binding address of the mcast interface\n");
goto error; goto error;
} }
if (sock->ops->connect(sock, result = sock->ops->connect(sock, (struct sockaddr *) &mcast_addr,
(struct sockaddr*)&mcast_addr, sizeof(struct sockaddr), 0);
sizeof(struct sockaddr), 0) < 0) { if (result < 0) {
IP_VS_ERR("Error connecting to the multicast addr\n"); IP_VS_ERR("Error connecting to the multicast addr\n");
goto error; goto error;
} }
...@@ -607,7 +612,7 @@ static struct socket * make_send_sock(void) ...@@ -607,7 +612,7 @@ static struct socket * make_send_sock(void)
error: error:
sock_release(sock); sock_release(sock);
return NULL; return ERR_PTR(result);
} }
...@@ -617,27 +622,30 @@ static struct socket * make_send_sock(void) ...@@ -617,27 +622,30 @@ static struct socket * make_send_sock(void)
static struct socket * make_receive_sock(void) static struct socket * make_receive_sock(void)
{ {
struct socket *sock; struct socket *sock;
int result;
/* First create a socket */ /* First create a socket */
if (sock_create_kern(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock) < 0) { result = sock_create_kern(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock);
if (result < 0) {
IP_VS_ERR("Error during creation of socket; terminating\n"); IP_VS_ERR("Error during creation of socket; terminating\n");
return NULL; return ERR_PTR(result);
} }
/* it is equivalent to the REUSEADDR option in user-space */ /* it is equivalent to the REUSEADDR option in user-space */
sock->sk->sk_reuse = 1; sock->sk->sk_reuse = 1;
if (sock->ops->bind(sock, result = sock->ops->bind(sock, (struct sockaddr *) &mcast_addr,
(struct sockaddr*)&mcast_addr, sizeof(struct sockaddr));
sizeof(struct sockaddr)) < 0) { if (result < 0) {
IP_VS_ERR("Error binding to the multicast addr\n"); IP_VS_ERR("Error binding to the multicast addr\n");
goto error; goto error;
} }
/* join the multicast group */ /* join the multicast group */
if (join_mcast_group(sock->sk, result = join_mcast_group(sock->sk,
(struct in_addr*)&mcast_addr.sin_addr, (struct in_addr *) &mcast_addr.sin_addr,
ip_vs_backup_mcast_ifn) < 0) { ip_vs_backup_mcast_ifn);
if (result < 0) {
IP_VS_ERR("Error joining to the multicast group\n"); IP_VS_ERR("Error joining to the multicast group\n");
goto error; goto error;
} }
...@@ -646,7 +654,7 @@ static struct socket * make_receive_sock(void) ...@@ -646,7 +654,7 @@ static struct socket * make_receive_sock(void)
error: error:
sock_release(sock); sock_release(sock);
return NULL; return ERR_PTR(result);
} }
...@@ -719,7 +727,7 @@ static void sync_master_loop(void) ...@@ -719,7 +727,7 @@ static void sync_master_loop(void)
/* create the sending multicast socket */ /* create the sending multicast socket */
sock = make_send_sock(); sock = make_send_sock();
if (!sock) if (IS_ERR(sock))
return; return;
IP_VS_INFO("sync thread started: state = MASTER, mcast_ifn = %s, " IP_VS_INFO("sync thread started: state = MASTER, mcast_ifn = %s, "
...@@ -772,7 +780,7 @@ static void sync_backup_loop(void) ...@@ -772,7 +780,7 @@ static void sync_backup_loop(void)
/* create the receiving multicast socket */ /* create the receiving multicast socket */
sock = make_receive_sock(); sock = make_receive_sock();
if (!sock) if (IS_ERR(sock))
goto out; goto out;
IP_VS_INFO("sync thread started: state = BACKUP, mcast_ifn = %s, " IP_VS_INFO("sync thread started: state = BACKUP, mcast_ifn = %s, "
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册