> man operating_systems
Новый стабильный Linux 2.6.11.5
Ветка -stable ядра Linux пополнилась новой версией - 2.6.11.5.

Скачать патч Linux 2.6.11 -> 2.6.11.5 (7 КБ).

Небольшой Changelog и маленький патч относительно 2.6.11.4 следуют далее.

------
 Makefile                    |    2 +-
 drivers/net/amd8111e.c      |    2 ++
 drivers/net/tun.c           |    2 +-
 drivers/net/via-rhine.c     |    4 +++-
 drivers/net/wan/hd6457x.c   |    2 +-
 kernel/signal.c             |    1 +
 net/ipv4/fib_hash.c         |   12 +++++++++++-
 net/netrom/nr_in.c          |    9 ---------
 net/xfrm/xfrm_state.c       |    2 +-
 sound/pci/ac97/ac97_codec.c |   13 ++++++++-----
 10 files changed, 29 insertions(+), 20 deletions(-)


Summary of changes from v2.6.11.4 to v2.6.11.5
==============================================

<dilinger:debian.org>:
  o Possible AMD8111e free irq issue
  o Possible VIA-Rhine free irq issue

Daniel Drake:
  o Fix stereo mutes on Surround volume control

David S. Miller:
  o [IPSEC]: Fix __xfrm_find_acq_byseq()

Greg Kroah-Hartman:
  o Linux 2.6.11.5

Hugh Dickins:
  o tasklist left locked

Krzysztof Halasa:
  o Fix kernel panic on receive with WAN Hitachi SCA HD6457x

Patrick McHardy:
  o Fix crash while reading /proc/net/route

Ralf Bchle:
  o NetROM locking

Stephen Hemminger:
  o Fix check for underflow


Патч относительно 2.4.11.4:
diff -Nru a/Makefile b/Makefile
--- a/Makefile  2005-03-18 22:35:14 -08:00
+++ b/Makefile  2005-03-18 22:35:14 -08:00
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 6
 SUBLEVEL = 11
-EXTRAVERSION = .4
+EXTRAVERSION = .5
 NAME=Woozy Numbat
 
 # *DOCUMENTATION*
diff -Nru a/drivers/net/amd8111e.c b/drivers/net/amd8111e.c
--- a/drivers/net/amd8111e.c    2005-03-18 22:35:14 -08:00
+++ b/drivers/net/amd8111e.c    2005-03-18 22:35:14 -08:00
@@ -1381,6 +1381,8 @@
 
        if(amd8111e_restart(dev)){
                spin_unlock_irq(&lp->lock);
+               if (dev->irq)
+                       free_irq(dev->irq, dev);
                return -ENOMEM;
        }
        /* Start ipg timer */
diff -Nru a/drivers/net/tun.c b/drivers/net/tun.c
--- a/drivers/net/tun.c 2005-03-18 22:35:14 -08:00
+++ b/drivers/net/tun.c 2005-03-18 22:35:14 -08:00
@@ -229,7 +229,7 @@
        size_t len = count;
 
        if (!(tun->flags & TUN_NO_PI)) {
-               if ((len -= sizeof(pi)) > len)
+               if ((len -= sizeof(pi)) > count)
                        return -EINVAL;
 
                if(memcpy_fromiovec((void *)&pi, iv, sizeof(pi)))
diff -Nru a/drivers/net/via-rhine.c b/drivers/net/via-rhine.c
--- a/drivers/net/via-rhine.c   2005-03-18 22:35:14 -08:00
+++ b/drivers/net/via-rhine.c   2005-03-18 22:35:14 -08:00
@@ -1197,8 +1197,10 @@
                       dev->name, rp->pdev->irq);
 
        rc = alloc_ring(dev);
-       if (rc)
+       if (rc) {
+               free_irq(rp->pdev->irq, dev);
                return rc;
+       }
        alloc_rbufs(dev);
        alloc_tbufs(dev);
        rhine_chip_reset(dev);
