更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
vnode_hash.c 文件参考

浏览源代码.

函数

int VnodeHashInit (void)
 
void VnodeHashDump (void)
 打印全部 hash 表 更多...
 
uint32_t VfsHashIndex (struct Vnode *vnode)
 通过节点获取哈希索引值 更多...
 
static LOS_DL_LISTVfsHashBucket (const struct Mount *mp, uint32_t hash)
 通过哈希值和装载设备哈希种子获取哈希表索引 更多...
 
int VfsHashGet (const struct Mount *mount, uint32_t hash, struct Vnode **vnode, VfsHashCmp *fn, void *arg)
 通过哈希值获取节点信息 更多...
 
void VfsHashRemove (struct Vnode *vnode)
 从哈希链表中摘除索引节点 更多...
 
int VfsHashInsert (struct Vnode *vnode, uint32_t hash)
 插入哈希表 更多...
 

变量

LIST_HEAD g_vnodeHashEntrys [VNODE_HASH_BUCKETS]
 
uint32_t g_vnodeHashMask = VNODE_HASH_BUCKETS - 1
 
uint32_t g_vnodeHashSize = VNODE_HASH_BUCKETS
 
static LosMux g_vnodeHashMux
 

函数说明

◆ VfsHashBucket()

static LOS_DL_LIST * VfsHashBucket ( const struct Mount mp,
uint32_t  hash 
)
static

通过哈希值和装载设备哈希种子获取哈希表索引

在文件 vnode_hash.c84 行定义.

85{
86 return (&g_vnodeHashEntrys[(hash + mp->hashseed) & g_vnodeHashMask]);//g_vnodeHashMask确保始终范围在[0~g_vnodeHashMask]之间
87}
uint32_t hashseed
Definition: mount.h:79
uint32_t g_vnodeHashMask
Definition: vnode_hash.c:39
LIST_HEAD g_vnodeHashEntrys[VNODE_HASH_BUCKETS]
Definition: vnode_hash.c:38
这是这个函数的调用关系图:

◆ VfsHashGet()

int VfsHashGet ( const struct Mount mount,
uint32_t  hash,
struct Vnode **  vnode,
VfsHashCmp fn,
void arg 
)

通过哈希值获取节点信息

在文件 vnode_hash.c89 行定义.

90{
91 struct Vnode *curVnode = NULL;
92
93 if (mount == NULL || vnode == NULL) {
94 return -EINVAL;
95 }
96
97 (void)LOS_MuxLock(&g_vnodeHashMux, LOS_WAIT_FOREVER);//先上锁
98 LOS_DL_LIST *list = VfsHashBucket(mount, hash);//获取哈希表对应的链表项
99 LOS_DL_LIST_FOR_EACH_ENTRY(curVnode, list, struct Vnode, hashEntry) {//遍历链表
100 if (curVnode->hash != hash) {//对比哈希值找
101 continue;
102 }
103 if (curVnode->originMount != mount) {//对比原始mount值必须一致
104 continue;
105 }
106 if (fn != NULL && fn(curVnode, arg)) {//哈希值比较函数,fn由具体的文件系统提供.
107 continue;
108 }
110 *vnode = curVnode;//找到对应索引节点
111 return LOS_OK;
112 }
114 *vnode = NULL;
115 return LOS_NOK;
116}
LITE_OS_SEC_TEXT UINT32 LOS_MuxUnlock(LosMux *mutex)
释放锁
Definition: los_mux.c:559
LITE_OS_SEC_TEXT UINT32 LOS_MuxLock(LosMux *mutex, UINT32 timeout)
拿互斥锁,
Definition: los_mux.c:437
vnode并不包含文件名,因为 vnode和文件名是 1:N 的关系
Definition: vnode.h:164
uint32_t hash
Definition: vnode.h:167
LIST_ENTRY hashEntry
Definition: vnode.h:178
struct Mount * originMount
Definition: vnode.h:180
ARG_NUM_3 ARG_NUM_1 ARG_NUM_2 ARG_NUM_2 ARG_NUM_3 ARG_NUM_1 ARG_NUM_4 ARG_NUM_2 ARG_NUM_2 ARG_NUM_5 ARG_NUM_2 void
static LOS_DL_LIST * VfsHashBucket(const struct Mount *mp, uint32_t hash)
通过哈希值和装载设备哈希种子获取哈希表索引
Definition: vnode_hash.c:84
static LosMux g_vnodeHashMux
Definition: vnode_hash.c:42
函数调用图:
这是这个函数的调用关系图:

