From eee673a6a7b12865b2bc6bbecd62f5c98f16fc56 Mon Sep 17 00:00:00 2001 From: jeff Date: Fri, 28 Apr 2006 01:05:31 +0000 Subject: - Add a BO_NEEDSGIANT flag to the bufobj. This flag forces all child buffers to go on the buf daemon's DIRTYGIANT queue. - Set BO_NEEDSGIANT on ffs's devvp since the ffs_copyonwrite handler runs in the context of the buf daemon and may require Giant. --- sys/kern/vfs_subr.c | 3 ++- sys/sys/bufobj.h | 1 + sys/ufs/ffs/ffs_vfsops.c | 8 +++++++- 3 files changed, 10 insertions(+), 2 deletions(-) (limited to 'sys') diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index ca85d6f..dbef93b 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -1446,7 +1446,8 @@ bgetvp(struct vnode *vp, struct buf *bp) ASSERT_VI_LOCKED(vp, "bgetvp"); vholdl(vp); - if (VFS_NEEDSGIANT(vp->v_mount)) + if (VFS_NEEDSGIANT(vp->v_mount) || + vp->v_bufobj.bo_flag & BO_NEEDSGIANT) bp->b_flags |= B_NEEDSGIANT; bp->b_vp = vp; bp->b_bufobj = &vp->v_bufobj; diff --git a/sys/sys/bufobj.h b/sys/sys/bufobj.h index cab7fb0..d97066a 100644 --- a/sys/sys/bufobj.h +++ b/sys/sys/bufobj.h @@ -106,6 +106,7 @@ struct bufobj { */ #define BO_ONWORKLST (1 << 0) /* On syncer work-list */ #define BO_WWAIT (1 << 1) /* Wait for output to complete */ +#define BO_NEEDSGIANT (1 << 2) /* Require giant for child buffers. */ #define BO_LOCK(bo) \ do { \ diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c index 0d8372a..9466d1a 100644 --- a/sys/ufs/ffs/ffs_vfsops.c +++ b/sys/ufs/ffs/ffs_vfsops.c @@ -831,7 +831,13 @@ ffs_mountfs(devvp, mp, td) (void) ufs_extattr_autostart(mp, td); #endif /* !UFS_EXTATTR_AUTOSTART */ #endif /* !UFS_EXTATTR */ -#ifndef QUOTA +#ifdef QUOTA + /* + * Our bufobj must require giant for snapshots when quotas are + * enabled. + */ + devvp->v_bufobj.bo_flags |= BO_NEEDSGIANT; +#else mp->mnt_kern_flag |= MNTK_MPSAFE; #endif return (0); -- cgit v1.1