diff -Nru a/drivers/net/wan/hd6457x.c b/drivers/net/wan/hd6457x.c
--- a/drivers/net/wan/hd6457x.c 2005-03-18 22:35:14 -08:00
+++ b/drivers/net/wan/hd6457x.c 2005-03-18 22:35:14 -08:00
@@ -315,7 +315,7 @@
 #endif
        stats->rx_packets++;
        stats->rx_bytes += skb->len;
-       skb->dev->last_rx = jiffies;
+       dev->last_rx = jiffies;
        skb->protocol = hdlc_type_trans(skb, dev);
        netif_rx(skb);
 }
diff -Nru a/kernel/signal.c b/kernel/signal.c
--- a/kernel/signal.c   2005-03-18 22:35:14 -08:00
+++ b/kernel/signal.c   2005-03-18 22:35:14 -08:00
@@ -1728,6 +1728,7 @@
                         * with another processor delivering a stop signal,
                         * then the SIGCONT that wakes us up should clear it.
                         */
+                       read_unlock(&tasklist_lock);
                        return 0;
                }
 
diff -Nru a/net/ipv4/fib_hash.c b/net/ipv4/fib_hash.c
--- a/net/ipv4/fib_hash.c       2005-03-18 22:35:14 -08:00
+++ b/net/ipv4/fib_hash.c       2005-03-18 22:35:14 -08:00
@@ -919,13 +919,23 @@
        return fa;
 }
 
+static struct fib_alias *fib_get_idx(struct seq_file *seq, loff_t pos)
+{
+       struct fib_alias *fa = fib_get_first(seq);
+
+       if (fa)
+               while (pos && (fa = fib_get_next(seq)))
+                       --pos;
+       return pos ? NULL : fa;
+}
+
 static void *fib_seq_start(struct seq_file *seq, loff_t *pos)
 {
        void *v = NULL;
 
        read_lock(&fib_hash_lock);
        if (ip_fib_main_table)
-               v = *pos ? fib_get_next(seq) : SEQ_START_TOKEN;
+               v = *pos ? fib_get_idx(seq, *pos - 1) : SEQ_START_TOKEN;
        return v;
 }
 
diff -Nru a/net/netrom/nr_in.c b/net/netrom/nr_in.c
--- a/net/netrom/nr_in.c        2005-03-18 22:35:14 -08:00
+++ b/net/netrom/nr_in.c        2005-03-18 22:35:14 -08:00
@@ -74,7 +74,6 @@
 static int nr_state1_machine(struct sock *sk, struct sk_buff *skb,
        int frametype)
 {
-       bh_lock_sock(sk);
        switch (frametype) {
        case NR_CONNACK: {
                nr_cb *nr = nr_sk(sk);
@@ -103,8 +102,6 @@
        default:
                break;
        }
-       bh_unlock_sock(sk);
-
        return 0;
 }
 
@@ -116,7 +113,6 @@
 static int nr_state2_machine(struct sock *sk, struct sk_buff *skb,
        int frametype)
 {
-       bh_lock_sock(sk);
        switch (frametype) {
        case NR_CONNACK | NR_CHOKE_FLAG:
                nr_disconnect(sk, ECONNRESET);
@@ -132,8 +128,6 @@
        default:
                break;
        }
-       bh_unlock_sock(sk);
-
        return 0;
 }
 
@@ -154,7 +148,6 @@
        nr = skb->data[18];
        ns = skb->data[17];
 
-       bh_lock_sock(sk);
        switch (frametype) {
        case NR_CONNREQ:
                nr_write_internal(sk, NR_CONNACK);
@@ -265,8 +258,6 @@
        default:
                break;
        }
-       bh_unlock_sock(sk);
-
        return queued;
 }
 
