summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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