mirror of
https://github.com/opnsense/src.git
synced 2026-03-24 03:33:08 -04:00
r179247 introduced a possibility of devfs_allocv() returning spurious ENOENT. If the vnode is selected by vnlru daemon for reclamation, then devfs_allocv() can get ENOENT from vget() due to devfs_close() dropping vnode lock around the call to cdevsw d_close method. Use LK_RETRY in the vget() call, and do some part of the devfs_reclaim() work in devfs_allocv(), clearing vp->v_data and de->de_vnode. Retry the allocation of the vnode, now with de->de_vnode == NULL. The check vp->v_data == NULL at the start of devfs_close() cannot be affected by the change, since vnode lock must be held while VI_DOOMED is set, and only dropped after the check. Reported and tested by: Kohji Okuno <okuno.kohji jp panasonic com> Reviewed by: attilio MFC after: 3 weeks |
||
|---|---|---|
| .. | ||
| devfs.h | ||
| devfs_devs.c | ||
| devfs_dir.c | ||
| devfs_int.h | ||
| devfs_rule.c | ||
| devfs_vfsops.c | ||
| devfs_vnops.c | ||