diff --git a/sys/ntfs/ntfs.h b/sys/ntfs/ntfs.h index 8bb86264075d..681d430eb72d 100644 --- a/sys/ntfs/ntfs.h +++ b/sys/ntfs/ntfs.h @@ -1,4 +1,4 @@ -/* $NetBSD: ntfs.h,v 1.7 1999/09/11 15:55:12 jdolecek Exp $ */ +/* $NetBSD: ntfs.h,v 1.8 1999/10/25 19:08:26 jdolecek Exp $ */ /*- * Copyright (c) 1998, 1999 Semen Ustimenko @@ -305,17 +305,19 @@ MALLOC_DECLARE(M_NTFSNTHASH); typedef int (vop_t) __P((void *)); #define HASHINIT(a, b, c, d) hashinit((a), (b), (c), (d)) #define bqrelse(bp) brelse(bp) -#define VOP__LOCK(a, b, c) VOP_LOCK((a), (b) ? LK_EXCLUSIVE : LK_SHARED) #define VOP__UNLOCK(a, b, c) VOP_UNLOCK((a), 0) -#define VGET(a, b, c) vget((a), LK_EXCLUSIVE) -#define VN_LOCK(a, b, c) vn_lock((a), LK_EXCLUSIVE) -#else +#define VGET(a, b, c) vget((a), (b)) +#define VN_LOCK(a, b, c) vn_lock((a), (b)) +#else /* !NetBSD */ #define HASHINIT(a, b, c, d) hashinit((a), (b), (d)) -#define VOP__LOCK(a, b, c) VOP_LOCK((a), (b), (c)) #define VOP__UNLOCK(a, b, c) VOP_UNLOCK((a), (b), (c)) #define VGET(a, b, c) vget((a), (b), (c)) #define VN_LOCK(a, b, c) vn_lock((a), (b), (c)) -#endif + +/* PDIRUNLOCK is used by NetBSD to mark if vfs_lookup() unlocked parent dir; + * on FreeBSD, it's not defined and nothing similar exists */ +#define PDIRUNLOCK 0 +#endif /* NetBSD */ #if defined(NTFS_DEBUG) #define dprintf(a) printf a diff --git a/sys/ntfs/ntfs_subr.c b/sys/ntfs/ntfs_subr.c index f1fda40882f5..47c5806d1572 100644 --- a/sys/ntfs/ntfs_subr.c +++ b/sys/ntfs/ntfs_subr.c @@ -1,4 +1,4 @@ -/* $NetBSD: ntfs_subr.c,v 1.20 1999/10/10 14:48:37 jdolecek Exp $ */ +/* $NetBSD: ntfs_subr.c,v 1.21 1999/10/25 19:08:26 jdolecek Exp $ */ /*- * Copyright (c) 1998, 1999 Semen Ustimenko (semenu@FreeBSD.org) @@ -225,12 +225,11 @@ ntfs_ntvattrget( dprintf(("ntfs_ntvattrget: attribute in ino: %d\n", aalp->al_inumber)); -/* - error = VFS_VGET(ntmp->ntm_mountp, aalp->al_inumber, &newvp); -*/ + /* this is not a main record, so we can't use just plain + vget() */ error = ntfs_vgetex(ntmp->ntm_mountp, aalp->al_inumber, - NTFS_A_DATA, NULL, LK_EXCLUSIVE, - VG_EXT, curproc, &newvp); + NTFS_A_DATA, NULL, LK_EXCLUSIVE | LK_RETRY, + VG_EXT, curproc, &newvp); if (error) { printf("ntfs_ntvattrget: CAN'T VGET INO: %d\n", aalp->al_inumber); @@ -364,7 +363,7 @@ ntfs_ntget(ip) simple_lock(&ip->i_interlock); ip->i_usecount++; - lockmgr(&ip->i_lock, LK_EXCLUSIVE|LK_INTERLOCK, &ip->i_interlock); + lockmgr(&ip->i_lock, LK_EXCLUSIVE | LK_INTERLOCK, &ip->i_interlock); return 0; } @@ -394,7 +393,7 @@ ntfs_ntlookup( *ipp = ip; return (0); } - } while (lockmgr(&ntfs_hashlock, LK_EXCLUSIVE|LK_SLEEPFAIL, NULL)); + } while (lockmgr(&ntfs_hashlock, LK_EXCLUSIVE | LK_SLEEPFAIL, NULL)); MALLOC(ip, struct ntnode *, sizeof(struct ntnode), M_NTFSNTNODE, M_WAITOK); @@ -957,7 +956,8 @@ ntfs_ntlookupfile( /* vget node, but don't load it */ error = ntfs_vgetex(ntmp->ntm_mountp, iep->ie_number, attrtype, attrname, - LK_EXCLUSIVE, VG_DONTLOADIN | VG_DONTVALIDFN, + LK_EXCLUSIVE | LK_RETRY, + VG_DONTLOADIN | VG_DONTVALIDFN, curproc, &nvp); if (error) goto fail; diff --git a/sys/ntfs/ntfs_vfsops.c b/sys/ntfs/ntfs_vfsops.c index beab4b166b86..7ea289a6770d 100644 --- a/sys/ntfs/ntfs_vfsops.c +++ b/sys/ntfs/ntfs_vfsops.c @@ -1,4 +1,4 @@ -/* $NetBSD: ntfs_vfsops.c,v 1.20 1999/10/20 14:32:10 enami Exp $ */ +/* $NetBSD: ntfs_vfsops.c,v 1.21 1999/10/25 19:08:26 jdolecek Exp $ */ /*- * Copyright (c) 1998, 1999 Semen Ustimenko @@ -438,9 +438,9 @@ ntfs_mountfs(devvp, mp, argsp, p) if (ncount > 1 && devvp != rootvp) return (EBUSY); #if defined(__FreeBSD__) - vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, p); + VN_LOCK(devvp, LK_EXCLUSIVE | LK_RETRY, p); error = vinvalbuf(devvp, V_SAVE, p->p_ucred, p, 0, 0); - VOP_UNLOCK(devvp, 0, p); + VOP__UNLOCK(devvp, 0, p); #else error = vinvalbuf(devvp, V_SAVE, p->p_ucred, p, 0, 0); #endif @@ -607,9 +607,9 @@ out: #if defined __NetBSD__ /* lock the device vnode before calling VOP_CLOSE() */ - vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); + VN_LOCK(devvp, LK_EXCLUSIVE | LK_RETRY, p); (void)VOP_CLOSE(devvp, ronly ? FREAD : FREAD|FWRITE, NOCRED, p); - VOP_UNLOCK(devvp, 0); + VOP__UNLOCK(devvp, 0, p); #else (void)VOP_CLOSE(devvp, ronly ? FREAD : FREAD|FWRITE, NOCRED, p); #endif @@ -665,11 +665,11 @@ ntfs_unmount( #if defined(__FreeBSD__) ntmp->ntm_devvp->v_specmountpoint = NULL; - - VOP_LOCK(ntmp->ntm_devvp); - vnode_pager_uncache(ntmp->ntm_devvp); - VOP_UNLOCK(ntmp->ntm_devvp); #else + /* Check if the type of device node isn't VBAD before + * touching v_specinfo. If the device vnode is revoked, the + * field is NULL and touching it causes null pointer derefercence. + */ if (ntmp->ntm_devvp->v_type != VBAD) ntmp->ntm_devvp->v_specflags &= ~SI_MOUNTEDON; #endif @@ -681,7 +681,7 @@ ntfs_unmount( VOP_LOCK(ntmp->ntm_devvp, LK_EXCLUSIVE | LK_RETRY); error = VOP_CLOSE(ntmp->ntm_devvp, ronly ? FREAD : FREAD|FWRITE, NOCRED, p); - VOP_UNLOCK(ntmp->ntm_devvp, 0); + VOP__UNLOCK(ntmp->ntm_devvp, 0, p); #else error = VOP_CLOSE(ntmp->ntm_devvp, ronly ? FREAD : FREAD|FWRITE, NOCRED, p); @@ -928,12 +928,11 @@ ntfs_vgetex( if (!(flags & VG_DONTVALIDFN) && !(fp->f_flag & FN_VALID)) { if ((ip->i_frflag & NTFS_FRFLAG_DIR) && - (fp->f_attrtype == 0x80 && fp->f_attrname == NULL)) { + (fp->f_attrtype == NTFS_A_DATA && fp->f_attrname == NULL)) { f_type = VDIR; - } else if(flags & VG_EXT) { + } else if (flags & VG_EXT) { f_type = VNON; - - fp->f_size =fp->f_allocated = 0; + fp->f_size = fp->f_allocated = 0; } else { f_type = VREG; @@ -996,7 +995,7 @@ ntfs_vget( struct vnode **vpp) { return ntfs_vgetex(mp, ino, NTFS_A_DATA, NULL, - LK_EXCLUSIVE, 0, curproc, vpp); + LK_EXCLUSIVE | LK_RETRY, 0, curproc, vpp); } #if defined(__FreeBSD__) diff --git a/sys/ntfs/ntfs_vnops.c b/sys/ntfs/ntfs_vnops.c index bdc803d634d7..8f92bf7b56f9 100644 --- a/sys/ntfs/ntfs_vnops.c +++ b/sys/ntfs/ntfs_vnops.c @@ -1,4 +1,4 @@ -/* $NetBSD: ntfs_vnops.c,v 1.19 1999/10/10 14:19:54 jdolecek Exp $ */ +/* $NetBSD: ntfs_vnops.c,v 1.20 1999/10/25 19:08:26 jdolecek Exp $ */ /* * Copyright (c) 1992, 1993 @@ -789,9 +789,7 @@ ntfs_lookup(ap) return (error); VOP__UNLOCK(dvp,0,cnp->cn_proc); -#ifdef __NetBSD__ cnp->cn_flags |= PDIRUNLOCK; -#endif dprintf(("ntfs_lookup: parentdir: %d\n", vap->va_a_name->n_pnumber)); @@ -799,22 +797,18 @@ ntfs_lookup(ap) vap->va_a_name->n_pnumber,ap->a_vpp); ntfs_ntvattrrele(vap); if (error) { - if (vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY) == 0) { -#ifdef __NetBSD__ + if (VN_LOCK(dvp, LK_EXCLUSIVE | LK_RETRY, curproc) == 0) cnp->cn_flags &= ~PDIRUNLOCK; -#endif - } return(error); } if (lockparent && (cnp->cn_flags & ISLASTCN)) { - if ((error = vn_lock(dvp, LK_EXCLUSIVE))) { + error = VN_LOCK(dvp, LK_EXCLUSIVE | LK_RETRY, curproc); + if (error) { vput( *(ap->a_vpp) ); return (error); } -#ifdef __NetBSD__ cnp->cn_flags &= ~PDIRUNLOCK; -#endif } } else { error = ntfs_ntlookupfile(ntmp, dvp, cnp, ap->a_vpp);