Bugfix: add vnode iteration debug feature for a bug

buginfo: when try to umount a nfs node, it may casue stack overflow.

Change-Id: I7d96f74a770607c990ca5f51cb92fb2843a08d12
This commit is contained in:
Far 2021-04-16 10:10:41 +08:00
parent b56c8392fd
commit 7e0e46828b
3 changed files with 23 additions and 1 deletions

View File

@ -52,5 +52,6 @@ int PathCacheAllocDummy(struct Vnode *parent, struct Vnode **vnode, const char *
int PathCacheLookup(struct Vnode *parent, const char *name, int len, struct Vnode **vnode);
void VnodePathCacheFree(struct Vnode *vnode);
void PathCacheMemoryDump(void);
void PathCacheDump(void);
#endif /* _PATH_CACHE_H */

View File

@ -54,7 +54,8 @@ void PathCacheDump(void)
LIST_HEAD *nhead = &g_pathCacheHashEntrys[i];
LOS_DL_LIST_FOR_EACH_ENTRY(nc, nhead, struct PathCache, hashEntry) {
PRINTK(" pathCache dump hash %d item %s %p %d\n", i, nc->name, nc->parentVnode, nc->nameLen);
PRINTK(" pathCache dump hash %d item %s %p %p %d\n", i,
nc->name, nc->parentVnode, nc->childVnode, nc->nameLen);
}
}
PRINTK("-------->pathCache dump out\n");

View File

@ -47,6 +47,7 @@ static struct VnodeOps g_devfsOps;
#define ENTRY_TO_VNODE(ptr) LOS_DL_LIST_ENTRY(ptr, struct Vnode, actFreeEntry)
#define VNODE_LRU_COUNT 10
#define DEV_VNODE_MODE 0755
#define MAX_ITER_TIMES 10
int VnodesInit(void)
{
@ -241,12 +242,29 @@ int VnodeFreeAll(struct Mount *mnt)
return 0;
}
static VOID VnodeIterDump(struct Vnode *vnode, int increase)
{
static int count = 0;
LIST_ENTRY *list = &vnode->parentPathCaches;
struct PathCache *pathCache = LOS_DL_LIST_ENTRY(list->pstNext, struct PathCache, parentEntry);
count += increase;
if (count >= MAX_ITER_TIMES) {
PRINTK("########## Vnode In Use Iteration ##########\n");
PRINTK("Iteration times: %d\n", count);
PRINTK("%p -- %s --> %p\n", vnode->parent, pathCache->name, vnode);
PathCacheDump();
}
}
BOOL VnodeInUseIter(struct Vnode *vnode)
{
struct Vnode *vp = NULL;
struct PathCache *item = NULL;
struct PathCache *nextItem = NULL;
VnodeIterDump(vnode, 1);
if (vnode->useCount > 0) {
VnodeIterDump(vnode, -1);
return TRUE;
}
LOS_DL_LIST_FOR_EACH_ENTRY_SAFE(item, nextItem, &vnode->childPathCaches, struct PathCache, childEntry) {
@ -255,9 +273,11 @@ BOOL VnodeInUseIter(struct Vnode *vnode)
continue;
}
if (VnodeInUseIter(vp) == TRUE) {
VnodeIterDump(vnode, -1);
return TRUE;
}
}
VnodeIterDump(vnode, -1);
return FALSE;
}