• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * fs/hmdfs/comm/node_cb.c
4  *
5  * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
6  */
7 
8 #include <linux/list.h>
9 
10 #include "node_cb.h"
11 #include "connection.h"
12 
13 static struct list_head cb_head[NODE_EVT_NR][NODE_EVT_TYPE_NR];
14 
15 static const char *evt_str_tbl[NODE_EVT_NR] = {
16 	"add", "online", "offline", "del",
17 };
18 
hmdfs_is_valid_node_evt(int evt)19 static inline bool hmdfs_is_valid_node_evt(int evt)
20 {
21 	return (evt >= 0 && evt < NODE_EVT_NR);
22 }
23 
hmdfs_evt_str(int evt)24 static const char *hmdfs_evt_str(int evt)
25 {
26 	if (!hmdfs_is_valid_node_evt(evt))
27 		return "unknown";
28 	return evt_str_tbl[evt];
29 }
30 
hmdfs_node_evt_cb_init(void)31 void hmdfs_node_evt_cb_init(void)
32 {
33 	int i;
34 
35 	for (i = 0; i < ARRAY_SIZE(cb_head); i++) {
36 		int j;
37 
38 		for (j = 0; j < ARRAY_SIZE(cb_head[0]); j++)
39 			INIT_LIST_HEAD(&cb_head[i][j]);
40 	}
41 }
42 
hmdfs_node_add_evt_cb(struct hmdfs_node_cb_desc * desc,int nr)43 void hmdfs_node_add_evt_cb(struct hmdfs_node_cb_desc *desc, int nr)
44 {
45 	int i;
46 
47 	for (i = 0; i < nr; i++) {
48 		int evt = desc[i].evt;
49 		bool sync = desc[i].sync;
50 
51 		if (!hmdfs_is_valid_node_evt(evt))
52 			continue;
53 
54 		list_add_tail(&desc[i].list, &cb_head[evt][sync]);
55 	}
56 }
57 
hmdfs_node_call_evt_cb(struct hmdfs_peer * conn,int evt,bool sync,unsigned int seq)58 void hmdfs_node_call_evt_cb(struct hmdfs_peer *conn, int evt, bool sync,
59 			    unsigned int seq)
60 {
61 	struct hmdfs_node_cb_desc *desc = NULL;
62 
63 	hmdfs_info("node 0x%x:0x%llx call %s %s cb seq %u",
64 		   conn->owner, conn->device_id, hmdfs_evt_str(evt),
65 		   sync ? "sync" : "async", seq);
66 
67 	if (!hmdfs_is_valid_node_evt(evt))
68 		return;
69 
70 	list_for_each_entry(desc, &cb_head[evt][sync], list) {
71 		desc->fn(conn, evt, seq);
72 	}
73 }
74