- 论坛徽章:
- 0
|
谢谢各位给出的线索。
上层的代码是这样的(都只列出了相关的部分)。
这个Panic的现象不是经常出现的,可能99.9%的情况下这个module都是工作正常的。
请大家继续提供线索,谢谢!
in_exclude_dirs(struct dentry * dentry, struct vfsmount * mnt) 中
list_for_each_entry_safe(ip, nip, &exc_dir_list_head, item_list) {
if (has_wildcards(ip->path)) {
if (path_match_wildcard(ip->path, dentry, mnt)) {
return TRUE;
}
} else {
if (path_match_dir(ip->path, dentry, mnt)) {
return TRUE;
}
}
}
再上层,need_to_scan(struct dentry * dentry, struct vfsmount * mnt, int flags, ino_t inode)
if ((!list_empty(&exc_dir_list_head) && in_exclude_dirs(dentry, mnt))
return FALSE;
再上层,openhook(),这就是用来替换系统open的hook函数。
asmlinkage int openHook(const char *filename, int flags, int mode)
{
// ....
int inode;
char * tmp = getname(filename);
struct stat statbuf;
getStat(tmp, &statbuf);
inode = statbuf.st_ino;
struct nameidata nd;
error = PATH_LOOKUP(tmp, lookup_flags(namei_flags), &nd);
scan_open = need_to_scan(nd.dentry, nd.mnt, flags, inode);
// ....
}
其中的PATH_LOOKUP和getStat
int PATH_LOOKUP(const char * path, unsigned flags, struct nameidata * nd)
{
#if LINUX_VERSION_CODE >= 0x20600
#if defined (IT_LOOKUP)
intent_init(&nd->intent, IT_LOOKUP);
#endif
return path_lookup(path, flags, nd);
#else
int error = 1;
if (path_init(path, flags, nd))
error = path_walk(path, nd);
return error;
#endif
}
int getStat(char *filename, struct stat *statbuf)
{
struct nameidata nd;
int error = 1;
error = PATH_LOOKUP(filename, LOOKUP_FOLLOW | LOOKUP_NOALT, &nd);
if (!error) {
error = cp_new_stat(nd.dentry->d_inode, statbuf);
path_release(&nd);
}
return error;
} |
|