X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/4a18fb8e668dda5e1505f7492353b85aeb3097d7..75105cf0712b5effbaf98adf852ec6c4831ce763:/usr/src/sys/ufs/ffs/ufs_vnops.c?ds=inline diff --git a/usr/src/sys/ufs/ffs/ufs_vnops.c b/usr/src/sys/ufs/ffs/ufs_vnops.c index ad469d1dcd..78ead9bed7 100644 --- a/usr/src/sys/ufs/ffs/ufs_vnops.c +++ b/usr/src/sys/ufs/ffs/ufs_vnops.c @@ -1,4 +1,4 @@ -/* ufs_vnops.c 4.3 %G% */ +/* ufs_vnops.c 4.7 %G% */ #include "../h/param.h" #include "../h/systm.h" @@ -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,8 +209,7 @@ sumount() register struct inode *ip; register struct mount *mp; struct buf *bp; - int flag; - int stillopen = 0; + int stillopen, flag; register struct a { char *fspec; }; @@ -227,23 +226,26 @@ sumount() return; found: - for(ip = &inode[0]; ip < &inode[NINODE]; ip++) - if(ip->i_number != 0 && dev == ip->i_dev) { + stillopen = 0; + for(ip = inode; ip < inodeNINODE; ip++) + if (ip->i_number != 0 && dev == ip->i_dev) { u.u_error = EBUSY; return; - } else if (ip->i_number != 0 && (ip->i_mode&IFMT) == IFBLK - && ip->i_un.i_rdev == dev) - stillopen++; + } 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); + mpurge(mp - &mount[0]); if (!stillopen) { - mpurge(mp - &mount[0]); (*bdevsw[major(dev)].d_close)(dev, flag); binval(dev); }