-/* ffs_vnops.c 3.5 %G% */
+/* ffs_vnops.c 4.4 %G% */
#include "../h/param.h"
#include "../h/systm.h"
}
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;
register struct inode *ip;
register struct mount *mp;
struct buf *bp;
+ int stillopen, flag;
register struct a {
char *fspec;
};
found:
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;
- }
- mpurge(mp - &mount[0]);
- (*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);
+ }
}
/*
dev_t dev;
register struct inode *ip;
-#ifdef UCB
if (!suser())
return(NODEV);
-#endif
ip = namei(uchar, 0);
if(ip == NULL)
return(NODEV);