aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/gnu/fs/xfs/FreeBSD/xfs_mountops.c2
-rw-r--r--sys/gnu/fs/xfs/FreeBSD/xfs_vnode.c15
-rw-r--r--sys/kern/vfs_subr.c2
3 files changed, 14 insertions, 5 deletions
diff --git a/sys/gnu/fs/xfs/FreeBSD/xfs_mountops.c b/sys/gnu/fs/xfs/FreeBSD/xfs_mountops.c
index 244ad3099e84..ea815b21e74e 100644
--- a/sys/gnu/fs/xfs/FreeBSD/xfs_mountops.c
+++ b/sys/gnu/fs/xfs/FreeBSD/xfs_mountops.c
@@ -199,6 +199,8 @@ _xfs_mount(struct mount *mp,
if (mp->mnt_flag & MNT_UPDATE)
return (0);
+ if ((mp->mnt_flag & MNT_RDONLY) == 0)
+ return (EPERM);
xmp = xfsmount_allocate(mp);
if (xmp == NULL)
diff --git a/sys/gnu/fs/xfs/FreeBSD/xfs_vnode.c b/sys/gnu/fs/xfs/FreeBSD/xfs_vnode.c
index 8e2b1f97274a..3b3f3e5b4916 100644
--- a/sys/gnu/fs/xfs/FreeBSD/xfs_vnode.c
+++ b/sys/gnu/fs/xfs/FreeBSD/xfs_vnode.c
@@ -104,13 +104,18 @@ vn_get(
vp = vmap->v_vp;
- error = vget(vp, 0, curthread);
- if (error) {
- vdrop(vp);
+ error = vget(vp, LK_EXCLUSIVE, curthread);
+ vdrop(vp);
+ if (error)
return (NULL);
- }
- vdrop(vp);
+ /*
+ * Drop the vnode returned by vget here.
+ * VOP_RECLAIM(9) should block on internal XFS locks so that
+ * the reclaiming scheme still remains consistent even if the
+ * vp is not locked.
+ */
+ VOP_UNLOCK(vp, 0);
if (vp->v_data != xfs_vp) {
vput(vp);
return (NULL);
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index 2e7f52b75983..16fa8e4137c2 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -2038,6 +2038,8 @@ vget(struct vnode *vp, int flags, struct thread *td)
error = 0;
VFS_ASSERT_GIANT(vp->v_mount);
+ VNASSERT((flags & LK_TYPE_MASK) != 0, vp,
+ ("vget: invalid lock operation"));
if ((flags & LK_INTERLOCK) == 0)
VI_LOCK(vp);
vholdl(vp);