[Glibc-bsd-commits] r2915 - in trunk/kfreebsd-8/debian: . patches

Petr Salinger ps-guest at alioth.debian.org
Fri Jan 8 14:34:08 UTC 2010


Author: ps-guest
Date: 2010-01-08 14:34:02 +0000 (Fri, 08 Jan 2010)
New Revision: 2915

Added:
   trunk/kfreebsd-8/debian/patches/000_mcinit.diff
   trunk/kfreebsd-8/debian/patches/000_multicast.diff
   trunk/kfreebsd-8/debian/patches/000_nfsreconnect.diff
   trunk/kfreebsd-8/debian/patches/000_sctp.diff
   trunk/kfreebsd-8/debian/patches/000_zfs.diff
   trunk/kfreebsd-8/debian/patches/000_zfsmac.diff
   trunk/kfreebsd-8/debian/patches/000_zfsvaccess.diff
Modified:
   trunk/kfreebsd-8/debian/changelog
   trunk/kfreebsd-8/debian/patches/000_rename.diff
   trunk/kfreebsd-8/debian/patches/series
Log:
FreeBSD-SA-10:03.zfs and FreeBSD-EN-10:01.freebsd



Modified: trunk/kfreebsd-8/debian/changelog
===================================================================
--- trunk/kfreebsd-8/debian/changelog	2010-01-08 14:20:59 UTC (rev 2914)
+++ trunk/kfreebsd-8/debian/changelog	2010-01-08 14:34:02 UTC (rev 2915)
@@ -1,3 +1,21 @@
+kfreebsd-8 (8.0-2) unstable; urgency=low
+
+  [ Petr Salinger ]
+  * Fix ZFS ZIL playback with insecure permissions
+    (FreeBSD-SA-10:03.zfs)
+      - 000_zfs.diff
+  * Fix various stability and performance problems
+    (FreeBSD-EN-10:01.freebsd)
+      - 000_mcinit.diff
+      - 000_multicast.diff
+      - 000_nfsreconnect.diff
+      - 000_rename.diff (already included)
+      - 000_sctp.diff
+      - 000_zfsmac.diff
+      - 000_zfsvaccess.diff
+
+ -- Aurelien Jarno <aurel32 at debian.org>  Thu, 26 Nov 2009 04:04:33 +0100
+
 kfreebsd-8 (8.0-1) unstable; urgency=low
 
   [ Petr Salinger ]

Added: trunk/kfreebsd-8/debian/patches/000_mcinit.diff
===================================================================
--- trunk/kfreebsd-8/debian/patches/000_mcinit.diff	                        (rev 0)
+++ trunk/kfreebsd-8/debian/patches/000_mcinit.diff	2010-01-08 14:34:02 UTC (rev 2915)
@@ -0,0 +1,18 @@
+--- a/sys/netinet/ip_mroute.c	(revision 201431)
++++ b/sys/netinet/ip_mroute.c	(working copy)
+@@ -1384,6 +1384,15 @@ fail:
+ 	    rt->mfc_rp.s_addr = INADDR_ANY;
+ 	    rt->mfc_bw_meter = NULL;
+ 
++	    /* initialize pkt counters per src-grp */
++	    rt->mfc_pkt_cnt = 0;
++	    rt->mfc_byte_cnt = 0;
++	    rt->mfc_wrong_if = 0;
++	    timevalclear(&rt->mfc_last_assert);
++
++	    TAILQ_INIT(&rt->mfc_stall);
++	    rt->mfc_nstall = 0;
++
+ 	    /* link into table */
+ 	    LIST_INSERT_HEAD(&mfchashtbl[hash], rt, mfc_hash);
+ 	    TAILQ_INSERT_HEAD(&rt->mfc_stall, rte, rte_link);

