summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2006-04-28 01:05:31 +0000
committerjeff <jeff@FreeBSD.org>2006-04-28 01:05:31 +0000
commiteee673a6a7b12865b2bc6bbecd62f5c98f16fc56 (patch)
treec6aad5a9284f69701435f748943737d89dbdf66c /sys
parent3450f7fc51535f7c00c61837e2187629c7d2af24 (diff)
downloadFreeBSD-src-eee673a6a7b12865b2bc6bbecd62f5c98f16fc56.zip
FreeBSD-src-eee673a6a7b12865b2bc6bbecd62f5c98f16fc56.tar.gz
- 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.
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/vfs_subr.c3
-rw-r--r--sys/sys/bufobj.h1
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c8
3 files changed, 10 insertions, 2 deletions
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);
OpenPOWER on IntegriCloud