diff options
author | bde <bde@FreeBSD.org> | 1998-05-17 18:09:28 +0000 |
---|---|---|
committer | bde <bde@FreeBSD.org> | 1998-05-17 18:09:28 +0000 |
commit | 183e758e9a7d54aa3d6e2cae4ea8c54513450460 (patch) | |
tree | 4e40812a90c4c736578779226716b2ed057588db /sys/msdosfs | |
parent | 43a6b5d9bad49881aaf137c31b8a004b27e10088 (diff) | |
download | FreeBSD-src-183e758e9a7d54aa3d6e2cae4ea8c54513450460.zip FreeBSD-src-183e758e9a7d54aa3d6e2cae4ea8c54513450460.tar.gz |
Don't forget to clean up after an error reading the directory entry
in deget().
Diffstat (limited to 'sys/msdosfs')
-rw-r--r-- | sys/msdosfs/msdosfs_denode.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/sys/msdosfs/msdosfs_denode.c b/sys/msdosfs/msdosfs_denode.c index 0930487..40eddbc 100644 --- a/sys/msdosfs/msdosfs_denode.c +++ b/sys/msdosfs/msdosfs_denode.c @@ -1,4 +1,4 @@ -/* $Id: msdosfs_denode.c,v 1.36 1998/05/17 11:53:06 phk Exp $ */ +/* $Id: msdosfs_denode.c,v 1.37 1998/05/17 18:00:45 bde Exp $ */ /* $NetBSD: msdosfs_denode.c,v 1.28 1998/02/10 14:10:00 mrg Exp $ */ /*- @@ -274,7 +274,6 @@ deget(pmp, dirclust, diroffset, depp) msdosfs_hashins(ldep); ldep->de_pmp = pmp; - ldep->de_devvp = pmp->pm_devvp; ldep->de_refcnt = 1; /* * Copy the directory entry into the denode area of the vnode. @@ -315,8 +314,18 @@ deget(pmp, dirclust, diroffset, depp) /* leave the other fields as garbage */ } else { error = readep(pmp, dirclust, diroffset, &bp, &direntptr); - if (error) + if (error) { + /* + * The denode does not contain anything useful, so + * it would be wrong to leave it on its hash chain. + * Arrange for vput() to just forget about it. + */ + ldep->de_Name[0] = SLOT_DELETED; + + vput(nvp); + *depp = NULL; return (error); + } DE_INTERNALIZE(ldep, direntptr); brelse(bp); } @@ -348,6 +357,7 @@ deget(pmp, dirclust, diroffset, depp) getmicrouptime(&tv); SETHIGH(ldep->de_modrev, tv.tv_sec); SETLOW(ldep->de_modrev, tv.tv_usec * 4294); + ldep->de_devvp = pmp->pm_devvp; VREF(ldep->de_devvp); *depp = ldep; return (0); |