aboutsummaryrefslogtreecommitdiff
path: root/sys/fs
diff options
context:
space:
mode:
authorJason A. Harmening <jah@FreeBSD.org>2023-12-24 04:42:28 +0000
committerJason A. Harmening <jah@FreeBSD.org>2024-02-18 15:18:07 +0000
commit2656fc29be8b0fc1cd9e64ed52aa0a61fe87744c (patch)
treec55c03cef3bb0617e5f523addacf56bb1eab1cc3 /sys/fs
parent9530182e371dee382b76d8594f65633a304b396f (diff)
downloadsrc-2656fc29be8b0fc1cd9e64ed52aa0a61fe87744c.tar.gz
src-2656fc29be8b0fc1cd9e64ed52aa0a61fe87744c.zip
Diffstat (limited to 'sys/fs')
-rw-r--r--sys/fs/unionfs/union_vfsops.c3
-rw-r--r--sys/fs/unionfs/union_vnops.c8
2 files changed, 10 insertions, 1 deletions
diff --git a/sys/fs/unionfs/union_vfsops.c b/sys/fs/unionfs/union_vfsops.c
index 8635600549b1..cb55c2dd6474 100644
--- a/sys/fs/unionfs/union_vfsops.c
+++ b/sys/fs/unionfs/union_vfsops.c
@@ -348,7 +348,8 @@ unionfs_domount(struct mount *mp)
if ((ump->um_lowermp->mnt_flag & MNT_LOCAL) != 0 &&
(ump->um_uppermp->mnt_flag & MNT_LOCAL) != 0)
mp->mnt_flag |= MNT_LOCAL;
- mp->mnt_kern_flag |= MNTK_NOMSYNC | MNTK_UNIONFS;
+ mp->mnt_kern_flag |= MNTK_NOMSYNC | MNTK_UNIONFS |
+ (ump->um_uppermp->mnt_kern_flag & MNTK_SHARED_WRITES);
MNT_IUNLOCK(mp);
/*
diff --git a/sys/fs/unionfs/union_vnops.c b/sys/fs/unionfs/union_vnops.c
index cb2bed925399..3ea427b5b53c 100644
--- a/sys/fs/unionfs/union_vnops.c
+++ b/sys/fs/unionfs/union_vnops.c
@@ -998,14 +998,22 @@ unionfs_fsync(struct vop_fsync_args *ap)
struct unionfs_node *unp;
struct unionfs_node_status *unsp;
struct vnode *ovp;
+ enum unionfs_lkupgrade lkstatus;
KASSERT_UNIONFS_VNODE(ap->a_vp);
unp = VTOUNIONFS(ap->a_vp);
+ lkstatus = unionfs_upgrade_lock(ap->a_vp);
+ if (lkstatus == UNIONFS_LKUPGRADE_DOOMED) {
+ unionfs_downgrade_lock(ap->a_vp, lkstatus);
+ return (ENOENT);
+ }
unionfs_get_node_status(unp, ap->a_td, &unsp);
ovp = (unsp->uns_upper_opencnt ? unp->un_uppervp : unp->un_lowervp);
unionfs_tryrem_node_status(unp, unsp);
+ unionfs_downgrade_lock(ap->a_vp, lkstatus);
+
if (ovp == NULLVP)
return (EBADF);