Skip to content

Commit

Permalink
fs: dlm: set skb mark per peer socket
Browse files Browse the repository at this point in the history
This patch adds support to set the skb mark value for the DLM tcp and
sctp socket per peer. The mark value will be offered as per comm value
of configfs. At creation time of the peer socket it will be set as
socket option.

Signed-off-by: Alexander Aring <[email protected]>
Signed-off-by: David Teigland <[email protected]>
  • Loading branch information
Alexander Aring authored and teigland committed Aug 6, 2020
1 parent a5b7ab6 commit 9c9f168
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 0 deletions.
38 changes: 38 additions & 0 deletions fs/dlm/config.c
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,7 @@ enum {
COMM_ATTR_LOCAL,
COMM_ATTR_ADDR,
COMM_ATTR_ADDR_LIST,
COMM_ATTR_MARK,
};

enum {
Expand Down Expand Up @@ -232,6 +233,7 @@ struct dlm_comm {
int nodeid;
int local;
int addr_count;
unsigned int mark;
struct sockaddr_storage *addr[DLM_MAX_ADDR_COUNT];
};

Expand Down Expand Up @@ -469,6 +471,7 @@ static struct config_item *make_comm(struct config_group *g, const char *name)
cm->nodeid = -1;
cm->local = 0;
cm->addr_count = 0;
cm->mark = 0;
return &cm->item;
}

Expand Down Expand Up @@ -664,8 +667,28 @@ static ssize_t comm_addr_list_show(struct config_item *item, char *buf)
return 4096 - allowance;
}

static ssize_t comm_mark_show(struct config_item *item, char *buf)
{
return sprintf(buf, "%u\n", config_item_to_comm(item)->mark);
}

static ssize_t comm_mark_store(struct config_item *item, const char *buf,
size_t len)
{
unsigned int mark;
int rc;

rc = kstrtouint(buf, 0, &mark);
if (rc)
return rc;

config_item_to_comm(item)->mark = mark;
return len;
}

CONFIGFS_ATTR(comm_, nodeid);
CONFIGFS_ATTR(comm_, local);
CONFIGFS_ATTR(comm_, mark);
CONFIGFS_ATTR_WO(comm_, addr);
CONFIGFS_ATTR_RO(comm_, addr_list);

Expand All @@ -674,6 +697,7 @@ static struct configfs_attribute *comm_attrs[] = {
[COMM_ATTR_LOCAL] = &comm_attr_local,
[COMM_ATTR_ADDR] = &comm_attr_addr,
[COMM_ATTR_ADDR_LIST] = &comm_attr_addr_list,
[COMM_ATTR_MARK] = &comm_attr_mark,
NULL,
};

Expand Down Expand Up @@ -833,6 +857,20 @@ int dlm_comm_seq(int nodeid, uint32_t *seq)
return 0;
}

int dlm_comm_mark(int nodeid, unsigned int *mark)
{
struct dlm_comm *cm;

cm = get_comm(nodeid);
if (!cm)
return -ENOENT;

*mark = cm->mark;
put_comm(cm);

return 0;
}

int dlm_our_nodeid(void)
{
return local_comm ? local_comm->nodeid : 0;
Expand Down
1 change: 1 addition & 0 deletions fs/dlm/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ void dlm_config_exit(void);
int dlm_config_nodes(char *lsname, struct dlm_config_node **nodes_out,
int *count_out);
int dlm_comm_seq(int nodeid, uint32_t *seq);
int dlm_comm_mark(int nodeid, unsigned int *mark);
int dlm_our_nodeid(void);
int dlm_our_addr(struct sockaddr_storage *addr, int num);

Expand Down
16 changes: 16 additions & 0 deletions fs/dlm/lowcomms.c
Original file line number Diff line number Diff line change
Expand Up @@ -914,6 +914,7 @@ static void sctp_connect_to_sock(struct connection *con)
int result;
int addr_len;
struct socket *sock;
unsigned int mark;

if (con->nodeid == 0) {
log_print("attempt to connect sock 0 foiled");
Expand Down Expand Up @@ -944,6 +945,13 @@ static void sctp_connect_to_sock(struct connection *con)
if (result < 0)
goto socket_err;

/* set skb mark */
result = dlm_comm_mark(con->nodeid, &mark);
if (result < 0)
goto bind_err;

sock_set_mark(sock->sk, mark);

con->rx_action = receive_from_sock;
con->connect_action = sctp_connect_to_sock;
add_sock(sock, con);
Expand Down Expand Up @@ -1006,6 +1014,7 @@ static void tcp_connect_to_sock(struct connection *con)
struct sockaddr_storage saddr, src_addr;
int addr_len;
struct socket *sock = NULL;
unsigned int mark;
int result;

if (con->nodeid == 0) {
Expand All @@ -1027,6 +1036,13 @@ static void tcp_connect_to_sock(struct connection *con)
if (result < 0)
goto out_err;

/* set skb mark */
result = dlm_comm_mark(con->nodeid, &mark);
if (result < 0)
goto out_err;

sock_set_mark(sock->sk, mark);

memset(&saddr, 0, sizeof(saddr));
result = nodeid_to_addr(con->nodeid, &saddr, NULL, false);
if (result < 0) {
Expand Down

0 comments on commit 9c9f168

Please sign in to comment.