* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * @(#)ffs_vfsops.c 7.25 (Berkeley) %G%
+ * @(#)ffs_vfsops.c 7.29 (Berkeley) %G%
*/
#include "param.h"
if (flags & MNT_FORCE)
return (EINVAL);
ump = VFSTOUFS(mp);
-#ifdef QUOTA
- if ((error = iflush(dev, mp->m_qinod)) && !forcibly)
-#else
- if ((error = iflush(dev)) && !forcibly)
-#endif
+ if (error = vflush(mp, ITOV(ump->um_qinod), flags))
return (error);
#ifdef QUOTA
(void) closedq(ump);
/*
- * Here we have to iflush again to get rid of the quota inode.
* A drag, but it would be ugly to cheat, & this doesn't happen often.
*/
- (void) iflush(mp, (struct inode *)NULL);
+ if (vflush(mp, (struct vnode *)NULL, MNT_NOFORCE))
+ panic("ufs_unmount: quota");
#endif
fs = ump->um_fs;
ronly = !fs->fs_ronly;
if (fs->fs_magic != FS_MAGIC)
panic("ufs_statfs");
sbp->f_type = MOUNT_UFS;
- sbp->f_flags = mp->m_flag &~ (M_MLOCK|M_MWAIT);
sbp->f_fsize = fs->fs_fsize;
sbp->f_bsize = fs->fs_bsize;
sbp->f_blocks = fs->fs_dsize;
(fs->fs_dsize - sbp->f_bfree);
sbp->f_files = fs->fs_ncg * fs->fs_ipg - ROOTINO;
sbp->f_ffree = fs->fs_cstotal.cs_nifree;
- sbp->f_fsid = mp->m_fsid;
bcopy((caddr_t)fs->fs_fsmnt, (caddr_t)&sbp->f_mntonname[0], MNAMELEN);
bcopy((caddr_t)ump->um_mntname, (caddr_t)&sbp->f_mntfromname[0],
MNAMELEN);
register struct inode *ip;
register struct ufsmount *ump = VFSTOUFS(mp);
register struct fs *fs;
- int error = 0;
+ int error, allerror = 0;
static int updlock = 0;
if (syncprt)
*/
for (vp = mp->m_mounth; vp; vp = vp->v_mountf) {
ip = VTOI(vp);
- if ((ip->i_flag & ILOCKED) != 0 || ITOV(ip)->v_count == 0 ||
+ if ((ip->i_flag & ILOCKED) != 0 || vp->v_count == 0 ||
(ip->i_flag & (IMOD|IACC|IUPD|ICHG)) == 0)
continue;
- ILOCK(ip);
VREF(vp);
- error = iupdat(ip, &time, &time, waitfor == MNT_WAIT);
- iput(ip);
+ VOP_LOCK(vp);
+ if (error = VOP_FSYNC(vp, 0, NOCRED, waitfor))
+ allerror = error;
+ vput(vp);
}
updlock = 0;
/*
* Force stale buffer cache information to be flushed.
*/
bflush(ump->um_devvp->v_mount);
- return (error);
+ return (allerror);
}
/*
vput(vp);
return (ENOTBLK);
}
- if (major(vp->v_rdev) >= nblkdev)
+ if (major(vp->v_rdev) >= nblkdev) {
+ vput(vp);
return (ENXIO);
+ }
iunlock(VTOI(vp));
*devvpp = vp;
return (0);