On 08/08/2013 13:46, Robert Millan wrote:
> Package: kfreebsd-image-9.0-2-amd64
> Version: 9.0-10+deb70.1
> Severity: grave
>
> A few days ago I started getting kernel page faults. In my setup the
> problem is 100% reproducible and triggered by the following conditions:
>
> - FreeBSD chroot with nullfs mounts for /home and /tmp.
>
> - Run thunderbird within the chroot. Within a minute, kernel page faults.
>
> A backtrace is attached, which points to null_remove as the culprit.
> Also, the process triggering this is part of FAM (File Alteration
> Monitor) framework, which makes me suspect the kind of agressive
> filesystem usage of this library is related to the panic.
>
> As the problem is not reproducible with upstream kernel, I tried
> disabling our nullfs-related patches. It turns out removing
> 101_nullfs_vsock.diff makes the problem disappear!
>
> Also, much to my surprise, the problem 101_nullfs_vsock.diff is supposed
> to fix (unavailability of X service to apps within the chroot) doesn't
> manifest itself. Could it be that upstream had already fixed this in
> another way by the time 9.0 was released?
>
> Some advice would be appreciated. I'm inclined to remove the patch if
> possible.
Perhaps a more conservative approach, could be to replace the patch with
the one that went into 9-STABLE (attached).
What do you think? If noone objects, I'd like to request pre-approval to
-release to include it in Wheezy.
--
Robert Millan
Index: UPDATING
===================================================================
--- UPDATING (revision 234659)
+++ UPDATING (revision 234660)
@@ -9,6 +9,14 @@
Items affecting the ports and packages system can be found in
/usr/ports/UPDATING. Please read that file before running portupgrade.
+20120422:
+ Now unix domain sockets behave "as expected" on nullfs(5). Previously
+ nullfs(5) did not pass through all behaviours to the underlying layer,
+ as a result if we bound to a socket on the lower layer we could connect
+ only to the lower path; if we bound to the upper layer we could connect
+ only to the upper path. The new behavior is one can connect to both the
+ lower and the upper paths regardless what layer path one binds to.
+
20120109:
The acpi_wmi(4) status device /dev/wmistat has been renamed to
/dev/wmistat0.
Property changes on: UPDATING
___________________________________________________________________
Modified: svn:mergeinfo
Merged /head/UPDATING:r232317
Index: sys/kern/vnode_if.src
===================================================================
--- sys/kern/vnode_if.src (revision 234659)
+++ sys/kern/vnode_if.src (revision 234660)
@@ -640,23 +640,31 @@
IN int advice;
};
-# The VOPs below are spares at the end of the table to allow new VOPs to be
-# added in stable branches without breaking the KBI. New VOPs in HEAD should
-# be added above these spares. When merging a new VOP to a stable branch,
-# the new VOP should replace one of the spares.
+%% unp_bind vp E E E
-vop_spare1 {
+vop_unp_bind {
IN struct vnode *vp;
+ IN struct socket *socket;
};
-vop_spare2 {
+%% unp_connect vp L L L
+
+vop_unp_connect {
IN struct vnode *vp;
+ OUT struct socket **socket;
};
-vop_spare3 {
+%% unp_detach vp = = =
+
+vop_unp_detach {
IN struct vnode *vp;
};
+# The VOPs below are spares at the end of the table to allow new VOPs to be
+# added in stable branches without breaking the KBI. New VOPs in HEAD should
+# be added above these spares. When merging a new VOP to a stable branch,
+# the new VOP should replace one of the spares.
+
vop_spare4 {
IN struct vnode *vp;
};
Index: sys/kern/uipc_usrreq.c
===================================================================
--- sys/kern/uipc_usrreq.c (revision 234659)
+++ sys/kern/uipc_usrreq.c (revision 234660)
@@ -541,7 +541,7 @@
UNP_LINK_WLOCK();
UNP_PCB_LOCK(unp);
- vp->v_socket = unp->unp_socket;
+ VOP_UNP_BIND(vp, unp->unp_socket);
unp->unp_vnode = vp;
unp->unp_addr = soun;
unp->unp_flags &= ~UNP_BINDING;
@@ -637,7 +637,7 @@
* XXXRW: Should assert vp->v_socket == so.
*/
if ((vp = unp->unp_vnode) != NULL) {
- unp->unp_vnode->v_socket = NULL;
+ VOP_UNP_DETACH(vp);
unp->unp_vnode = NULL;
}
unp2 = unp->unp_conn;
@@ -1307,7 +1307,7 @@
* and to protect simultaneous locking of multiple pcbs.
*/
UNP_LINK_WLOCK();
- so2 = vp->v_socket;
+ VOP_UNP_CONNECT(vp, &so2);
if (so2 == NULL) {
error = ECONNREFUSED;
goto bad2;
@@ -2317,17 +2317,15 @@
active = 0;
UNP_LINK_WLOCK();
- so = vp->v_socket;
+ VOP_UNP_CONNECT(vp, &so);
if (so == NULL)
goto done;
unp = sotounpcb(so);
if (unp == NULL)
goto done;
UNP_PCB_LOCK(unp);
- if (unp->unp_vnode != NULL) {
- KASSERT(unp->unp_vnode == vp,
- ("vfs_unp_reclaim: vp != unp->unp_vnode"));
- vp->v_socket = NULL;
+ if (unp->unp_vnode == vp) {
+ VOP_UNP_DETACH(vp);
unp->unp_vnode = NULL;
active = 1;
}
Index: sys/kern/vfs_default.c
===================================================================
--- sys/kern/vfs_default.c (revision 234659)
+++ sys/kern/vfs_default.c (revision 234660)
@@ -123,6 +123,9 @@
.vop_unlock = vop_stdunlock,
.vop_vptocnp = vop_stdvptocnp,
.vop_vptofh = vop_stdvptofh,
+ .vop_unp_bind = vop_stdunp_bind,
+ .vop_unp_connect = vop_stdunp_connect,
+ .vop_unp_detach = vop_stdunp_detach,
};
/*
@@ -1037,6 +1040,30 @@
return (error);
}
+int
+vop_stdunp_bind(struct vop_unp_bind_args *ap)
+{
+
+ ap->a_vp->v_socket = ap->a_socket;
+ return (0);
+}
+
+int
+vop_stdunp_connect(struct vop_unp_connect_args *ap)
+{
+
+ *ap->a_socket = ap->a_vp->v_socket;
+ return (0);
+}
+
+int
+vop_stdunp_detach(struct vop_unp_detach_args *ap)
+{
+
+ ap->a_vp->v_socket = NULL;
+ return (0);
+}
+
/*
* vfs default ops
* used to fill the vfs function table to get reasonable default return values.
Index: sys/sys/vnode.h
===================================================================
--- sys/sys/vnode.h (revision 234659)
+++ sys/sys/vnode.h (revision 234660)
@@ -707,6 +707,9 @@
int vop_stdpoll(struct vop_poll_args *);
int vop_stdvptocnp(struct vop_vptocnp_args *ap);
int vop_stdvptofh(struct vop_vptofh_args *ap);
+int vop_stdunp_bind(struct vop_unp_bind_args *ap);
+int vop_stdunp_connect(struct vop_unp_connect_args *ap);
+int vop_stdunp_detach(struct vop_unp_detach_args *ap);
int vop_eopnotsupp(struct vop_generic_args *ap);
int vop_ebadf(struct vop_generic_args *ap);
int vop_einval(struct vop_generic_args *ap);
Property changes on: sys
___________________________________________________________________
Modified: svn:mergeinfo
Merged /head/sys:r232317