summaryrefslogtreecommitdiffstats
path: root/sys/fs
diff options
context:
space:
mode:
authorjh <jh@FreeBSD.org>2010-08-25 15:29:12 +0000
committerjh <jh@FreeBSD.org>2010-08-25 15:29:12 +0000
commit4a4bf3c51170fd6618c339831b7afbe0284378a2 (patch)
tree9fe4b5f894ce1a7c0198bc106bdb28ab34346d21 /sys/fs
parentd2b87ab5767b4dd49984883d979dd28c459b7968 (diff)
downloadFreeBSD-src-4a4bf3c51170fd6618c339831b7afbe0284378a2.zip
FreeBSD-src-4a4bf3c51170fd6618c339831b7afbe0284378a2.tar.gz
Call devfs_populate_vp() from devfs_getattr(). It was possible that
fstat(2) returned stale information through an open file descriptor.
Diffstat (limited to 'sys/fs')
-rw-r--r--sys/fs/devfs/devfs_vnops.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c
index 2e106fe..dfcdf1a 100644
--- a/sys/fs/devfs/devfs_vnops.c
+++ b/sys/fs/devfs/devfs_vnops.c
@@ -618,10 +618,18 @@ devfs_getattr(struct vop_getattr_args *ap)
{
struct vnode *vp = ap->a_vp;
struct vattr *vap = ap->a_vap;
- int error = 0;
+ int error;
struct devfs_dirent *de;
+ struct devfs_mount *dmp;
struct cdev *dev;
+ error = devfs_populate_vp(vp);
+ if (error != 0)
+ return (error);
+
+ dmp = VFSTODEVFS(vp->v_mount);
+ sx_xunlock(&dmp->dm_lock);
+
de = vp->v_data;
KASSERT(de != NULL, ("Null dirent in devfs_getattr vp=%p", vp));
if (vp->v_type == VDIR) {
OpenPOWER on IntegriCloud