fs: dlm: move to static proto ops

This patch moves the per transport socket callbacks to a static const
array. We can support only one transport socket for the init namespace
which will be determinted by reading the dlm config at lowcomms_start().

Signed-off-by: Alexander Aring <aahringo@redhat.com>
Signed-off-by: David Teigland <teigland@redhat.com>
This commit is contained in:
Alexander Aring 2021-07-16 16:22:40 -04:00 коммит произвёл David Teigland
Родитель 66d5955a09
Коммит a66c008cd1
1 изменённых файлов: 30 добавлений и 22 удалений

Просмотреть файл

@ -84,9 +84,6 @@ struct connection {
struct list_head writequeue; /* List of outgoing writequeue_entries */ struct list_head writequeue; /* List of outgoing writequeue_entries */
spinlock_t writequeue_lock; spinlock_t writequeue_lock;
atomic_t writequeue_cnt; atomic_t writequeue_cnt;
void (*connect_action) (struct connection *); /* What to do to connect */
void (*shutdown_action)(struct connection *con); /* What to do to shutdown */
bool (*eof_condition)(struct connection *con); /* What to do to eof check */
int retries; int retries;
#define MAX_CONNECT_RETRIES 3 #define MAX_CONNECT_RETRIES 3
struct hlist_node list; struct hlist_node list;
@ -145,6 +142,15 @@ struct dlm_node_addr {
struct sockaddr_storage *addr[DLM_MAX_ADDR_COUNT]; struct sockaddr_storage *addr[DLM_MAX_ADDR_COUNT];
}; };
struct dlm_proto_ops {
/* What to do to connect */
void (*connect_action)(struct connection *con);
/* What to do to shutdown */
void (*shutdown_action)(struct connection *con);
/* What to do to eof check */
bool (*eof_condition)(struct connection *con);
};
static struct listen_sock_callbacks { static struct listen_sock_callbacks {
void (*sk_error_report)(struct sock *); void (*sk_error_report)(struct sock *);
void (*sk_data_ready)(struct sock *); void (*sk_data_ready)(struct sock *);
@ -168,12 +174,13 @@ static struct hlist_head connection_hash[CONN_HASH_SIZE];
static DEFINE_SPINLOCK(connections_lock); static DEFINE_SPINLOCK(connections_lock);
DEFINE_STATIC_SRCU(connections_srcu); DEFINE_STATIC_SRCU(connections_srcu);
static const struct dlm_proto_ops *dlm_proto_ops;
static void process_recv_sockets(struct work_struct *work); static void process_recv_sockets(struct work_struct *work);
static void process_send_sockets(struct work_struct *work); static void process_send_sockets(struct work_struct *work);
static void sctp_connect_to_sock(struct connection *con); static void sctp_connect_to_sock(struct connection *con);
static void tcp_connect_to_sock(struct connection *con); static void tcp_connect_to_sock(struct connection *con);
static void dlm_tcp_shutdown(struct connection *con);
/* need to held writequeue_lock */ /* need to held writequeue_lock */
static struct writequeue_entry *con_next_wq(struct connection *con) static struct writequeue_entry *con_next_wq(struct connection *con)
@ -224,20 +231,6 @@ static int dlm_con_init(struct connection *con, int nodeid)
INIT_WORK(&con->rwork, process_recv_sockets); INIT_WORK(&con->rwork, process_recv_sockets);
init_waitqueue_head(&con->shutdown_wait); init_waitqueue_head(&con->shutdown_wait);
switch (dlm_config.ci_protocol) {
case DLM_PROTO_TCP:
con->connect_action = tcp_connect_to_sock;
con->shutdown_action = dlm_tcp_shutdown;
con->eof_condition = tcp_eof_condition;
break;
case DLM_PROTO_SCTP:
con->connect_action = sctp_connect_to_sock;
break;
default:
kfree(con->rx_buf);
return -EINVAL;
}
return 0; return 0;
} }
@ -962,7 +955,8 @@ out_close:
log_print("connection %p got EOF from %d", log_print("connection %p got EOF from %d",
con, con->nodeid); con, con->nodeid);
if (con->eof_condition && con->eof_condition(con)) { if (dlm_proto_ops->eof_condition &&
dlm_proto_ops->eof_condition(con)) {
set_bit(CF_EOF, &con->flags); set_bit(CF_EOF, &con->flags);
mutex_unlock(&con->sock_mutex); mutex_unlock(&con->sock_mutex);
} else { } else {
@ -1813,7 +1807,7 @@ static void process_send_sockets(struct work_struct *work)
if (con->sock == NULL) { /* not mutex protected so check it inside too */ if (con->sock == NULL) { /* not mutex protected so check it inside too */
if (test_and_clear_bit(CF_DELAY_CONNECT, &con->flags)) if (test_and_clear_bit(CF_DELAY_CONNECT, &con->flags))
msleep(1000); msleep(1000);
con->connect_action(con); dlm_proto_ops->connect_action(con);
} }
if (!list_empty(&con->writequeue)) if (!list_empty(&con->writequeue))
send_to_sock(con); send_to_sock(con);
@ -1853,8 +1847,8 @@ static int work_start(void)
static void shutdown_conn(struct connection *con) static void shutdown_conn(struct connection *con)
{ {
if (con->shutdown_action) if (dlm_proto_ops->shutdown_action)
con->shutdown_action(con); dlm_proto_ops->shutdown_action(con);
} }
void dlm_lowcomms_shutdown(void) void dlm_lowcomms_shutdown(void)
@ -1961,8 +1955,20 @@ void dlm_lowcomms_stop(void)
srcu_read_unlock(&connections_srcu, idx); srcu_read_unlock(&connections_srcu, idx);
work_stop(); work_stop();
deinit_local(); deinit_local();
dlm_proto_ops = NULL;
} }
static const struct dlm_proto_ops dlm_tcp_ops = {
.connect_action = tcp_connect_to_sock,
.shutdown_action = dlm_tcp_shutdown,
.eof_condition = tcp_eof_condition,
};
static const struct dlm_proto_ops dlm_sctp_ops = {
.connect_action = sctp_connect_to_sock,
};
int dlm_lowcomms_start(void) int dlm_lowcomms_start(void)
{ {
int error = -EINVAL; int error = -EINVAL;
@ -1989,9 +1995,11 @@ int dlm_lowcomms_start(void)
/* Start listening */ /* Start listening */
switch (dlm_config.ci_protocol) { switch (dlm_config.ci_protocol) {
case DLM_PROTO_TCP: case DLM_PROTO_TCP:
dlm_proto_ops = &dlm_tcp_ops;
error = tcp_listen_for_all(); error = tcp_listen_for_all();
break; break;
case DLM_PROTO_SCTP: case DLM_PROTO_SCTP:
dlm_proto_ops = &dlm_sctp_ops;
error = sctp_listen_for_all(&listen_con); error = sctp_listen_for_all(&listen_con);
break; break;
default: default: