diff -urN 2.4.31-hf2/Makefile 2.4.31-hf3/Makefile
--- 2.4.31-hf2/Makefile	2005-07-27 15:53:44.000000000 +0200
+++ 2.4.31-hf3/Makefile	2005-07-27 15:53:45.000000000 +0200
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 4
 SUBLEVEL = 31
-EXTRAVERSION = -hf2
+EXTRAVERSION = -hf3
 
 KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
 
diff -urN 2.4.31-hf2/arch/ppc/boot/lib/zlib.c 2.4.31-hf3/arch/ppc/boot/lib/zlib.c
--- 2.4.31-hf2/arch/ppc/boot/lib/zlib.c	2003-08-25 13:44:40.000000000 +0200
+++ 2.4.31-hf3/arch/ppc/boot/lib/zlib.c	2005-07-27 15:53:45.000000000 +0200
@@ -1278,7 +1278,7 @@
   {
     *t = (inflate_huft *)Z_NULL;
     *m = 0;
-    return Z_OK;
+    return Z_DATA_ERROR;
   }
 
 
@@ -1322,6 +1322,7 @@
     if ((j = *p++) != 0)
       v[x[j]++] = i;
   } while (++i < n);
+  n = x[g];			/* set n to length of v */
 
 
   /* Generate the Huffman codes and for each, make the table entries */
diff -urN 2.4.31-hf2/arch/ppc64/boot/zlib.c 2.4.31-hf3/arch/ppc64/boot/zlib.c
--- 2.4.31-hf2/arch/ppc64/boot/zlib.c	2003-08-25 13:44:40.000000000 +0200
+++ 2.4.31-hf3/arch/ppc64/boot/zlib.c	2005-07-27 15:53:45.000000000 +0200
@@ -1294,7 +1294,7 @@
   {
     *t = (inflate_huft *)Z_NULL;
     *m = 0;
-    return Z_OK;
+    return Z_DATA_ERROR;
   }
 
 
@@ -1338,6 +1338,7 @@
     if ((j = *p++) != 0)
       v[x[j]++] = i;
   } while (++i < n);
+  n = x[g];			/* set n to length of v */
 
 
   /* Generate the Huffman codes and for each, make the table entries */
diff -urN 2.4.31-hf2/arch/sparc64/kernel/sys_sparc32.c 2.4.31-hf3/arch/sparc64/kernel/sys_sparc32.c
--- 2.4.31-hf2/arch/sparc64/kernel/sys_sparc32.c	2005-04-14 09:43:33.000000000 +0200
+++ 2.4.31-hf3/arch/sparc64/kernel/sys_sparc32.c	2005-07-27 15:53:45.000000000 +0200
@@ -4205,7 +4205,7 @@
 
 		old_fs = get_fs();
 		set_fs(KERNEL_DS);
-		ret = sys_utimes(kfilename, &ktvs[0]);
+		ret = sys_utimes(kfilename, (tvs ? &ktvs[0] : NULL));
 		set_fs(old_fs);
 
 		putname(kfilename);
diff -urN 2.4.31-hf2/fs/inode.c 2.4.31-hf3/fs/inode.c
--- 2.4.31-hf2/fs/inode.c	2004-04-14 15:05:40.000000000 +0200
+++ 2.4.31-hf3/fs/inode.c	2005-07-27 15:53:45.000000000 +0200
@@ -297,7 +297,7 @@
 {
 	struct list_head *to;
 
-	if (inode->i_state & I_FREEING)
+	if (inode->i_state & (I_FREEING|I_CLEAR))
 		return;
 	if (list_empty(&inode->i_hash))
 		return;
@@ -634,7 +634,9 @@
 		cdput(inode->i_cdev);
 		inode->i_cdev = NULL;
 	}
+	spin_lock(&inode_lock);
 	inode->i_state = I_CLEAR;
+	spin_unlock(&inode_lock);
 }
 
 /*
diff -urN 2.4.31-hf2/lib/inflate.c 2.4.31-hf3/lib/inflate.c
--- 2.4.31-hf2/lib/inflate.c	2002-11-29 00:53:15.000000000 +0100
+++ 2.4.31-hf3/lib/inflate.c	2005-07-27 15:53:45.000000000 +0200
@@ -320,7 +320,7 @@
   {
     *t = (struct huft *)NULL;
     *m = 0;
-    return 0;
+    return 2;
   }
 
 DEBG("huft2 ");
@@ -368,6 +368,7 @@
     if ((j = *p++) != 0)
       v[x[j]++] = i;
   } while (++i < n);
+  n = x[g];                   /* set n to length of v */
 
 DEBG("h6 ");
 
@@ -404,12 +405,13 @@
 DEBG1("2 ");
           f -= a + 1;           /* deduct codes from patterns left */
           xp = c + k;
