Commit f92a5be5 authored by Alexander Aring's avatar Alexander Aring Committed by David Teigland
Browse files

dlm: handle port as __be16 network byte order



This patch handles the DLM listen port setting internally as byte order
as it is a value that is used as network byte on the wire. The user
space still sets this value as host byte order for configfs as we don't
break UAPI here.

Signed-off-by: default avatarAlexander Aring <aahringo@redhat.com>
Signed-off-by: default avatarDavid Teigland <teigland@redhat.com>
parent 7138c790
Loading
Loading
Loading
Loading
+41 −14
Original line number Diff line number Diff line
@@ -73,7 +73,7 @@ const struct rhashtable_params dlm_rhash_rsb_params = {

struct dlm_cluster {
	struct config_group group;
	unsigned int cl_tcp_port;
	__be16 cl_tcp_port;
	unsigned int cl_buffer_size;
	unsigned int cl_rsbtbl_size;
	unsigned int cl_recover_timer;
@@ -132,6 +132,45 @@ static ssize_t cluster_cluster_name_store(struct config_item *item,

CONFIGFS_ATTR(cluster_, cluster_name);

static ssize_t cluster_tcp_port_show(struct config_item *item, char *buf)
{
	return sprintf(buf, "%u\n", be16_to_cpu(dlm_config.ci_tcp_port));
}

static int dlm_check_zero_and_dlm_running(unsigned int x)
{
	if (!x)
		return -EINVAL;

	if (dlm_lowcomms_is_running())
		return -EBUSY;

	return 0;
}

static ssize_t cluster_tcp_port_store(struct config_item *item,
				      const char *buf, size_t len)
{
	int rc;
	u16 x;

	if (!capable(CAP_SYS_ADMIN))
		return -EPERM;

	rc = kstrtou16(buf, 0, &x);
	if (rc)
		return rc;

	rc = dlm_check_zero_and_dlm_running(x);
	if (rc)
		return rc;

	dlm_config.ci_tcp_port = cpu_to_be16(x);
	return len;
}

CONFIGFS_ATTR(cluster_, tcp_port);

static ssize_t cluster_set(struct dlm_cluster *cl, unsigned int *cl_field,
			   int *info_field, int (*check_cb)(unsigned int x),
			   const char *buf, size_t len)
@@ -191,17 +230,6 @@ static int dlm_check_protocol_and_dlm_running(unsigned int x)
	return 0;
}

static int dlm_check_zero_and_dlm_running(unsigned int x)
{
	if (!x)
		return -EINVAL;

	if (dlm_lowcomms_is_running())
		return -EBUSY;

	return 0;
}

static int dlm_check_zero(unsigned int x)
{
	if (!x)
@@ -218,7 +246,6 @@ static int dlm_check_buffer_size(unsigned int x)
	return 0;
}

CLUSTER_ATTR(tcp_port, dlm_check_zero_and_dlm_running);
CLUSTER_ATTR(buffer_size, dlm_check_buffer_size);
CLUSTER_ATTR(rsbtbl_size, dlm_check_zero);
CLUSTER_ATTR(recover_timer, dlm_check_zero);
@@ -982,7 +1009,7 @@ int dlm_our_addr(struct sockaddr_storage *addr, int num)
#define DEFAULT_CLUSTER_NAME      ""

struct dlm_config_info dlm_config = {
	.ci_tcp_port = DEFAULT_TCP_PORT,
	.ci_tcp_port = cpu_to_be16(DEFAULT_TCP_PORT),
	.ci_buffer_size = DLM_MAX_SOCKET_BUFSIZE,
	.ci_rsbtbl_size = DEFAULT_RSBTBL_SIZE,
	.ci_recover_timer = DEFAULT_RECOVER_TIMER,
+1 −1
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ extern const struct rhashtable_params dlm_rhash_rsb_params;
#define DLM_PROTO_SCTP	1

struct dlm_config_info {
	int ci_tcp_port;
	__be16 ci_tcp_port;
	int ci_buffer_size;
	int ci_rsbtbl_size;
	int ci_recover_timer;
+4 −4
Original line number Diff line number Diff line
@@ -660,18 +660,18 @@ static void add_sock(struct socket *sock, struct connection *con)

/* Add the port number to an IPv6 or 4 sockaddr and return the address
   length */
static void make_sockaddr(struct sockaddr_storage *saddr, uint16_t port,
static void make_sockaddr(struct sockaddr_storage *saddr, __be16 port,
			  int *addr_len)
{
	saddr->ss_family =  dlm_local_addr[0].ss_family;
	if (saddr->ss_family == AF_INET) {
		struct sockaddr_in *in4_addr = (struct sockaddr_in *)saddr;
		in4_addr->sin_port = cpu_to_be16(port);
		in4_addr->sin_port = port;
		*addr_len = sizeof(struct sockaddr_in);
		memset(&in4_addr->sin_zero, 0, sizeof(in4_addr->sin_zero));
	} else {
		struct sockaddr_in6 *in6_addr = (struct sockaddr_in6 *)saddr;
		in6_addr->sin6_port = cpu_to_be16(port);
		in6_addr->sin6_port = port;
		*addr_len = sizeof(struct sockaddr_in6);
	}
	memset((char *)saddr + *addr_len, 0, sizeof(struct sockaddr_storage) - *addr_len);
@@ -1121,7 +1121,7 @@ static void writequeue_entry_complete(struct writequeue_entry *e, int completed)
/*
 * sctp_bind_addrs - bind a SCTP socket to all our addresses
 */
static int sctp_bind_addrs(struct socket *sock, uint16_t port)
static int sctp_bind_addrs(struct socket *sock, __be16 port)
{
	struct sockaddr_storage localaddr;
	struct sockaddr *addr = (struct sockaddr *)&localaddr;