◆ VfsHashIndex()

uint32_t VfsHashIndex ( struct Vnode vnode)

通过节点获取哈希索引值

在文件 vnode_hash.c76 行定义.

77{
78 if (vnode == NULL) {
79 return -EINVAL;
80 }
81 return (vnode->hash + vnode->originMount->hashseed);//用于定位在哈希表的下标
82}

◆ VfsHashInsert()

int VfsHashInsert ( struct Vnode vnode,
uint32_t  hash 
)

插入哈希表

在文件 vnode_hash.c128 行定义.

129{
130 if (vnode == NULL) {
131 return -EINVAL;
132 }
133 (void)LOS_MuxLock(&g_vnodeHashMux, LOS_WAIT_FOREVER);
134 vnode->hash = hash;//设置节点哈希值
135 LOS_ListHeadInsert(VfsHashBucket(vnode->originMount, hash), &vnode->hashEntry);//通过节点hashEntry 挂入哈希表对于索引链表中
137 return LOS_OK;
138}
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListHeadInsert(LOS_DL_LIST *list, LOS_DL_LIST *node)
Insert a node to the head of a doubly linked list.
Definition: los_list.h:268
函数调用图:
这是这个函数的调用关系图:

◆ VfsHashRemove()

void VfsHashRemove ( struct Vnode vnode)

从哈希链表中摘除索引节点

在文件 vnode_hash.c118 行定义.

119{
120 if (vnode == NULL) {
121 return;
122 }
123 (void)LOS_MuxLock(&g_vnodeHashMux, LOS_WAIT_FOREVER);
124 LOS_ListDelete(&vnode->hashEntry);//直接把自己摘掉就行了
126}
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListDelete(LOS_DL_LIST *node)
Definition: los_list.h:292
函数调用图:

◆ VnodeHashDump()

void VnodeHashDump ( void  )

打印全部 hash 表

在文件 vnode_hash.c60 行定义.

61{
62 PRINTK("-------->VnodeHashDump in\n");
63 (void)LOS_MuxLock(&g_vnodeHashMux, LOS_WAIT_FOREVER);//拿锁方式,永等
64 for (int i = 0; i < g_vnodeHashSize; i++) {
65 LIST_HEAD *nhead = &g_vnodeHashEntrys[i];
66 struct Vnode *node = NULL;
67
68 LOS_DL_LIST_FOR_EACH_ENTRY(node, nhead, struct Vnode, hashEntry) {//循环打印链表
69 PRINTK(" vnode dump: col %d item %p\n", i, node);//类似矩阵
70 }
71 }
73 PRINTK("-------->VnodeHashDump out\n");
74}
uint32_t g_vnodeHashSize
Definition: vnode_hash.c:40
函数调用图:

◆ VnodeHashInit()

int VnodeHashInit ( void  )

在文件 vnode_hash.c44 行定义.

45{
46 int ret;
47 for (int i = 0; i < g_vnodeHashSize; i++) {//遍历初始化 128个双向链表
49 }
50
51 ret = LOS_MuxInit(&g_vnodeHashMux, NULL);
52 if (ret != LOS_OK) {
53 PRINT_ERR("Create mutex for vnode hash list fail, status: %d", ret);
54 return ret;
55 }
56
57 return LOS_OK;
58}
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListInit(LOS_DL_LIST *list)
Definition: los_list.h:104
LITE_OS_SEC_TEXT UINT32 LOS_MuxInit(LosMux *mutex, const LosMuxAttr *attr)
初始化互斥锁
Definition: los_mux.c:262
函数调用图:
这是这个函数的调用关系图:

变量说明

◆ g_vnodeHashEntrys

LIST_HEAD g_vnodeHashEntrys[VNODE_HASH_BUCKETS]

在文件 vnode_hash.c38 行定义.

◆ g_vnodeHashMask

uint32_t g_vnodeHashMask = VNODE_HASH_BUCKETS - 1

在文件 vnode_hash.c39 行定义.

◆ g_vnodeHashMux

LosMux g_vnodeHashMux
static

在文件 vnode_hash.c42 行定义.

◆ g_vnodeHashSize

uint32_t g_vnodeHashSize = VNODE_HASH_BUCKETS

在文件 vnode_hash.c40 行定义.