diff -Nru a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c
--- a/net/xfrm/xfrm_state.c     2005-03-18 22:35:14 -08:00
+++ b/net/xfrm/xfrm_state.c     2005-03-18 22:35:14 -08:00
@@ -609,7 +609,7 @@
 
        for (i = 0; i < XFRM_DST_HSIZE; i++) {
                list_for_each_entry(x, xfrm_state_bydst+i, bydst) {
-                       if (x->km.seq == seq) {
+                       if (x->km.seq == seq && x->km.state == XFRM_STATE_ACQ) {
                                xfrm_state_hold(x);
                                return x;
                        }
diff -Nru a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c
--- a/sound/pci/ac97/ac97_codec.c       2005-03-18 22:35:14 -08:00
+++ b/sound/pci/ac97/ac97_codec.c       2005-03-18 22:35:14 -08:00
@@ -1185,7 +1185,7 @@
 /*
  * create mute switch(es) for normal stereo controls
  */
-static int snd_ac97_cmute_new(snd_card_t *card, char *name, int reg, ac97_t *ac97)
+static int snd_ac97_cmute_new_stereo(snd_card_t *card, char *name, int reg, int check_stereo, ac97_t *ac97)
 {
        snd_kcontrol_t *kctl;
        int err;
@@ -1196,7 +1196,7 @@
 
        mute_mask = 0x8000;
        val = snd_ac97_read(ac97, reg);
-       if (ac97->flags & AC97_STEREO_MUTES) {
+       if (check_stereo || (ac97->flags & AC97_STEREO_MUTES)) {
                /* check whether both mute bits work */
                val1 = val | 0x8080;
                snd_ac97_write(ac97, reg, val1);
@@ -1254,7 +1254,7 @@
 /*
  * create a mute-switch and a volume for normal stereo/mono controls
  */
-static int snd_ac97_cmix_new(snd_card_t *card, const char *pfx, int reg, ac97_t *ac97)
+static int snd_ac97_cmix_new_stereo(snd_card_t *card, const char *pfx, int reg, int check_stereo, ac97_t *ac97)
 {
        int err;
        char name[44];
@@ -1265,7 +1265,7 @@
 
        if (snd_ac97_try_bit(ac97, reg, 15)) {
                sprintf(name, "%s Switch", pfx);
-               if ((err = snd_ac97_cmute_new(card, name, reg, ac97)) < 0)
+               if ((err = snd_ac97_cmute_new_stereo(card, name, reg, check_stereo, ac97)) < 0)
                        return err;
        }
        check_volume_resolution(ac97, reg, &lo_max, &hi_max);
@@ -1277,6 +1277,8 @@
        return 0;
 }
 
+#define snd_ac97_cmix_new(card, pfx, reg, ac97)        snd_ac97_cmix_new_stereo(card, pfx, reg, 0, ac97)
+#define snd_ac97_cmute_new(card, name, reg, ac97)      snd_ac97_cmute_new_stereo(card, name, reg, 0, ac97)
 
 static unsigned int snd_ac97_determine_spdif_rates(ac97_t *ac97);
 
@@ -1327,7 +1329,8 @@
 
        /* build surround controls */
        if (snd_ac97_try_volume_mix(ac97, AC97_SURROUND_MASTER)) {
-               if ((err = snd_ac97_cmix_new(card, "Surround Playback", AC97_SURROUND_MASTER, ac97)) < 0)
+               /* Surround Master (0x38) is with stereo mutes */
+               if ((err = snd_ac97_cmix_new_stereo(card, "Surround Playback", AC97_SURROUND_MASTER, 1, ac97)) < 0)
                        return err;
        }
 


Roman I Khimov  в  Суббота, 19 Март 2005, 12:58  |   Комментарии: 4  |  для печати

Наши новости доступны в формате RSS.

© OSRC.info, 2004-2010.
Авторские права на любые материалы, авторы которых явно указаны, принадлежат их авторам. По вопросам публикации таких материалов обращайтесь к авторам.
Авторские права на любые другие материалы принадлежат OSRC.info.
Сайт является помещением библиотеки. Копирование, сохранение на жестком диске или иной способ сохранения произведений осуществляются пользователями на свой риск.
При использовании материалов сайта ссылка на OSRC.info обязательна.