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; idxnext; 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)