diff --git a/qtfs/qtfs_common/socket.c b/qtfs/qtfs_common/socket.c index 3cfa0b2b324ea2efa529c6a66d6ceff903ce1bc7..c7e8d8feaf474c3c80b3409062ab3a3e70fc04ee 100644 --- a/qtfs/qtfs_common/socket.c +++ b/qtfs/qtfs_common/socket.c @@ -21,7 +21,12 @@ unsigned int qtfs_server_vsock_cid = 2; // host cid in vm is always 2 #endif #ifdef QTFS_SERVER -struct socket *qtfs_server_main_sock[QTFS_CONN_TYPE_INV] = {NULL}; +struct qtfs_main_sock_s { + struct socket *sock; + struct mutex lock; +}; +struct qtfs_main_sock_s qtfs_server_main_sock[QTFS_CONN_TYPE_INV]; + #endif #ifdef KVER_4_19 @@ -147,19 +152,27 @@ static int qtfs_conn_sock_server_accept(void *connvar, qtfs_conn_type_e type) struct qtfs_sock_var_s *sockvar = (struct qtfs_sock_var_s *)connvar; int ret; struct socket *sock = NULL; - if (type >= QTFS_CONN_TYPE_INV || qtfs_server_main_sock[type] == NULL) { - qtfs_err("invalid type:%u or main sock is invalid.", type); + if (type >= QTFS_CONN_TYPE_INV) { + qtfs_err("invalid type:%u.", type); + return -EFAULT; + } + mutex_lock(&qtfs_server_main_sock[type].lock); + if (qtfs_server_main_sock[type].sock == NULL) { + qtfs_err("invalid main sock, type:%u.", type); + mutex_unlock(&qtfs_server_main_sock[type].lock); return -EFAULT; } - sock = qtfs_server_main_sock[type]; + sock = qtfs_server_main_sock[type].sock; if (sock == NULL) { WARN_ON(1); qtfs_err("qtfs server accept failed, main sock is NULL."); + mutex_unlock(&qtfs_server_main_sock[type].lock); return -EINVAL; } ret = kernel_accept(sock, &sockvar->client_sock, SOCK_NONBLOCK); if (ret < 0) { + mutex_unlock(&qtfs_server_main_sock[type].lock); return ret; } #ifdef QTFS_TEST_MODE @@ -170,6 +183,7 @@ static int qtfs_conn_sock_server_accept(void *connvar, qtfs_conn_type_e type) qtfs_info("qtfs accept a client connection.\n"); qtfs_sock_recvtimeo_set(sockvar->client_sock, QTFS_SOCK_RCVTIMEO, 0); + mutex_unlock(&qtfs_server_main_sock[type].lock); return 0; } @@ -197,8 +211,10 @@ static int qtfs_conn_sock_init(void *connvar, qtfs_conn_type_e type) ret = -EINVAL; goto err_end_type; } - if (qtfs_server_main_sock[type] != NULL) { + mutex_lock(&qtfs_server_main_sock[type].lock); + if (qtfs_server_main_sock[type].sock != NULL) { qtfs_info("qtfs conn type:%u main sock is set, valid or out-of-date?", type); + mutex_unlock(&qtfs_server_main_sock[type].lock); return 0; } @@ -230,10 +246,12 @@ static int qtfs_conn_sock_init(void *connvar, qtfs_conn_type_e type) } qtfs_info("qtfs socket init sock OK!"); - qtfs_server_main_sock[type] = sock; + qtfs_server_main_sock[type].sock = sock; + mutex_unlock(&qtfs_server_main_sock[type].lock); return 0; err_end: + mutex_unlock(&qtfs_server_main_sock[type].lock); sock_release(sock); err_end_type: return ret; @@ -372,9 +390,13 @@ static void qtfs_conn_sock_fini(void *connvar, qtfs_conn_type_e type) } #ifdef QTFS_SERVER - if (type < QTFS_CONN_TYPE_INV && qtfs_server_main_sock[type] != NULL) { - sock_release(qtfs_server_main_sock[type]); - qtfs_server_main_sock[type] = NULL; + if (type < QTFS_CONN_TYPE_INV) { + mutex_lock(&qtfs_server_main_sock[type].lock); + if (qtfs_server_main_sock[type].sock != NULL) { + sock_release(qtfs_server_main_sock[type].sock); + qtfs_server_main_sock[type].sock = NULL; + } + mutex_unlock(&qtfs_server_main_sock[type].lock); } #endif return; @@ -423,25 +445,33 @@ static bool qtfs_conn_sock_inited(void *connvar, qtfs_conn_type_e type) qtfs_err("invalid type:%u", type); return false; } - return qtfs_server_main_sock[type] != NULL; + return qtfs_server_main_sock[type].sock != NULL; } #endif int qtfs_sock_param_init(void) { +#ifdef QTFS_SERVER + int i; + for (i = 0; i < QTFS_CONN_TYPE_INV; i++) { + qtfs_server_main_sock[i].sock = NULL; + mutex_init(&qtfs_server_main_sock[i].lock); + } +#endif return 0; } int qtfs_sock_param_fini(void) { #ifdef QTFS_SERVER - if (qtfs_server_main_sock[QTFS_CONN_TYPE_QTFS] != NULL) { - sock_release(qtfs_server_main_sock[QTFS_CONN_TYPE_QTFS]); - qtfs_server_main_sock[QTFS_CONN_TYPE_QTFS] = NULL; - } - if (qtfs_server_main_sock[QTFS_CONN_TYPE_FIFO] != NULL) { - sock_release(qtfs_server_main_sock[QTFS_CONN_TYPE_FIFO]); - qtfs_server_main_sock[QTFS_CONN_TYPE_FIFO] = NULL; + int i; + for (i = 0; i < QTFS_CONN_TYPE_INV; i++) { + mutex_lock(&qtfs_server_main_sock[i].lock); + if (qtfs_server_main_sock[i].sock != NULL) { + sock_release(qtfs_server_main_sock[i].sock); + qtfs_server_main_sock[i].sock = NULL; + } + mutex_unlock(&qtfs_server_main_sock[i].lock); } #endif return 0;