The branch stable/15 has been updated by kib:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=b4fe667b2fddde0101fca4e431868336cc5c4099

commit b4fe667b2fddde0101fca4e431868336cc5c4099
Author:     Konstantin Belousov <[email protected]>
AuthorDate: 2025-10-08 15:47:15 +0000
Commit:     Konstantin Belousov <[email protected]>
CommitDate: 2025-10-16 02:22:20 +0000

    nullfs: add nounixbypass mount option
    
    (cherry picked from commit 6fa205a6233fea7c41ba0306c778bc5cab37ce7d)
---
 sys/fs/nullfs/null.h        | 5 +++--
 sys/fs/nullfs/null_subr.c   | 4 +++-
 sys/fs/nullfs/null_vfsops.c | 9 +++++++++
 sys/fs/nullfs/null_vnops.c  | 8 ++++++++
 4 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/sys/fs/nullfs/null.h b/sys/fs/nullfs/null.h
index abd652c4ac1c..d07e5c8643b9 100644
--- a/sys/fs/nullfs/null.h
+++ b/sys/fs/nullfs/null.h
@@ -35,7 +35,8 @@
 #ifndef        FS_NULL_H
 #define        FS_NULL_H
 
-#define        NULLM_CACHE     0x0001
+#define        NULLM_CACHE             0x0001
+#define        NULLM_NOUNPBYPASS       0x0002
 
 struct null_mount {
        struct mount    *nullm_vfs;
@@ -86,7 +87,7 @@ null_is_nullfs_vnode(struct vnode *vp)
        const struct vop_vector *op;
 
        op = vp->v_op;
-       return (op == &null_vnodeops);
+       return (op == &null_vnodeops || op == &null_vnodeops_no_unp_bypass);
 }
 
 #ifdef MALLOC_DECLARE
diff --git a/sys/fs/nullfs/null_subr.c b/sys/fs/nullfs/null_subr.c
index 7dcc83880bb9..d71e91cfacf1 100644
--- a/sys/fs/nullfs/null_subr.c
+++ b/sys/fs/nullfs/null_subr.c
@@ -210,7 +210,9 @@ null_nodeget(struct mount *mp, struct vnode *lowervp, 
struct vnode **vpp)
         */
        xp = malloc(sizeof(struct null_node), M_NULLFSNODE, M_WAITOK);
 
-       error = getnewvnode("nullfs", mp, &null_vnodeops, &vp);
+       error = getnewvnode("nullfs", mp, (MOUNTTONULLMOUNT(mp)->nullm_flags &
+           NULLM_NOUNPBYPASS) != 0 ? &null_vnodeops_no_unp_bypass :
+           &null_vnodeops, &vp);
        if (error) {
                vput(lowervp);
                free(xp, M_NULLFSNODE);
diff --git a/sys/fs/nullfs/null_vfsops.c b/sys/fs/nullfs/null_vfsops.c
index 483d4182e65e..170a3dd51cd8 100644
--- a/sys/fs/nullfs/null_vfsops.c
+++ b/sys/fs/nullfs/null_vfsops.c
@@ -87,6 +87,8 @@ nullfs_mount(struct mount *mp)
        bool isvnunlocked;
        static const char cache_opt_name[] = "cache";
        static const char nocache_opt_name[] = "nocache";
+       static const char unixbypass_opt_name[] = "unixbypass";
+       static const char nounixbypass_opt_name[] = "nounixbypass";
 
        NULLFSDEBUG("nullfs_mount(mp = %p)\n", (void *)mp);
 
@@ -222,6 +224,13 @@ nullfs_mount(struct mount *mp)
                    &xmp->notify_node);
        }
 
+       if (vfs_getopt(mp->mnt_optnew, unixbypass_opt_name, NULL, NULL) == 0) {
+               ;
+       } else if (vfs_getopt(mp->mnt_optnew, nounixbypass_opt_name, NULL,
+           NULL) == 0) {
+               xmp->nullm_flags |= NULLM_NOUNPBYPASS;
+       }
+
        if (lowerrootvp == mp->mnt_vnodecovered) {
                vn_lock(lowerrootvp, LK_EXCLUSIVE | LK_RETRY | LK_CANRECURSE);
                lowerrootvp->v_vflag |= VV_CROSSLOCK;
diff --git a/sys/fs/nullfs/null_vnops.c b/sys/fs/nullfs/null_vnops.c
index ebb765b0a1c5..acbe4cb03f76 100644
--- a/sys/fs/nullfs/null_vnops.c
+++ b/sys/fs/nullfs/null_vnops.c
@@ -1215,3 +1215,11 @@ struct vop_vector null_vnodeops = {
        .vop_copy_file_range =  VOP_PANIC,
 };
 VFS_VOP_VECTOR_REGISTER(null_vnodeops);
+
+struct vop_vector null_vnodeops_no_unp_bypass = {
+       .vop_default =          &null_vnodeops,
+       .vop_unp_bind =         vop_stdunp_bind,
+       .vop_unp_connect =      vop_stdunp_connect,
+       .vop_unp_detach =       vop_stdunp_detach,
+};
+VFS_VOP_VECTOR_REGISTER(null_vnodeops_no_unp_bypass);

Reply via email to