diff --git a/qtfs/qtfs_server/fsops.c b/qtfs/qtfs_server/fsops.c index c1705d64524f326c3a33ce83feb3ab27f9753b46..32624e83c08d98139c9fa33bcdf761e88c0fce83 100644 --- a/qtfs/qtfs_server/fsops.c +++ b/qtfs/qtfs_server/fsops.c @@ -49,7 +49,9 @@ bool in_white_list(char *path, int type) { int i, in_wl = -1; + read_lock(&g_whitelist_lock); if (!g_whitelist[type]) { + read_unlock(&g_whitelist_lock); return true; } for (i = 0; i < g_whitelist[type]->len; i++) { @@ -58,6 +60,7 @@ bool in_white_list(char *path, int type) break; } } + read_unlock(&g_whitelist_lock); return in_wl != -1; } diff --git a/qtfs/qtfs_server/qtfs-server.c b/qtfs/qtfs_server/qtfs-server.c index 7bedb15ea1a41d97438504c792a8130b6e4dd040..97b79f4b29f36cfb69892879fc3de6c88c24e5df 100644 --- a/qtfs/qtfs_server/qtfs-server.c +++ b/qtfs/qtfs_server/qtfs-server.c @@ -42,8 +42,10 @@ struct qtfs_server_epoll_s qtfs_epoll = { .events = NULL, .kevents = NULL, }; +rwlock_t qtfs_epoll_rwlock; struct whitelist* g_whitelist[QTFS_WHITELIST_MAX]; +rwlock_t g_whitelist_rwlock; long qtfs_server_epoll_thread(struct qtfs_conn_var_s *pvar) { @@ -186,9 +188,7 @@ long qtfs_server_misc_ioctl(struct file *file, unsigned int cmd, unsigned long a return QTERROR; } for (i = 0; i < init_userp.thread_nums; i++) - qtfs_info("userp set idx:%d size:%lu user pointer:%lx %lx", i, - qtfs_userps[i].size, (unsigned long)qtfs_userps[i].userp, - (unsigned long)qtfs_userps[i].userp2); + qtfs_info("userp set idx:%d size:%lu", i, qtfs_userps[i].size); break; case QTFS_IOCTL_THREAD_RUN: pvar = qtfs_conn_get_param(); @@ -203,6 +203,7 @@ long qtfs_server_misc_ioctl(struct file *file, unsigned int cmd, unsigned long a qtfs_conn_put_param(pvar); break; case QTFS_IOCTL_EPFDSET: + write_lock(&qtfs_epoll_rwlock); if (qtfs_epoll.kevents != NULL) { kfree(qtfs_epoll.kevents); qtfs_epoll.kevents = NULL; @@ -210,11 +211,13 @@ long qtfs_server_misc_ioctl(struct file *file, unsigned int cmd, unsigned long a if (copy_from_user(&qtfs_epoll, (void __user *)arg, sizeof(struct qtfs_server_epoll_s))) { qtfs_err("copy epoll struct from arg failed."); ret = QTERROR; + write_unlock(&qtfs_epoll_rwlock); break; } if (qtfs_epoll.event_nums > QTFS_MAX_EPEVENTS_NUM) { qtfs_err("epoll arg set failed, event nums:%d too big", qtfs_epoll.event_nums); ret = QTERROR; + write_unlock(&qtfs_epoll_rwlock); break; } qtfs_info("epoll arg set, epfd:%d event nums:%d events.", @@ -224,8 +227,10 @@ long qtfs_server_misc_ioctl(struct file *file, unsigned int cmd, unsigned long a if (qtfs_epoll.kevents == NULL) { qtfs_err("epoll kernel events kmalloc failed."); ret = QTERROR; + write_unlock(&qtfs_epoll_rwlock); break; } + write_unlock(&qtfs_epoll_rwlock); break; case QTFS_IOCTL_EPOLL_THREAD_INIT: ret = qtfs_server_epoll_init(); @@ -236,7 +241,9 @@ long qtfs_server_misc_ioctl(struct file *file, unsigned int cmd, unsigned long a ret = QTERROR; break; } + write_lock(&qtfs_epoll_rwlock); ret = qtfs_server_epoll_thread(qtfs_epoll_var); + write_unlock(&qtfs_epoll_rwlock); if (ret == QTEXIT) { qtfs_info("qtfs epoll thread exit."); qtfs_epoll_cut_conn(qtfs_epoll_var); @@ -275,13 +282,17 @@ long qtfs_server_misc_ioctl(struct file *file, unsigned int cmd, unsigned long a kfree(tmp); return QTERROR; } + write_lock(&g_whitelist_rwlock); if (g_whitelist[tmp->type] != NULL) { kfree(g_whitelist[tmp->type]); } g_whitelist[tmp->type] = tmp; + write_unlock(&g_whitelist_rwlock); + read_lock(&g_whitelist_rwlock) for (i = 0; i < g_whitelist[tmp->type]->len; i++) { - qtfs_err("init %d list:%d %s", tmp->type, i, g_whitelist[tmp->type]->wl[i].path); + qtfs_info("init %d list:%d %s", tmp->type, i, g_whitelist[tmp->type]->wl[i].path); } + read_unlock(&g_whitelist_rwlock) break; case QTFS_IOCTL_ALLINFO: case QTFS_IOCTL_CLEARALL: @@ -306,9 +317,15 @@ static int __init qtfs_server_init(void) qtfs_log_init(qtfs_log_level, sizeof(qtfs_log_level)); if (qtfs_kallsyms_hack_init() != 0) return -1; + rwlock_init(&g_whitelist_rwlock); + rwlock_init(&qtfs_epoll_rwlock); + + write_lock(&g_whitelist_rwlock); for (i = 0; i < QTFS_WHITELIST_MAX; i++) { g_whitelist[i] = NULL; } + write_unlock(&g_whitelist_rwlock); + qtfs_diag_info = (struct qtinfo *)kmalloc(sizeof(struct qtinfo), GFP_KERNEL); if (qtfs_diag_info == NULL) { qtfs_err("kmalloc qtfs diag info failed."); @@ -370,12 +387,16 @@ static void __exit qtfs_server_exit(void) kfree(qtfs_userps); qtfs_userps = NULL; } + + write_lock(&g_whitelist_rwlock); for (i = 0; i < QTFS_WHITELIST_MAX; i++) { if (g_whitelist[i] != NULL) { kfree(g_whitelist[i]); } } - qtfs_misc_destroy(); + write_unlock(&g_whitelist_rwlock); + + qtfs_misc_destroy(); qtfs_uds_remote_exit(); qtfs_syscall_replace_stop(); qtfs_info("qtfs server exit done.\n"); @@ -392,5 +413,4 @@ module_param_string(qtfs_conn_type, qtfs_conn_type, sizeof(qtfs_conn_type), 0600 module_init(qtfs_server_init); module_exit(qtfs_server_exit); MODULE_AUTHOR("liqiang64@huawei.com"); -MODULE_LICENSE("GPL"); - +MODULE_LICENSE("GPL"); \ No newline at end of file