X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/0737b714c940cf72d432dd7c3598c16167ff0a60..a51a6e74e61aae3b98d55c4038a6ef0f078d1b5e:/usr/src/sys/ufs/lfs/lfs_vnops.c diff --git a/usr/src/sys/ufs/lfs/lfs_vnops.c b/usr/src/sys/ufs/lfs/lfs_vnops.c index 087eb4dd01..e040f736d0 100644 --- a/usr/src/sys/ufs/lfs/lfs_vnops.c +++ b/usr/src/sys/ufs/lfs/lfs_vnops.c @@ -1,4 +1,4 @@ -/* lfs_vnops.c 3.2 %H% */ +/* lfs_vnops.c 4.5 %G% */ #include "../h/param.h" #include "../h/systm.h" @@ -65,7 +65,7 @@ off_t pipeadj; register struct buf *bp; struct stat ds; - IUPDAT(ip, &time, &time); + IUPDAT(ip, &time, &time, 0); /* * first copy from inode table */ @@ -181,9 +181,9 @@ smount() } mp->m_inodp = ip; mp->m_dev = dev; - mp->m_bufp = geteblk(); - bcopy((caddr_t)bp->b_un.b_addr, mp->m_bufp->b_un.b_addr, BSIZE); - fp = mp->m_bufp->b_un.b_filsys; + bp->b_flags |= B_LOCKED; + mp->m_bufp = bp; + fp = bp->b_un.b_filsys; fp->s_ilock = 0; fp->s_flock = 0; fp->s_ronly = uap->ronly & 1; @@ -209,6 +209,7 @@ sumount() register struct inode *ip; register struct mount *mp; struct buf *bp; + int stillopen, flag; register struct a { char *fspec; }; @@ -225,19 +226,29 @@ sumount() return; found: + stillopen = 0; for(ip = &inode[0]; ip < &inode[NINODE]; ip++) - if(ip->i_number != 0 && dev == ip->i_dev) { + if (ip->i_number != 0 && dev == ip->i_dev) { u.u_error = EBUSY; return; - } - (*bdevsw[major(dev)].d_close)(dev, 0); + } else if (ip->i_number != 0 && (ip->i_mode&IFMT) == IFBLK && + ip->i_un.i_rdev == dev) + stillopen++; ip = mp->m_inodp; ip->i_flag &= ~IMOUNT; plock(ip); iput(ip); - bp = mp->m_bufp; + if ((bp = getblk(dev, SUPERB)) != mp->m_bufp) + panic("umount"); + bp->b_flags &= ~B_LOCKED; + flag = !bp->b_un.b_filsys->s_ronly; mp->m_bufp = NULL; brelse(bp); + if (!stillopen) { + mpurge(mp - &mount[0]); + (*bdevsw[major(dev)].d_close)(dev, flag); + binval(dev); + } } /* @@ -251,10 +262,8 @@ getmdev() dev_t dev; register struct inode *ip; -#ifdef UCB if (!suser()) return(NODEV); -#endif ip = namei(uchar, 0); if(ip == NULL) return(NODEV);