svn commit: r187890 - in stable/7/sys: . contrib/pf dev/cxgb
fs/pseudofs
Konstantin Belousov
kib at FreeBSD.org
Thu Jan 29 03:17:12 PST 2009
Author: kib
Date: Thu Jan 29 11:17:11 2009
New Revision: 187890
URL: http://svn.freebsd.org/changeset/base/187890
Log:
MFC r186565:
When the insmntque() in the pfs_vncache_alloc() fails, vop_reclaim calls
pfs_vncache_free() that removes pvd from the list, while it is not yet
put on the list.
Prevent the invalid removal from the list by clearing pvd_next and
pvd_prev for the newly allocated pvd, and only move pfs_vncache list
head when the pvd was at the head.
Modified:
stable/7/sys/ (props changed)
stable/7/sys/contrib/pf/ (props changed)
stable/7/sys/dev/cxgb/ (props changed)
stable/7/sys/fs/pseudofs/pseudofs_vncache.c
Modified: stable/7/sys/fs/pseudofs/pseudofs_vncache.c
==============================================================================
--- stable/7/sys/fs/pseudofs/pseudofs_vncache.c Thu Jan 29 11:13:03 2009 (r187889)
+++ stable/7/sys/fs/pseudofs/pseudofs_vncache.c Thu Jan 29 11:17:11 2009 (r187890)
@@ -149,6 +149,7 @@ retry:
/* nope, get a new one */
MALLOC(pvd, struct pfs_vdata *, sizeof *pvd, M_PFSVNCACHE, M_WAITOK);
+ pvd->pvd_next = pvd->pvd_prev = NULL;
error = getnewvnode("pseudofs", mp, &pfs_vnodeops, vpp);
if (error) {
FREE(pvd, M_PFSVNCACHE);
@@ -246,7 +247,7 @@ pfs_vncache_free(struct vnode *vp)
pvd->pvd_next->pvd_prev = pvd->pvd_prev;
if (pvd->pvd_prev)
pvd->pvd_prev->pvd_next = pvd->pvd_next;
- else
+ else if (pfs_vncache == pvd)
pfs_vncache = pvd->pvd_next;
--pfs_vncache_entries;
mtx_unlock(&pfs_vncache_mutex);
More information about the svn-src-stable-7
mailing list