Added: trunk/kfreebsd-8/debian/patches/000_multicast.diff
===================================================================
--- trunk/kfreebsd-8/debian/patches/000_multicast.diff	                        (rev 0)
+++ trunk/kfreebsd-8/debian/patches/000_multicast.diff	2010-01-08 14:34:02 UTC (rev 2915)
@@ -0,0 +1,96 @@
+--- a/sys/netinet/raw_ip.c	(revision 200583)
++++ b/sys/netinet/raw_ip.c	(working copy)
+@@ -343,17 +343,35 @@ rip_input(struct mbuf *m, int off)
+ 		 */
+ 		if (inp->inp_moptions != NULL &&
+ 		    IN_MULTICAST(ntohl(ip->ip_dst.s_addr))) {
+-			struct sockaddr_in group;
++			/*
++			 * If the incoming datagram is for IGMP, allow it
++			 * through unconditionally to the raw socket.
++			 *
++			 * In the case of IGMPv2, we may not have explicitly
++			 * joined the group, and may have set IFF_ALLMULTI
++			 * on the interface. imo_multi_filter() may discard
++			 * control traffic we actually need to see.
++			 *
++			 * Userland multicast routing daemons should continue
++			 * filter the control traffic appropriately.
++			 */
+ 			int blocked;
+ 
+-			bzero(&group, sizeof(struct sockaddr_in));
+-			group.sin_len = sizeof(struct sockaddr_in);
+-			group.sin_family = AF_INET;
+-			group.sin_addr = ip->ip_dst;
++			blocked = MCAST_PASS;
++			if (proto != IPPROTO_IGMP) {
++				struct sockaddr_in group;
+ 
+-			blocked = imo_multi_filter(inp->inp_moptions, ifp,
+-			    (struct sockaddr *)&group,
+-			    (struct sockaddr *)&ripsrc);
++				bzero(&group, sizeof(struct sockaddr_in));
++				group.sin_len = sizeof(struct sockaddr_in);
++				group.sin_family = AF_INET;
++				group.sin_addr = ip->ip_dst;
++
++				blocked = imo_multi_filter(inp->inp_moptions,
++				    ifp,
++				    (struct sockaddr *)&group,
++				    (struct sockaddr *)&ripsrc);
++			}
++
+ 			if (blocked != MCAST_PASS) {
+ 				IPSTAT_INC(ips_notmember);
+ 				continue;
+--- a/sys/netinet6/raw_ip6.c	(revision 200583)
++++ b/sys/netinet6/raw_ip6.c	(working copy)
+@@ -213,17 +213,39 @@ rip6_input(struct mbuf **mp, int *offp, int proto)
+ 		 */
+ 		if (in6p->in6p_moptions &&
+ 		    IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst)) {
+-			struct sockaddr_in6 mcaddr;
++			/*
++			 * If the incoming datagram is for MLD, allow it
++			 * through unconditionally to the raw socket.
++			 *
++			 * Use the M_RTALERT_MLD flag to check for MLD
++			 * traffic without having to inspect the mbuf chain
++			 * more deeply, as all MLDv1/v2 host messages MUST
++			 * contain the Router Alert option.
++			 *
++			 * In the case of MLDv1, we may not have explicitly
++			 * joined the group, and may have set IFF_ALLMULTI
++			 * on the interface. im6o_mc_filter() may discard
++			 * control traffic we actually need to see.
++			 *
++			 * Userland multicast routing daemons should continue
++			 * filter the control traffic appropriately.
++			 */
+ 			int blocked;
+ 
+-			bzero(&mcaddr, sizeof(struct sockaddr_in6));
+-			mcaddr.sin6_len = sizeof(struct sockaddr_in6);
+-			mcaddr.sin6_family = AF_INET6;
+-			mcaddr.sin6_addr = ip6->ip6_dst;
++			blocked = MCAST_PASS;
++			if ((m->m_flags & M_RTALERT_MLD) == 0) {
++				struct sockaddr_in6 mcaddr;
+ 
+-			blocked = im6o_mc_filter(in6p->in6p_moptions, ifp,
+-			    (struct sockaddr *)&mcaddr,
+-			    (struct sockaddr *)&fromsa);
++				bzero(&mcaddr, sizeof(struct sockaddr_in6));
++				mcaddr.sin6_len = sizeof(struct sockaddr_in6);
++				mcaddr.sin6_family = AF_INET6;
++				mcaddr.sin6_addr = ip6->ip6_dst;
++
++				blocked = im6o_mc_filter(in6p->in6p_moptions,
++				    ifp,
++				    (struct sockaddr *)&mcaddr,
++				    (struct sockaddr *)&fromsa);
++			}
+ 			if (blocked != MCAST_PASS) {
+ 				IP6STAT_INC(ip6s_notmember);
+ 				continue;

Added: trunk/kfreebsd-8/debian/patches/000_nfsreconnect.diff
===================================================================
--- trunk/kfreebsd-8/debian/patches/000_nfsreconnect.diff	                        (rev 0)
+++ trunk/kfreebsd-8/debian/patches/000_nfsreconnect.diff	2010-01-08 14:34:02 UTC (rev 2915)
@@ -0,0 +1,25 @@
+--- a/sys/rpc/clnt_vc.c	(revision 200583)
++++ b/sys/rpc/clnt_vc.c	(working copy)
+@@ -413,6 +413,22 @@ call_again:
+ 
+ 	cr->cr_xid = xid;
+ 	mtx_lock(&ct->ct_lock);
++	/*
++	 * Check to see if the other end has already started to close down
++	 * the connection. The upcall will have set ct_error.re_status
++	 * to RPC_CANTRECV if this is the case.
++	 * If the other end starts to close down the connection after this
++	 * point, it will be detected later when cr_error is checked,
++	 * since the request is in the ct_pending queue.
++	 */
++	if (ct->ct_error.re_status == RPC_CANTRECV) {
++		if (errp != &ct->ct_error) {
++			errp->re_errno = ct->ct_error.re_errno;
++			errp->re_status = RPC_CANTRECV;
++		}
++		stat = RPC_CANTRECV;
++		goto out;
++	}
+ 	TAILQ_INSERT_TAIL(&ct->ct_pending, cr, cr_link);
+ 	mtx_unlock(&ct->ct_lock);
+ 

Modified: trunk/kfreebsd-8/debian/patches/000_rename.diff
===================================================================
--- trunk/kfreebsd-8/debian/patches/000_rename.diff	2010-01-08 14:20:59 UTC (rev 2914)
+++ trunk/kfreebsd-8/debian/patches/000_rename.diff	2010-01-08 14:34:02 UTC (rev 2915)
@@ -1,4 +1,6 @@
 
+Added into FreeBSD-EN-10:01.freebsd
+
 http://lists.freebsd.org/pipermail/svn-src-all/2009-November/015448.html
 
 Log:

Added: trunk/kfreebsd-8/debian/patches/000_sctp.diff
===================================================================
--- trunk/kfreebsd-8/debian/patches/000_sctp.diff	                        (rev 0)
+++ trunk/kfreebsd-8/debian/patches/000_sctp.diff	2010-01-08 14:34:02 UTC (rev 2915)
@@ -0,0 +1,12 @@
+--- a/sys/netinet/sctp_input.c	(revision 200583)
++++ b/sys/netinet/sctp_input.c	(working copy)
+@@ -834,6 +834,9 @@ sctp_handle_shutdown(struct sctp_shutdown_chunk *c
+ 		return;
+ 	} else {
+ 		sctp_update_acked(stcb, cp, net, abort_flag);
++		if (*abort_flag) {
++			return;
++		}
+ 	}
+ 	if (asoc->control_pdapi) {
+ 		/*

Added: trunk/kfreebsd-8/debian/patches/000_zfs.diff
===================================================================
--- trunk/kfreebsd-8/debian/patches/000_zfs.diff	                        (rev 0)
+++ trunk/kfreebsd-8/debian/patches/000_zfs.diff	2010-01-08 14:34:02 UTC (rev 2915)
@@ -0,0 +1,21 @@
+--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_replay.c	(revision 200583)
++++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_replay.c	(working copy)
+@@ -60,10 +60,14 @@ zfs_init_vattr(vattr_t *vap, uint64_t mask, uint64
+ {
+ 	VATTR_NULL(vap);
+ 	vap->va_mask = (uint_t)mask;
+-	vap->va_type = IFTOVT(mode);
+-	vap->va_mode = mode & MODEMASK;
+-	vap->va_uid = (uid_t)(IS_EPHEMERAL(uid)) ? -1 : uid;
+-	vap->va_gid = (gid_t)(IS_EPHEMERAL(gid)) ? -1 : gid;
++	if (mask & AT_TYPE)
++		vap->va_type = IFTOVT(mode);
++	if (mask & AT_MODE)
++		vap->va_mode = mode & MODEMASK;
++	if (mask & AT_UID)
++		vap->va_uid = (uid_t)(IS_EPHEMERAL(uid)) ? -1 : uid;
++	if (mask & AT_GID)
++		vap->va_gid = (gid_t)(IS_EPHEMERAL(gid)) ? -1 : gid;
+ 	vap->va_rdev = zfs_cmpldev(rdev);
+ 	vap->va_nodeid = nodeid;
+ }

Added: trunk/kfreebsd-8/debian/patches/000_zfsmac.diff
===================================================================
--- trunk/kfreebsd-8/debian/patches/000_zfsmac.diff	                        (rev 0)
+++ trunk/kfreebsd-8/debian/patches/000_zfsmac.diff	2010-01-08 14:34:02 UTC (rev 2915)
@@ -0,0 +1,76 @@
+--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c	(revision 200583)
++++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c	(working copy)
+@@ -143,16 +143,19 @@ zfs_znode_cache_constructor(void *buf, void *arg,
+ 
+ 	POINTER_INVALIDATE(&zp->z_zfsvfs);
+ 	ASSERT(!POINTER_IS_VALID(zp->z_zfsvfs));
+-	ASSERT(vfsp != NULL);
+ 
+-	error = getnewvnode("zfs", vfsp, &zfs_vnodeops, &vp);
+-	if (error != 0 && (kmflags & KM_NOSLEEP))
+-		return (-1);
+-	ASSERT(error == 0);
+-	vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+-	zp->z_vnode = vp;
+-	vp->v_data = (caddr_t)zp;
+-	VN_LOCK_AREC(vp);
++	if (vfsp != NULL) {
++		error = getnewvnode("zfs", vfsp, &zfs_vnodeops, &vp);
++		if (error != 0 && (kmflags & KM_NOSLEEP))
++			return (-1);
++		ASSERT(error == 0);
++		vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
++		zp->z_vnode = vp;
++		vp->v_data = (caddr_t)zp;
++		VN_LOCK_AREC(vp);
++	} else {
++		zp->z_vnode = NULL;
++	}
+ 
+ 	list_link_init(&zp->z_link_node);
+ 
+@@ -1435,7 +1438,7 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *
+ 	nvpair_t	*elem;
+ 	int		error;
+ 	znode_t		*rootzp = NULL;
+-	vnode_t		*vp;
++	vnode_t		vnode;
+ 	vattr_t		vattr;
+ 	znode_t		*zp;
+ 
+@@ -1504,13 +1507,13 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *
+ 	vattr.va_gid = crgetgid(cr);
+ 
+ 	rootzp = kmem_cache_alloc(znode_cache, KM_SLEEP);
+-	zfs_znode_cache_constructor(rootzp, &zfsvfs, 0);
++	zfs_znode_cache_constructor(rootzp, NULL, 0);
+ 	rootzp->z_unlinked = 0;
+ 	rootzp->z_atime_dirty = 0;
+ 
+-	vp = ZTOV(rootzp);
+-	vp->v_type = VDIR;
+-	VN_LOCK_ASHARE(vp);
++	vnode.v_type = VDIR;
++	vnode.v_data = rootzp;
++	rootzp->z_vnode = &vnode;
+ 
+ 	bzero(&zfsvfs, sizeof (zfsvfs_t));
+ 
+@@ -1539,16 +1542,10 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *
+ 	ASSERT(error == 0);
+ 	POINTER_INVALIDATE(&rootzp->z_zfsvfs);
+ 
+-	VI_LOCK(vp);
+-	ZTOV(rootzp)->v_data = NULL;
+-	ZTOV(rootzp)->v_count = 0;
+-	ZTOV(rootzp)->v_holdcnt = 0;
+-	rootzp->z_vnode = NULL;
+-	VOP_UNLOCK(vp, 0);
+-	vdestroy(vp);
+ 	dmu_buf_rele(rootzp->z_dbuf, NULL);
+ 	rootzp->z_dbuf = NULL;
+ 	mutex_destroy(&zfsvfs.z_znodes_lock);
++	rootzp->z_vnode = NULL;
+ 	kmem_cache_free(znode_cache, rootzp);
+ }
+ 

Added: trunk/kfreebsd-8/debian/patches/000_zfsvaccess.diff
===================================================================
--- trunk/kfreebsd-8/debian/patches/000_zfsvaccess.diff	                        (rev 0)
+++ trunk/kfreebsd-8/debian/patches/000_zfsvaccess.diff	2010-01-08 14:34:02 UTC (rev 2915)
@@ -0,0 +1,66 @@
+--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c	(revision 200583)
++++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c	(working copy)
+@@ -3981,21 +3981,33 @@ zfs_freebsd_access(ap)
+ 		struct thread *a_td;
+ 	} */ *ap;
+ {
++	accmode_t accmode;
++	int error = 0;
+ 
+ 	/*
+-	 * ZFS itself only knowns about VREAD, VWRITE and VEXEC, the rest
+-	 * we have to handle by calling vaccess().
++	 * ZFS itself only knowns about VREAD, VWRITE, VEXEC and VAPPEND,
+ 	 */
+-	if ((ap->a_accmode & ~(VREAD|VWRITE|VEXEC)) != 0) {
+-		vnode_t *vp = ap->a_vp;
+-		znode_t *zp = VTOZ(vp);
+-		znode_phys_t *zphys = zp->z_phys;
++	accmode = ap->a_accmode & (VREAD|VWRITE|VEXEC|VAPPEND);
++	if (accmode != 0)
++		error = zfs_access(ap->a_vp, accmode, 0, ap->a_cred, NULL);
+ 
+-		return (vaccess(vp->v_type, zphys->zp_mode, zphys->zp_uid,
+-		    zphys->zp_gid, ap->a_accmode, ap->a_cred, NULL));
++	/*
++	 * VADMIN has to be handled by vaccess().
++	 */
++	if (error == 0) {
++		accmode = ap->a_accmode & ~(VREAD|VWRITE|VEXEC|VAPPEND);
++		if (accmode != 0) {
++			vnode_t *vp = ap->a_vp;
++			znode_t *zp = VTOZ(vp);
++			znode_phys_t *zphys = zp->z_phys;
++
++			error = vaccess(vp->v_type, zphys->zp_mode,
++			    zphys->zp_uid, zphys->zp_gid, accmode, ap->a_cred,
++			    NULL);
++		}
+ 	}
+ 
+-	return (zfs_access(ap->a_vp, ap->a_accmode, 0, ap->a_cred, NULL));
++	return (error);
+ }
+ 
+ static int
+--- a/sys/cddl/contrib/opensolaris/uts/common/sys/vnode.h	(revision 200583)
++++ b/sys/cddl/contrib/opensolaris/uts/common/sys/vnode.h	(working copy)
+@@ -304,7 +304,6 @@ typedef struct xvattr {
+  * VOP_ACCESS flags
+  */
+ #define	V_ACE_MASK	0x1	/* mask represents  NFSv4 ACE permissions */
+-#define	V_APPEND	0x2	/* want to do append only check */
+ 
+ /*
+  * Flags for vnode operations.
+--- a/sys/cddl/compat/opensolaris/sys/vnode.h	(revision 200583)
++++ b/sys/cddl/compat/opensolaris/sys/vnode.h	(working copy)
+@@ -57,6 +57,8 @@ typedef	struct vop_vector	vnodeops_t;
+ 
+ #define	v_count	v_usecount
+ 
++#define	V_APPEND	VAPPEND
++
+ static __inline int
+ vn_is_readonly(vnode_t *vp)
+ {

Modified: trunk/kfreebsd-8/debian/patches/series
===================================================================
--- trunk/kfreebsd-8/debian/patches/series	2010-01-08 14:20:59 UTC (rev 2914)
+++ trunk/kfreebsd-8/debian/patches/series	2010-01-08 14:34:02 UTC (rev 2915)
@@ -1,4 +1,11 @@
+000_mcinit.diff
+000_multicast.diff
+000_nfsreconnect.diff
 000_rename.diff
+000_sctp.diff
+000_zfs.diff
+000_zfsmac.diff
+000_zfsvaccess.diff
 001_misc.diff
 003_glibc_dev_aicasm.diff
 004_xargs.diff




More information about the Glibc-bsd-commits mailing list