-          while (++j < z)       /* try smaller tables up to z bits */
-          {
-            if ((f <<= 1) <= *++xp)
-              break;            /* enough codes to use up j bits */
-            f -= *xp;           /* else deduct codes from patterns */
-          }
+          if (j < z)
+            while (++j < z)       /* try smaller tables up to z bits */
+            {
+              if ((f <<= 1) <= *++xp)
+                break;            /* enough codes to use up j bits */
+              f -= *xp;           /* else deduct codes from patterns */
+            }
         }
 DEBG1("3 ");
         z = 1 << j;             /* table entries for j-bit table */
diff -urN 2.4.31-hf2/lib/zlib_inflate/inftrees.c 2.4.31-hf3/lib/zlib_inflate/inftrees.c
--- 2.4.31-hf2/lib/zlib_inflate/inftrees.c	2002-11-29 00:53:15.000000000 +0100
+++ 2.4.31-hf3/lib/zlib_inflate/inftrees.c	2005-07-27 15:53:45.000000000 +0200
@@ -140,7 +140,7 @@
   {
     *t = (inflate_huft *)Z_NULL;
     *m = 0;
-    return Z_OK;
+    return Z_DATA_ERROR;
   }
 
 
diff -urN 2.4.31-hf2/net/ipv4/ipvs/ip_vs_conn.c 2.4.31-hf3/net/ipv4/ipvs/ip_vs_conn.c
--- 2.4.31-hf2/net/ipv4/ipvs/ip_vs_conn.c	2005-01-27 18:57:34.000000000 +0100
+++ 2.4.31-hf3/net/ipv4/ipvs/ip_vs_conn.c	2005-07-27 15:53:45.000000000 +0200
@@ -1248,7 +1248,6 @@
 {
 	cp->timeout = 0;
 	mod_timer(&cp->timer, jiffies);
-	__ip_vs_conn_put(cp);
 }
 
 /*
@@ -1414,7 +1413,6 @@
 	int idx;
 	struct ip_vs_conn *cp;
 	struct list_head *l,*e;
-	struct ip_vs_conn *ct;
 
 	/*
 	 * Randomly scan 1/32 of the whole table every second
@@ -1448,21 +1446,12 @@
 				continue;
 			}
 
-			/*
-			 * Drop the entry, and drop its ct if not referenced
-			 */
-			atomic_inc(&cp->refcnt);
-			ct_write_unlock(hash);
-
-			if ((ct = cp->control))
-				atomic_inc(&ct->refcnt);
 			IP_VS_DBG(4, "del connection\n");
 			ip_vs_conn_expire_now(cp);
-			if (ct) {
+			if (cp->control) {
 				IP_VS_DBG(4, "del conn template\n");
-				ip_vs_conn_expire_now(ct);
+				ip_vs_conn_expire_now(cp->control);
 			}
-			ct_write_lock(hash);
 		}
 		ct_write_unlock(hash);
 	}
@@ -1477,7 +1466,6 @@
 	int idx;
 	struct ip_vs_conn *cp;
 	struct list_head *l,*e;
-	struct ip_vs_conn *ct;
 
   flush_again:
 	for (idx=0; idx<IP_VS_CONN_TAB_SIZE; idx++) {
@@ -1489,18 +1477,13 @@
 		l = &ip_vs_conn_tab[idx];
 		for (e=l->next; e!=l; e=e->next) {
 			cp = list_entry(e, struct ip_vs_conn, c_list);
-			atomic_inc(&cp->refcnt);
-			ct_write_unlock(idx);
 
-			if ((ct = cp->control))
-				atomic_inc(&ct->refcnt);
 			IP_VS_DBG(4, "del connection\n");
 			ip_vs_conn_expire_now(cp);
-			if (ct) {
+			if (cp->control) {
 				IP_VS_DBG(4, "del conn template\n");
-				ip_vs_conn_expire_now(ct);
+				ip_vs_conn_expire_now(cp->control);
 			}
-			ct_write_lock(idx);
 		}
 		ct_write_unlock_bh(idx);
 	}
diff -urN 2.4.31-hf2/net/netlink/af_netlink.c 2.4.31-hf3/net/netlink/af_netlink.c
--- 2.4.31-hf2/net/netlink/af_netlink.c	2005-06-02 16:39:06.000000000 +0200
+++ 2.4.31-hf3/net/netlink/af_netlink.c	2005-07-27 15:53:45.000000000 +0200
@@ -330,9 +330,9 @@
 	u32 pid = nlk_sk(sk)->pid;
 
 	netlink_table_grab();
-	hash->entries--;
 	for (skp = nl_pid_hashfn(hash, pid); *skp; skp = &((*skp)->next)) {
 		if (*skp == sk) {
+			hash->entries--;
 			*skp = sk->next;
 			__sock_put(sk);
 			break;
@@ -450,7 +450,12 @@
 	err = netlink_insert(sk, pid);
 	if (err == -EADDRINUSE)
 		goto retry;
-	return 0;
+
+	/* If 2 threads race to autobind, that is fine.  */
+	if (err == -EBUSY)
+		err = 0;
+
+	return err;
 }
 
 static inline int netlink_capable(struct socket *sock, unsigned int flag) 
