| From gregkh@mini.kroah.org Tue May 13 13:08:20 2008 |
| Message-Id: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:04:53 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk |
| Subject: [patch 00/37] 2.6.25.4 -stable review |
| Status: RO |
| Content-Length: 5190 |
| Lines: 99 |
| |
| This is the start of the stable review cycle for the 2.6.25.4 release. |
| There are 37 patches in this series, all will be posted as a response to |
| this one. If anyone has any issues with these being applied, please let |
| us know. If anyone is a maintainer of the proper subsystem, and wants |
| to add a Signed-off-by: line to the patch, please respond with it. |
| |
| These patches are sent out with a number of different people on the Cc: |
| line. If you wish to be a reviewer, please email stable@kernel.org to |
| add your name to the list. If you want to be off the reviewer list, |
| also email us. |
| |
| Responses should be made by May 15, 20:00:00 UTC. Anything received |
| after that time might be too late. |
| |
| The whole patch series can be found in one patch at: |
| kernel.org/pub/linux/kernel/v2.6/stable-review/patch-2.6.25.4-rc1.gz |
| and the diffstat can be found below. |
| |
| |
| thanks, |
| |
| the -stable release team |
| |
| |
| Makefile | 2 |
| arch/sparc/kernel/entry.S | 2 |
| arch/sparc/kernel/process.c | 25 +- |
| arch/sparc/kernel/ptrace.c | 6 |
| arch/sparc/kernel/rtrap.S | 11 - |
| arch/sparc/kernel/signal.c | 84 ++++---- |
| arch/sparc/kernel/sys_sparc.c | 48 ---- |
| arch/sparc64/kernel/etrap.S | 7 |
| arch/sparc64/kernel/irq.c | 3 |
| arch/sparc64/kernel/pci.c | 130 +++--------- |
| arch/sparc64/kernel/pci_common.c | 6 |
| arch/sparc64/kernel/pci_impl.h | 9 |
| arch/sparc64/kernel/process.c | 18 + |
| arch/sparc64/kernel/ptrace.c | 16 + |
| arch/sparc64/kernel/rtrap.S | 1 |
| arch/sparc64/kernel/signal.c | 88 ++++---- |
| arch/sparc64/kernel/signal32.c | 48 +++- |
| arch/sparc64/kernel/sys_sparc.c | 40 --- |
| arch/sparc64/kernel/sys_sparc32.c | 33 --- |
| arch/x86/Kconfig | 12 + |
| drivers/ata/ata_piix.c | 25 ++ |
| drivers/char/vt.c | 6 |
| drivers/i2c/busses/i2c-piix4.c | 32 ++- |
| drivers/md/raid5.c | 25 +- |
| drivers/media/dvb/dvb-usb/dib0700_devices.c | 259 ++++++++++++++++++++++--- |
| drivers/media/dvb/dvb-usb/dvb-usb-ids.h | 9 |
| drivers/net/macvlan.c | 2 |
| drivers/net/r8169.c | 8 |
| drivers/rtc/rtc-lib.c | 2 |
| drivers/scsi/aha152x.c | 8 |
| drivers/scsi/libiscsi.c | 29 +- |
| drivers/scsi/qla1280.c | 4 |
| drivers/serial/serial_core.c | 3 |
| drivers/serial/sunhv.c | 2 |
| drivers/serial/sunsab.c | 2 |
| drivers/serial/sunsu.c | 2 |
| drivers/serial/sunzilog.c | 32 +-- |
| drivers/usb/host/ohci-at91.c | 1 |
| drivers/usb/host/ohci-ep93xx.c | 2 |
| drivers/usb/host/ohci-hub.c | 43 ++++ |
| drivers/usb/host/ohci-omap.c | 2 |
| drivers/usb/host/ohci-pci.c | 43 ---- |
| drivers/usb/host/ohci-pxa27x.c | 3 |
| drivers/usb/host/ohci-sm501.c | 2 |
| drivers/usb/host/ohci-ssb.c | 1 |
| drivers/usb/serial/airprime.c | 2 |
| include/asm-sparc/mman.h | 5 |
| include/asm-sparc/psr.h | 1 |
| include/asm-sparc/ptrace.h | 13 + |
| include/asm-sparc/signal.h | 8 |
| include/asm-sparc64/mman.h | 5 |
| include/asm-sparc64/psrcompat.h | 2 |
| include/asm-sparc64/pstate.h | 1 |
| include/asm-sparc64/ptrace.h | 13 + |
| include/asm-sparc64/signal.h | 8 |
| include/asm-sparc64/ttable.h | 7 |
| include/asm-x86/topology.h | 18 - |
| include/net/ip_vs.h | 3 |
| include/net/netfilter/nf_conntrack_tuple.h | 10 |
| net/can/af_can.c | 16 + |
| net/dccp/feat.c | 2 |
| net/ipv4/ipvs/ip_vs_proto.c | 2 |
| net/ipv4/ipvs/ip_vs_proto_ah.c | 1 |
| net/ipv4/ipvs/ip_vs_proto_esp.c | 1 |
| net/ipv4/ipvs/ip_vs_proto_tcp.c | 1 |
| net/ipv4/ipvs/ip_vs_proto_udp.c | 1 |
| net/ipv4/ipvs/ip_vs_sync.c | 80 +++++-- |
| net/ipv4/netfilter/ip_queue.c | 5 |
| net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c | 2 |
| net/ipv6/netfilter/ip6_queue.c | 5 |
| net/netfilter/nf_conntrack_core.c | 4 |
| net/netfilter/nfnetlink_queue.c | 5 |
| net/sched/sch_htb.c | 8 |
| net/xfrm/xfrm_state.c | 2 |
| 74 files changed, 808 insertions(+), 559 deletions(-) |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:20 2008 |
| Message-Id: <20080513200820.662791377@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:04:54 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| Hans-Frieder Vogt <hfvogt@gmx.net>, |
| Felix Apitzsch <F.Apitzsch@soz.uni-frankfurt.de>, |
| Antti Palosaari <crope@iki.fi>, |
| Albert Comerma <albert.comerma@gmail.com>, |
| Patrick Boettcher <pb@linuxtv.org>, |
| Mauro Carvalho Chehab <mchehab@infradead.org>, |
| Michel Morisot <mmorisot.abonnement@belcenter.com> |
| Subject: [patch 01/37] V4L/DVB (7473): PATCH for various Dibcom based devices |
| Content-Disposition: inline; filename=v4l-dvb-patch-for-various-dibcom-based-devices.patch |
| Content-Length: 14103 |
| Lines: 405 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us know. |
| |
| ------------------ |
| |
| From: Albert Comerma <albert.comerma@gmail.com> |
| |
| patch 6ca8f0b97473dcef3a754bab5239dcfcdd00b244 upstream |
| |
| This patch introduces support for dvb-t for the following DiBcom based cards: |
| |
| - Terratec Cinergy HT USB XE (USB-ID: 0ccd:0058) |
| - Terratec Cinergy HT Express (USB-ID: 0ccd:0060) |
| - Pinnacle 320CX (USB-ID: 2304:022e) |
| - Pinnacle PCTV72e (USB-ID: 2304:0236) |
| - Pinnacle PCTV73e (USB-ID: 2304:0237) |
| - Yuan EC372S (USB-ID: 1164:1edc) |
| |
| Signed-off-by: Hans-Frieder Vogt <hfvogt@gmx.net> |
| Signed-off-by: Felix Apitzsch <F.Apitzsch@soz.uni-frankfurt.de> |
| Signed-off-by: Antti Palosaari <crope@iki.fi> |
| Signed-off-by: Albert Comerma <albert.comerma@gmail.com> |
| Signed-off-by: Patrick Boettcher <pb@linuxtv.org> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org> |
| Cc: Michel Morisot <mmorisot.abonnement@belcenter.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/media/dvb/dvb-usb/dib0700_devices.c | 259 ++++++++++++++++++++++++---- |
| drivers/media/dvb/dvb-usb/dvb-usb-ids.h | 9 |
| 2 files changed, 238 insertions(+), 30 deletions(-) |
| |
| --- a/drivers/media/dvb/dvb-usb/dib0700_devices.c |
| +++ b/drivers/media/dvb/dvb-usb/dib0700_devices.c |
| @@ -13,6 +13,7 @@ |
| #include "dib7000p.h" |
| #include "mt2060.h" |
| #include "mt2266.h" |
| +#include "tuner-xc2028.h" |
| #include "dib0070.h" |
| |
| static int force_lna_activation; |
| @@ -297,6 +298,149 @@ static int stk7700d_tuner_attach(struct |
| &stk7700d_mt2266_config[adap->id]) == NULL ? -ENODEV : 0;; |
| } |
| |
| +/* STK7700-PH: Digital/Analog Hybrid Tuner, e.h. Cinergy HT USB HE */ |
| +struct dibx000_agc_config xc3028_agc_config = { |
| + BAND_VHF | BAND_UHF, /* band_caps */ |
| + |
| + /* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=0, |
| + * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0, |
| + * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */ |
| + (0 << 15) | (0 << 14) | (0 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | |
| + (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), /* setup */ |
| + |
| + 712, /* inv_gain */ |
| + 21, /* time_stabiliz */ |
| + |
| + 0, /* alpha_level */ |
| + 118, /* thlock */ |
| + |
| + 0, /* wbd_inv */ |
| + 2867, /* wbd_ref */ |
| + 0, /* wbd_sel */ |
| + 2, /* wbd_alpha */ |
| + |
| + 0, /* agc1_max */ |
| + 0, /* agc1_min */ |
| + 39718, /* agc2_max */ |
| + 9930, /* agc2_min */ |
| + 0, /* agc1_pt1 */ |
| + 0, /* agc1_pt2 */ |
| + 0, /* agc1_pt3 */ |
| + 0, /* agc1_slope1 */ |
| + 0, /* agc1_slope2 */ |
| + 0, /* agc2_pt1 */ |
| + 128, /* agc2_pt2 */ |
| + 29, /* agc2_slope1 */ |
| + 29, /* agc2_slope2 */ |
| + |
| + 17, /* alpha_mant */ |
| + 27, /* alpha_exp */ |
| + 23, /* beta_mant */ |
| + 51, /* beta_exp */ |
| + |
| + 1, /* perform_agc_softsplit */ |
| +}; |
| + |
| +/* PLL Configuration for COFDM BW_MHz = 8.00 with external clock = 30.00 */ |
| +struct dibx000_bandwidth_config xc3028_bw_config = { |
| + 60000, 30000, /* internal, sampling */ |
| + 1, 8, 3, 1, 0, /* pll_cfg: prediv, ratio, range, reset, bypass */ |
| + 0, 0, 1, 1, 0, /* misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, |
| + modulo */ |
| + (3 << 14) | (1 << 12) | (524 << 0), /* sad_cfg: refsel, sel, freq_15k */ |
| + (1 << 25) | 5816102, /* ifreq = 5.200000 MHz */ |
| + 20452225, /* timf */ |
| + 30000000, /* xtal_hz */ |
| +}; |
| + |
| +static struct dib7000p_config stk7700ph_dib7700_xc3028_config = { |
| + .output_mpeg2_in_188_bytes = 1, |
| + .tuner_is_baseband = 1, |
| + |
| + .agc_config_count = 1, |
| + .agc = &xc3028_agc_config, |
| + .bw = &xc3028_bw_config, |
| + |
| + .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS, |
| + .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES, |
| + .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS, |
| +}; |
| + |
| +static int stk7700ph_xc3028_callback(void *ptr, int command, int arg) |
| +{ |
| + struct dvb_usb_adapter *adap = ptr; |
| + |
| + switch (command) { |
| + case XC2028_TUNER_RESET: |
| + /* Send the tuner in then out of reset */ |
| + dib7000p_set_gpio(adap->fe, 8, 0, 0); msleep(10); |
| + dib7000p_set_gpio(adap->fe, 8, 0, 1); |
| + break; |
| + case XC2028_RESET_CLK: |
| + break; |
| + default: |
| + err("%s: unknown command %d, arg %d\n", __func__, |
| + command, arg); |
| + return -EINVAL; |
| + } |
| + return 0; |
| +} |
| + |
| +static struct xc2028_ctrl stk7700ph_xc3028_ctrl = { |
| + .fname = XC2028_DEFAULT_FIRMWARE, |
| + .max_len = 64, |
| + .demod = XC3028_FE_DIBCOM52, |
| +}; |
| + |
| +static struct xc2028_config stk7700ph_xc3028_config = { |
| + .i2c_addr = 0x61, |
| + .callback = stk7700ph_xc3028_callback, |
| + .ctrl = &stk7700ph_xc3028_ctrl, |
| +}; |
| + |
| +static int stk7700ph_frontend_attach(struct dvb_usb_adapter *adap) |
| +{ |
| + struct usb_device_descriptor *desc = &adap->dev->udev->descriptor; |
| + |
| + if (desc->idVendor == USB_VID_PINNACLE && |
| + desc->idProduct == USB_PID_PINNACLE_EXPRESSCARD_320CX) |
| + dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); |
| + else |
| + dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); |
| + msleep(20); |
| + dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); |
| + dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); |
| + dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); |
| + dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); |
| + msleep(10); |
| + dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); |
| + msleep(20); |
| + dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); |
| + msleep(10); |
| + |
| + dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18, |
| + &stk7700ph_dib7700_xc3028_config); |
| + |
| + adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, |
| + &stk7700ph_dib7700_xc3028_config); |
| + |
| + return adap->fe == NULL ? -ENODEV : 0; |
| +} |
| + |
| +static int stk7700ph_tuner_attach(struct dvb_usb_adapter *adap) |
| +{ |
| + struct i2c_adapter *tun_i2c; |
| + |
| + tun_i2c = dib7000p_get_i2c_master(adap->fe, |
| + DIBX000_I2C_INTERFACE_TUNER, 1); |
| + |
| + stk7700ph_xc3028_config.i2c_adap = tun_i2c; |
| + stk7700ph_xc3028_config.video_dev = adap; |
| + |
| + return dvb_attach(xc2028_attach, adap->fe, &stk7700ph_xc3028_config) |
| + == NULL ? -ENODEV : 0; |
| +} |
| + |
| #define DEFAULT_RC_INTERVAL 150 |
| |
| static u8 rc_request[] = { REQUEST_POLL_RC, 0 }; |
| @@ -794,6 +938,10 @@ static struct dib7000p_config dib7070p_d |
| /* STK7070P */ |
| static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap) |
| { |
| + if (adap->dev->udev->descriptor.idVendor == USB_VID_PINNACLE && |
| + adap->dev->udev->descriptor.idProduct == USB_PID_PINNACLE_PCTV72E) |
| + dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); |
| + else |
| dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); |
| msleep(10); |
| dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); |
| @@ -808,9 +956,11 @@ static int stk7070p_frontend_attach(stru |
| msleep(10); |
| dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); |
| |
| - dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18, &dib7070p_dib7000p_config); |
| + dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18, |
| + &dib7070p_dib7000p_config); |
| |
| - adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, &dib7070p_dib7000p_config); |
| + adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, |
| + &dib7070p_dib7000p_config); |
| return adap->fe == NULL ? -ENODEV : 0; |
| } |
| |
| @@ -878,34 +1028,41 @@ static int stk7070pd_frontend_attach1(st |
| /* DVB-USB and USB stuff follows */ |
| struct usb_device_id dib0700_usb_id_table[] = { |
| /* 0 */ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P) }, |
| - { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P_PC) }, |
| - |
| - { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500) }, |
| - { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_2) }, |
| - { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK) }, |
| + { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P_PC) }, |
| + { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500) }, |
| + { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_2) }, |
| + { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK) }, |
| /* 5 */ { USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR) }, |
| - { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500) }, |
| - { USB_DEVICE(USB_VID_UNIWILL, USB_PID_UNIWILL_STK7700P) }, |
| - { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P) }, |
| - { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_2) }, |
| + { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500) }, |
| + { USB_DEVICE(USB_VID_UNIWILL, USB_PID_UNIWILL_STK7700P) }, |
| + { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P) }, |
| + { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_2) }, |
| /* 10 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_2) }, |
| - { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV2000E) }, |
| - { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY) }, |
| - { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK) }, |
| - { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700D) }, |
| + { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV2000E) }, |
| + { USB_DEVICE(USB_VID_TERRATEC, |
| + USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY) }, |
| + { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK) }, |
| + { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700D) }, |
| /* 15 */{ USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070P) }, |
| - { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV_DVB_T_FLASH) }, |
| - { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070PD) }, |
| - { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T) }, |
| - { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500_PC) }, |
| + { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV_DVB_T_FLASH) }, |
| + { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7070PD) }, |
| + { USB_DEVICE(USB_VID_PINNACLE, |
| + USB_PID_PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T) }, |
| + { USB_DEVICE(USB_VID_COMPRO, USB_PID_COMPRO_VIDEOMATE_U500_PC) }, |
| /* 20 */{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_EXPRESS) }, |
| - { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U7000) }, |
| - { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ARTEC_T14BR) }, |
| - { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000) }, |
| - { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3100) }, |
| -/* 25 */ { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_3) }, |
| - { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_MYTV_T) }, |
| - { 0 } /* Terminating entry */ |
| + { USB_DEVICE(USB_VID_GIGABYTE, USB_PID_GIGABYTE_U7000) }, |
| + { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ARTEC_T14BR) }, |
| + { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3000) }, |
| + { USB_DEVICE(USB_VID_ASUS, USB_PID_ASUS_U3100) }, |
| +/* 25 */{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK_3) }, |
| + { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_MYTV_T) }, |
| + { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_USB_XE) }, |
| + { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_EXPRESSCARD_320CX) }, |
| + { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV72E) }, |
| +/* 30 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73E) }, |
| + { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_EC372S) }, |
| + { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_EXPRESS) }, |
| + { 0 } /* Terminating entry */ |
| }; |
| MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table); |
| |
| @@ -1069,12 +1226,16 @@ struct dvb_usb_device_properties dib0700 |
| }, |
| }, |
| |
| - .num_device_descs = 1, |
| + .num_device_descs = 2, |
| .devices = { |
| { "ASUS My Cinema U3000 Mini DVBT Tuner", |
| { &dib0700_usb_id_table[23], NULL }, |
| { NULL }, |
| }, |
| + { "Yuan EC372S", |
| + { &dib0700_usb_id_table[31], NULL }, |
| + { NULL }, |
| + } |
| } |
| }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, |
| |
| @@ -1090,7 +1251,7 @@ struct dvb_usb_device_properties dib0700 |
| }, |
| }, |
| |
| - .num_device_descs = 6, |
| + .num_device_descs = 8, |
| .devices = { |
| { "DiBcom STK7070P reference design", |
| { &dib0700_usb_id_table[15], NULL }, |
| @@ -1116,6 +1277,14 @@ struct dvb_usb_device_properties dib0700 |
| { &dib0700_usb_id_table[26], NULL }, |
| { NULL }, |
| }, |
| + { "Pinnacle PCTV 72e", |
| + { &dib0700_usb_id_table[29], NULL }, |
| + { NULL }, |
| + }, |
| + { "Pinnacle PCTV 73e", |
| + { &dib0700_usb_id_table[30], NULL }, |
| + { NULL }, |
| + }, |
| }, |
| |
| .rc_interval = DEFAULT_RC_INTERVAL, |
| @@ -1155,6 +1324,40 @@ struct dvb_usb_device_properties dib0700 |
| { NULL }, |
| } |
| } |
| + }, { DIB0700_DEFAULT_DEVICE_PROPERTIES, |
| + |
| + .num_adapters = 1, |
| + .adapter = { |
| + { |
| + .frontend_attach = stk7700ph_frontend_attach, |
| + .tuner_attach = stk7700ph_tuner_attach, |
| + |
| + DIB0700_DEFAULT_STREAMING_CONFIG(0x02), |
| + |
| + .size_of_priv = sizeof(struct |
| + dib0700_adapter_state), |
| + }, |
| + }, |
| + |
| + .num_device_descs = 3, |
| + .devices = { |
| + { "Terratec Cinergy HT USB XE", |
| + { &dib0700_usb_id_table[27], NULL }, |
| + { NULL }, |
| + }, |
| + { "Pinnacle Expresscard 320cx", |
| + { &dib0700_usb_id_table[28], NULL }, |
| + { NULL }, |
| + }, |
| + { "Terratec Cinergy HT Express", |
| + { &dib0700_usb_id_table[32], NULL }, |
| + { NULL }, |
| + }, |
| + }, |
| + .rc_interval = DEFAULT_RC_INTERVAL, |
| + .rc_key_map = dib0700_rc_keys, |
| + .rc_key_map_size = ARRAY_SIZE(dib0700_rc_keys), |
| + .rc_query = dib0700_rc_query |
| }, |
| }; |
| |
| --- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h |
| +++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h |
| @@ -46,8 +46,8 @@ |
| #define USB_VID_ULTIMA_ELECTRONIC 0x05d8 |
| #define USB_VID_UNIWILL 0x1584 |
| #define USB_VID_WIDEVIEW 0x14aa |
| -/* dom : pour gigabyte u7000 */ |
| #define USB_VID_GIGABYTE 0x1044 |
| +#define USB_VID_YUAN 0x1164 |
| |
| |
| /* Product IDs */ |
| @@ -135,9 +135,14 @@ |
| #define USB_PID_AVERMEDIA_VOLAR 0xa807 |
| #define USB_PID_AVERMEDIA_VOLAR_2 0xb808 |
| #define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY 0x005a |
| +#define USB_PID_TERRATEC_CINERGY_HT_USB_XE 0x0058 |
| +#define USB_PID_TERRATEC_CINERGY_HT_EXPRESS 0x0060 |
| +#define USB_PID_PINNACLE_EXPRESSCARD_320CX 0x022e |
| #define USB_PID_PINNACLE_PCTV2000E 0x022c |
| #define USB_PID_PINNACLE_PCTV_DVB_T_FLASH 0x0228 |
| #define USB_PID_PINNACLE_PCTV_DUAL_DIVERSITY_DVB_T 0x0229 |
| +#define USB_PID_PINNACLE_PCTV72E 0x0236 |
| +#define USB_PID_PINNACLE_PCTV73E 0x0237 |
| #define USB_PID_PCTV_200E 0x020e |
| #define USB_PID_PCTV_400E 0x020f |
| #define USB_PID_PCTV_450E 0x0222 |
| @@ -183,9 +188,9 @@ |
| #define USB_PID_OPERA1_WARM 0x3829 |
| #define USB_PID_LIFEVIEW_TV_WALKER_TWIN_COLD 0x0514 |
| #define USB_PID_LIFEVIEW_TV_WALKER_TWIN_WARM 0x0513 |
| -/* dom pour gigabyte u7000 */ |
| #define USB_PID_GIGABYTE_U7000 0x7001 |
| #define USB_PID_ASUS_U3000 0x171f |
| #define USB_PID_ASUS_U3100 0x173f |
| +#define USB_PID_YUAN_EC372S 0x1edc |
| |
| #endif |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:21 2008 |
| Message-Id: <20080513200820.854994926@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:04:55 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org, |
| jejb@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| Samuel Thibault <samuel.thibault@ens-lyon.org>, |
| Willy Tarreau <w@1wt.eu> |
| Subject: [patch 02/37] vt: fix canonical input in UTF-8 mode |
| Content-Disposition: inline; filename=vt-fix-canonical-input-in-utf-8-mode.patch |
| Content-Length: 1674 |
| Lines: 48 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Samuel Thibault <samuel.thibault@ens-lyon.org> |
| |
| commit c1236d31a1b9fc018b85e15a3e58e3601ddc90ae upstream |
| |
| For e.g. proper TTY canonical support, IUTF8 termios flag has to be set as |
| appropriate. Linux used to not care about setting that flag for VT TTYs. |
| |
| This patch fixes that by activating it according to the current mode of the |
| VT, and sets the default value according to the vt.default_utf8 parameter. |
| |
| Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org> |
| Cc: Willy Tarreau <w@1wt.eu> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/char/vt.c | 6 ++++++ |
| 1 file changed, 6 insertions(+) |
| |
| --- a/drivers/char/vt.c |
| +++ b/drivers/char/vt.c |
| @@ -2723,6 +2723,10 @@ static int con_open(struct tty_struct *t |
| tty->winsize.ws_row = vc_cons[currcons].d->vc_rows; |
| tty->winsize.ws_col = vc_cons[currcons].d->vc_cols; |
| } |
| + if (vc->vc_utf) |
| + tty->termios->c_iflag |= IUTF8; |
| + else |
| + tty->termios->c_iflag &= ~IUTF8; |
| release_console_sem(); |
| vcs_make_sysfs(tty); |
| return ret; |
| @@ -2899,6 +2903,8 @@ int __init vty_init(void) |
| console_driver->minor_start = 1; |
| console_driver->type = TTY_DRIVER_TYPE_CONSOLE; |
| console_driver->init_termios = tty_std_termios; |
| + if (default_utf8) |
| + console_driver->init_termios.c_iflag |= IUTF8; |
| console_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_RESET_TERMIOS; |
| tty_set_operations(console_driver, &con_ops); |
| if (tty_register_driver(console_driver)) |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:21 2008 |
| Message-Id: <20080513200821.035189406@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:04:56 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org, |
| jejb@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> |
| Subject: [patch 03/37] serial: access after NULL check in uart_flush_buffer() |
| Content-Disposition: inline; filename=serial-access-after-null-check-in-uart_flush_buffer.patch |
| Content-Length: 1490 |
| Lines: 57 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp> |
| |
| commit 55d7b68996a5064f011d681bca412b6281d2f711 upstream |
| |
| I noticed that |
| |
| static void uart_flush_buffer(struct tty_struct *tty) |
| { |
| struct uart_state *state = tty->driver_data; |
| struct uart_port *port = state->port; |
| unsigned long flags; |
| |
| /* |
| * This means you called this function _after_ the port was |
| * closed. No cookie for you. |
| */ |
| if (!state || !state->info) { |
| WARN_ON(1); |
| return; |
| } |
| |
| is too late for checking state != NULL. |
| |
| Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/serial/serial_core.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/serial/serial_core.c |
| +++ b/drivers/serial/serial_core.c |
| @@ -535,7 +535,7 @@ static int uart_chars_in_buffer(struct t |
| static void uart_flush_buffer(struct tty_struct *tty) |
| { |
| struct uart_state *state = tty->driver_data; |
| - struct uart_port *port = state->port; |
| + struct uart_port *port; |
| unsigned long flags; |
| |
| /* |
| @@ -547,6 +547,7 @@ static void uart_flush_buffer(struct tty |
| return; |
| } |
| |
| + port = state->port; |
| pr_debug("uart_flush_buffer(%d) called\n", tty->index); |
| |
| spin_lock_irqsave(&port->lock, flags); |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:21 2008 |
| Message-Id: <20080513200821.220001512@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:04:57 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| Alan Stern <stern@rowland.harvard.edu> |
| Subject: [patch 04/37] OHCI: fix regression upon awakening from hibernation |
| Content-Disposition: inline; filename=ohci-fix-regression-upon-awakening-from-hibernation.patch |
| Content-Length: 6903 |
| Lines: 223 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Alan Stern <stern@rowland.harvard.edu> |
| |
| commit 43bbb7e015c4380064796c5868b536437b165615 in upstream |
| |
| Drivers in the ohci-hcd family should perform certain tasks whenever |
| their controller device is resumed. These include checking for loss |
| of power during suspend, turning on port power, and enabling interrupt |
| requests. |
| |
| Until now these jobs have been carried out when the root hub is |
| resumed, not when the controller is. Many drivers work around the |
| resulting awkwardness by automatically resuming their root hub |
| whenever the controller is resumed. But this is wasteful and |
| unnecessary. |
| |
| In 2.6.25, ohci-pci doesn't even do that. After waking up from |
| hibernation, it simply leaves the controller in a RESET state, which |
| is useless. |
| |
| To simplify the situation, this patch (as1066b) adds a new core |
| routine, ohci_finish_controller_resume(), which can be used by all the |
| OHCI-variant drivers. They can call the new routine instead of |
| resuming their root hubs. And ohci-pci.c can call it instead of using |
| its own special-purpose handler. |
| |
| Signed-off-by: Alan Stern <stern@rowland.harvard.edu> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/usb/host/ohci-at91.c | 1 |
| drivers/usb/host/ohci-ep93xx.c | 2 - |
| drivers/usb/host/ohci-hub.c | 43 +++++++++++++++++++++++++++++++++++++++++ |
| drivers/usb/host/ohci-omap.c | 2 - |
| drivers/usb/host/ohci-pci.c | 43 ----------------------------------------- |
| drivers/usb/host/ohci-pxa27x.c | 3 -- |
| drivers/usb/host/ohci-sm501.c | 2 - |
| drivers/usb/host/ohci-ssb.c | 1 |
| 8 files changed, 50 insertions(+), 47 deletions(-) |
| |
| --- a/drivers/usb/host/ohci-at91.c |
| +++ b/drivers/usb/host/ohci-at91.c |
| @@ -348,6 +348,7 @@ static int ohci_hcd_at91_drv_resume(stru |
| if (!clocked) |
| at91_start_clock(); |
| |
| + ohci_finish_controller_resume(hcd); |
| return 0; |
| } |
| #else |
| --- a/drivers/usb/host/ohci-ep93xx.c |
| +++ b/drivers/usb/host/ohci-ep93xx.c |
| @@ -194,8 +194,8 @@ static int ohci_hcd_ep93xx_drv_resume(st |
| |
| ep93xx_start_hc(&pdev->dev); |
| pdev->dev.power.power_state = PMSG_ON; |
| - usb_hcd_resume_root_hub(hcd); |
| |
| + ohci_finish_controller_resume(hcd); |
| return 0; |
| } |
| #endif |
| --- a/drivers/usb/host/ohci-hub.c |
| +++ b/drivers/usb/host/ohci-hub.c |
| @@ -326,6 +326,49 @@ static int ohci_bus_resume (struct usb_h |
| return rc; |
| } |
| |
| +/* Carry out the final steps of resuming the controller device */ |
| +static void ohci_finish_controller_resume(struct usb_hcd *hcd) |
| +{ |
| + struct ohci_hcd *ohci = hcd_to_ohci(hcd); |
| + int port; |
| + bool need_reinit = false; |
| + |
| + /* See if the controller is already running or has been reset */ |
| + ohci->hc_control = ohci_readl(ohci, &ohci->regs->control); |
| + if (ohci->hc_control & (OHCI_CTRL_IR | OHCI_SCHED_ENABLES)) { |
| + need_reinit = true; |
| + } else { |
| + switch (ohci->hc_control & OHCI_CTRL_HCFS) { |
| + case OHCI_USB_OPER: |
| + case OHCI_USB_RESET: |
| + need_reinit = true; |
| + } |
| + } |
| + |
| + /* If needed, reinitialize and suspend the root hub */ |
| + if (need_reinit) { |
| + spin_lock_irq(&ohci->lock); |
| + hcd->state = HC_STATE_RESUMING; |
| + ohci_rh_resume(ohci); |
| + hcd->state = HC_STATE_QUIESCING; |
| + ohci_rh_suspend(ohci, 0); |
| + hcd->state = HC_STATE_SUSPENDED; |
| + spin_unlock_irq(&ohci->lock); |
| + } |
| + |
| + /* Normally just turn on port power and enable interrupts */ |
| + else { |
| + ohci_dbg(ohci, "powerup ports\n"); |
| + for (port = 0; port < ohci->num_ports; port++) |
| + ohci_writel(ohci, RH_PS_PPS, |
| + &ohci->regs->roothub.portstatus[port]); |
| + |
| + ohci_writel(ohci, OHCI_INTR_MIE, &ohci->regs->intrenable); |
| + ohci_readl(ohci, &ohci->regs->intrenable); |
| + msleep(20); |
| + } |
| +} |
| + |
| /* Carry out polling-, autostop-, and autoresume-related state changes */ |
| static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed, |
| int any_connected) |
| --- a/drivers/usb/host/ohci-omap.c |
| +++ b/drivers/usb/host/ohci-omap.c |
| @@ -519,7 +519,7 @@ static int ohci_omap_resume(struct platf |
| |
| omap_ohci_clock_power(1); |
| dev->dev.power.power_state = PMSG_ON; |
| - usb_hcd_resume_root_hub(platform_get_drvdata(dev)); |
| + ohci_finish_controller_resume(hcd); |
| return 0; |
| } |
| |
| --- a/drivers/usb/host/ohci-pci.c |
| +++ b/drivers/usb/host/ohci-pci.c |
| @@ -238,42 +238,6 @@ static int __devinit ohci_pci_start (str |
| return ret; |
| } |
| |
| -#if defined(CONFIG_USB_PERSIST) && (defined(CONFIG_USB_EHCI_HCD) || \ |
| - defined(CONFIG_USB_EHCI_HCD_MODULE)) |
| - |
| -/* Following a power loss, we must prepare to regain control of the ports |
| - * we used to own. This means turning on the port power before ehci-hcd |
| - * tries to switch ownership. |
| - * |
| - * This isn't a 100% perfect solution. On most systems the OHCI controllers |
| - * lie at lower PCI addresses than the EHCI controller, so they will be |
| - * discovered (and hence resumed) first. But there is no guarantee things |
| - * will always work this way. If the EHCI controller is resumed first and |
| - * the OHCI ports are unpowered, then the handover will fail. |
| - */ |
| -static void prepare_for_handover(struct usb_hcd *hcd) |
| -{ |
| - struct ohci_hcd *ohci = hcd_to_ohci(hcd); |
| - int port; |
| - |
| - /* Here we "know" root ports should always stay powered */ |
| - ohci_dbg(ohci, "powerup ports\n"); |
| - for (port = 0; port < ohci->num_ports; port++) |
| - ohci_writel(ohci, RH_PS_PPS, |
| - &ohci->regs->roothub.portstatus[port]); |
| - |
| - /* Flush those writes */ |
| - ohci_readl(ohci, &ohci->regs->control); |
| - msleep(20); |
| -} |
| - |
| -#else |
| - |
| -static inline void prepare_for_handover(struct usb_hcd *hcd) |
| -{ } |
| - |
| -#endif /* CONFIG_USB_PERSIST etc. */ |
| - |
| #ifdef CONFIG_PM |
| |
| static int ohci_pci_suspend (struct usb_hcd *hcd, pm_message_t message) |
| @@ -312,13 +276,8 @@ static int ohci_pci_suspend (struct usb_ |
| |
| static int ohci_pci_resume (struct usb_hcd *hcd) |
| { |
| - struct ohci_hcd *ohci = hcd_to_ohci(hcd); |
| - |
| set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); |
| - |
| - /* FIXME: we should try to detect loss of VBUS power here */ |
| - prepare_for_handover(hcd); |
| - ohci_writel(ohci, OHCI_INTR_MIE, &ohci->regs->intrenable); |
| + ohci_finish_controller_resume(hcd); |
| return 0; |
| } |
| |
| --- a/drivers/usb/host/ohci-pxa27x.c |
| +++ b/drivers/usb/host/ohci-pxa27x.c |
| @@ -358,8 +358,7 @@ static int ohci_hcd_pxa27x_drv_resume(st |
| return status; |
| |
| pdev->dev.power.power_state = PMSG_ON; |
| - usb_hcd_resume_root_hub(hcd); |
| - |
| + ohci_finish_controller_resume(hcd); |
| return 0; |
| } |
| #endif |
| --- a/drivers/usb/host/ohci-sm501.c |
| +++ b/drivers/usb/host/ohci-sm501.c |
| @@ -239,7 +239,7 @@ static int ohci_sm501_resume(struct plat |
| |
| sm501_unit_power(dev->parent, SM501_GATE_USB_HOST, 1); |
| dev->power.power_state = PMSG_ON; |
| - usb_hcd_resume_root_hub(platform_get_drvdata(pdev)); |
| + ohci_finish_controller_resume(hcd); |
| return 0; |
| } |
| #endif |
| --- a/drivers/usb/host/ohci-ssb.c |
| +++ b/drivers/usb/host/ohci-ssb.c |
| @@ -224,6 +224,7 @@ static int ssb_ohci_resume(struct ssb_de |
| |
| ssb_device_enable(dev, ohcidev->enable_flags); |
| |
| + ohci_finish_controller_resume(hcd); |
| return 0; |
| } |
| |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:21 2008 |
| Message-Id: <20080513200821.414834165@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:04:58 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>, |
| "David S. Miller" <davem@davemloft.net> |
| Subject: [patch 05/37] XFRM: AUDIT: Fix flowlabel text format ambibuity. |
| Content-Disposition: inline; filename=xfrm-audit-fix-flowlabel-text-format-ambibuity.patch |
| Content-Length: 972 |
| Lines: 33 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> |
| |
| [ Upstream commit: 27a27a2158f4fe56a29458449e880a52ddee3dc4 ] |
| |
| Flowlabel text format was not correct and thus ambiguous. |
| For example, 0x00123 or 0x01203 are formatted as 0x123. |
| This is not what audit tools want. |
| |
| Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| net/xfrm/xfrm_state.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/net/xfrm/xfrm_state.c |
| +++ b/net/xfrm/xfrm_state.c |
| @@ -2093,7 +2093,7 @@ static void xfrm_audit_helper_pktinfo(st |
| iph6 = ipv6_hdr(skb); |
| audit_log_format(audit_buf, |
| " src=" NIP6_FMT " dst=" NIP6_FMT |
| - " flowlbl=0x%x%x%x", |
| + " flowlbl=0x%x%02x%02x", |
| NIP6(iph6->saddr), |
| NIP6(iph6->daddr), |
| iph6->flow_lbl[0] & 0x0f, |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:21 2008 |
| Message-Id: <20080513200821.596013337@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:04:59 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| Robert Reif <reif@earthlink.net>, |
| "David S. Miller" <davem@davemloft.net> |
| Subject: [patch 06/37] sparc: sunzilog uart order |
| Content-Disposition: inline; filename=sparc-sunzilog-uart-order.patch |
| Content-Length: 3774 |
| Lines: 129 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Robert Reif <reif@earthlink.net> |
| |
| [ Upstream commit: 227739bf4c110bbd02d0c0f13b272c32de406e4c ] |
| |
| I have a sparcstation 20 clone with a lot of on board serial ports. |
| The serial core code assumes that uarts are assigned contiguously |
| and that may not be the case when there are multiple zs devices |
| present. This patch insures that uart chips are placed in front of |
| keyboard/mouse chips in the port table. |
| |
| ffd37420: ttyS0 at MMIO 0xf1100000 (irq = 44) is a zs (ESCC) |
| Console: ttyS0 (SunZilog zs0) |
| console [ttyS0] enabled |
| ffd37420: ttyS1 at MMIO 0xf1100004 (irq = 44) is a zs (ESCC) |
| ffd37500: Keyboard at MMIO 0xf1000000 (irq = 44) is a zs |
| ffd37500: Mouse at MMIO 0xf1000004 (irq = 44) is a zs |
| ffd3c5c0: ttyS2 at MMIO 0xf1100008 (irq = 44) is a zs (ESCC) |
| ffd3c5c0: ttyS3 at MMIO 0xf110000c (irq = 44) is a zs (ESCC) |
| ffd3c6a0: ttyS4 at MMIO 0xf1100010 (irq = 44) is a zs (ESCC) |
| ffd3c6a0: ttyS5 at MMIO 0xf1100014 (irq = 44) is a zs (ESCC) |
| ffd3c780: ttyS6 at MMIO 0xf1100018 (irq = 44) is a zs (ESCC) |
| ffd3c780: ttyS7 at MMIO 0xf110001c (irq = 44) is a zs (ESCC) |
| |
| Signed-off-by: Robert Reif <reif@earthlink.net> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/serial/sunzilog.c | 30 +++++++++++++++++------------- |
| 1 file changed, 17 insertions(+), 13 deletions(-) |
| |
| --- a/drivers/serial/sunzilog.c |
| +++ b/drivers/serial/sunzilog.c |
| @@ -1015,6 +1015,7 @@ static struct uart_ops sunzilog_pops = { |
| .verify_port = sunzilog_verify_port, |
| }; |
| |
| +static int uart_chip_count; |
| static struct uart_sunzilog_port *sunzilog_port_table; |
| static struct zilog_layout __iomem **sunzilog_chip_regs; |
| |
| @@ -1350,16 +1351,22 @@ static int zilog_irq = -1; |
| |
| static int __devinit zs_probe(struct of_device *op, const struct of_device_id *match) |
| { |
| - static int inst; |
| + static int kbm_inst, uart_inst; |
| + int inst; |
| struct uart_sunzilog_port *up; |
| struct zilog_layout __iomem *rp; |
| - int keyboard_mouse; |
| + int keyboard_mouse = 0; |
| int err; |
| |
| - keyboard_mouse = 0; |
| if (of_find_property(op->node, "keyboard", NULL)) |
| keyboard_mouse = 1; |
| |
| + /* uarts must come before keyboards/mice */ |
| + if (keyboard_mouse) |
| + inst = uart_chip_count + kbm_inst; |
| + else |
| + inst = uart_inst; |
| + |
| sunzilog_chip_regs[inst] = of_ioremap(&op->resource[0], 0, |
| sizeof(struct zilog_layout), |
| "zs"); |
| @@ -1427,6 +1434,7 @@ static int __devinit zs_probe(struct of_ |
| rp, sizeof(struct zilog_layout)); |
| return err; |
| } |
| + uart_inst++; |
| } else { |
| printk(KERN_INFO "%s: Keyboard at MMIO 0x%llx (irq = %d) " |
| "is a %s\n", |
| @@ -1438,12 +1446,11 @@ static int __devinit zs_probe(struct of_ |
| op->dev.bus_id, |
| (unsigned long long) up[1].port.mapbase, |
| op->irqs[0], sunzilog_type(&up[1].port)); |
| + kbm_inst++; |
| } |
| |
| dev_set_drvdata(&op->dev, &up[0]); |
| |
| - inst++; |
| - |
| return 0; |
| } |
| |
| @@ -1491,28 +1498,25 @@ static struct of_platform_driver zs_driv |
| static int __init sunzilog_init(void) |
| { |
| struct device_node *dp; |
| - int err, uart_count; |
| - int num_keybms; |
| + int err; |
| + int num_keybms = 0; |
| int num_sunzilog = 0; |
| |
| - num_keybms = 0; |
| for_each_node_by_name(dp, "zs") { |
| num_sunzilog++; |
| if (of_find_property(dp, "keyboard", NULL)) |
| num_keybms++; |
| } |
| |
| - uart_count = 0; |
| if (num_sunzilog) { |
| - int uart_count; |
| - |
| err = sunzilog_alloc_tables(num_sunzilog); |
| if (err) |
| goto out; |
| |
| - uart_count = (num_sunzilog * 2) - (2 * num_keybms); |
| + uart_chip_count = num_sunzilog - num_keybms; |
| |
| - err = sunserial_register_minors(&sunzilog_reg, uart_count); |
| + err = sunserial_register_minors(&sunzilog_reg, |
| + uart_chip_count * 2); |
| if (err) |
| goto out_free_tables; |
| } |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:21 2008 |
| Message-Id: <20080513200821.777202078@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:00 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| "David S. Miller" <davem@davemloft.net> |
| Subject: [patch 07/37] sparc: Fix SA_ONSTACK signal handling. |
| Content-Disposition: inline; filename=sparc-fix-sa_onstack-signal-handling.patch |
| Content-Length: 4734 |
| Lines: 137 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: David S. Miller <davem@davemloft.net> |
| |
| [ Upstream commit: dc5dc7e6d71ca9fd1ea01a1418150af3b2937489 ] |
| |
| We need to be more liberal about the alignment of the buffer given to |
| us by sigaltstack(). The user should not need to be mindful of all of |
| the alignment constraints we have for the stack frame. |
| |
| This mirrors how we handle this situation in clone() as well. |
| |
| Also, we align the stack even in non-SA_ONSTACK cases so that signals |
| due to bad stack alignment can be delivered properly. This makes such |
| errors easier to debug and recover from. |
| |
| Finally, add the sanity check x86 has to make sure we won't overflow |
| the signal stack. |
| |
| This fixes glibc testcases nptl/tst-cancel20.c and |
| nptl/tst-cancelx20.c |
| |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/sparc/kernel/signal.c | 20 +++++++++++++++++--- |
| arch/sparc64/kernel/signal.c | 21 +++++++++++++++++---- |
| arch/sparc64/kernel/signal32.c | 18 +++++++++++++++++- |
| 3 files changed, 51 insertions(+), 8 deletions(-) |
| |
| --- a/arch/sparc64/kernel/signal32.c |
| +++ b/arch/sparc64/kernel/signal32.c |
| @@ -497,11 +497,27 @@ static void __user *get_sigframe(struct |
| regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL; |
| sp = regs->u_regs[UREG_FP]; |
| |
| + /* |
| + * If we are on the alternate signal stack and would overflow it, don't. |
| + * Return an always-bogus address instead so we will die with SIGSEGV. |
| + */ |
| + if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize))) |
| + return (void __user *) -1L; |
| + |
| /* This is the X/Open sanctioned signal stack switching. */ |
| if (sa->sa_flags & SA_ONSTACK) { |
| - if (!on_sig_stack(sp) && !((current->sas_ss_sp + current->sas_ss_size) & 7)) |
| + if (sas_ss_flags(sp) == 0) |
| sp = current->sas_ss_sp + current->sas_ss_size; |
| } |
| + |
| + /* Always align the stack frame. This handles two cases. First, |
| + * sigaltstack need not be mindful of platform specific stack |
| + * alignment. Second, if we took this signal because the stack |
| + * is not aligned properly, we'd like to take the signal cleanly |
| + * and report that. |
| + */ |
| + sp &= ~7UL; |
| + |
| return (void __user *)(sp - framesize); |
| } |
| |
| --- a/arch/sparc64/kernel/signal.c |
| +++ b/arch/sparc64/kernel/signal.c |
| @@ -377,16 +377,29 @@ save_fpu_state(struct pt_regs *regs, __s |
| |
| static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, unsigned long framesize) |
| { |
| - unsigned long sp; |
| + unsigned long sp = regs->u_regs[UREG_FP] + STACK_BIAS; |
| |
| - sp = regs->u_regs[UREG_FP] + STACK_BIAS; |
| + /* |
| + * If we are on the alternate signal stack and would overflow it, don't. |
| + * Return an always-bogus address instead so we will die with SIGSEGV. |
| + */ |
| + if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize))) |
| + return (void __user *) -1L; |
| |
| /* This is the X/Open sanctioned signal stack switching. */ |
| if (ka->sa.sa_flags & SA_ONSTACK) { |
| - if (!on_sig_stack(sp) && |
| - !((current->sas_ss_sp + current->sas_ss_size) & 7)) |
| + if (sas_ss_flags(sp) == 0) |
| sp = current->sas_ss_sp + current->sas_ss_size; |
| } |
| + |
| + /* Always align the stack frame. This handles two cases. First, |
| + * sigaltstack need not be mindful of platform specific stack |
| + * alignment. Second, if we took this signal because the stack |
| + * is not aligned properly, we'd like to take the signal cleanly |
| + * and report that. |
| + */ |
| + sp &= ~7UL; |
| + |
| return (void __user *)(sp - framesize); |
| } |
| |
| --- a/arch/sparc/kernel/signal.c |
| +++ b/arch/sparc/kernel/signal.c |
| @@ -345,15 +345,29 @@ static inline int invalid_frame_pointer( |
| |
| static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize) |
| { |
| - unsigned long sp; |
| + unsigned long sp = regs->u_regs[UREG_FP]; |
| |
| - sp = regs->u_regs[UREG_FP]; |
| + /* |
| + * If we are on the alternate signal stack and would overflow it, don't. |
| + * Return an always-bogus address instead so we will die with SIGSEGV. |
| + */ |
| + if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize))) |
| + return (void __user *) -1L; |
| |
| /* This is the X/Open sanctioned signal stack switching. */ |
| if (sa->sa_flags & SA_ONSTACK) { |
| - if (!on_sig_stack(sp) && !((current->sas_ss_sp + current->sas_ss_size) & 7)) |
| + if (sas_ss_flags(sp) == 0) |
| sp = current->sas_ss_sp + current->sas_ss_size; |
| } |
| + |
| + /* Always align the stack frame. This handles two cases. First, |
| + * sigaltstack need not be mindful of platform specific stack |
| + * alignment. Second, if we took this signal because the stack |
| + * is not aligned properly, we'd like to take the signal cleanly |
| + * and report that. |
| + */ |
| + sp &= ~7UL; |
| + |
| return (void __user *)(sp - framesize); |
| } |
| |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:22 2008 |
| Message-Id: <20080513200821.954833732@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:01 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| "David S. Miller" <davem@davemloft.net> |
| Subject: [patch 08/37] sparc: Fix fork/clone/vfork system call restart. |
| Content-Disposition: inline; filename=sparc-fix-fork-clone-vfork-system-call-restart.patch |
| Content-Length: 2852 |
| Lines: 94 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: David S. Miller <davem@davemloft.net> |
| |
| [ Upstream commit: 1e38c126c9252b612697e34f43b1b3371c8ee31d ] |
| |
| We clobber %i1 as well as %i0 for these system calls, |
| because they give two return values. |
| |
| Therefore, on error, we have to restore %i1 properly |
| or else the restart explodes since it uses the wrong |
| arguments. |
| |
| This fixes glibc's nptl/tst-eintr1.c testcase. |
| |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/sparc/kernel/process.c | 20 ++++++++++++++++---- |
| arch/sparc64/kernel/process.c | 18 +++++++++++++++--- |
| 2 files changed, 31 insertions(+), 7 deletions(-) |
| |
| --- a/arch/sparc64/kernel/process.c |
| +++ b/arch/sparc64/kernel/process.c |
| @@ -507,6 +507,8 @@ asmlinkage long sparc_do_fork(unsigned l |
| unsigned long stack_size) |
| { |
| int __user *parent_tid_ptr, *child_tid_ptr; |
| + unsigned long orig_i1 = regs->u_regs[UREG_I1]; |
| + long ret; |
| |
| #ifdef CONFIG_COMPAT |
| if (test_thread_flag(TIF_32BIT)) { |
| @@ -519,9 +521,19 @@ asmlinkage long sparc_do_fork(unsigned l |
| child_tid_ptr = (int __user *) regs->u_regs[UREG_I4]; |
| } |
| |
| - return do_fork(clone_flags, stack_start, |
| - regs, stack_size, |
| - parent_tid_ptr, child_tid_ptr); |
| + ret = do_fork(clone_flags, stack_start, |
| + regs, stack_size, |
| + parent_tid_ptr, child_tid_ptr); |
| + |
| + /* If we get an error and potentially restart the system |
| + * call, we're screwed because copy_thread() clobbered |
| + * the parent's %o1. So detect that case and restore it |
| + * here. |
| + */ |
| + if ((unsigned long)ret >= -ERESTART_RESTARTBLOCK) |
| + regs->u_regs[UREG_I1] = orig_i1; |
| + |
| + return ret; |
| } |
| |
| /* Copy a Sparc thread. The fork() return value conventions |
| --- a/arch/sparc/kernel/process.c |
| +++ b/arch/sparc/kernel/process.c |
| @@ -421,14 +421,26 @@ asmlinkage int sparc_do_fork(unsigned lo |
| unsigned long stack_size) |
| { |
| unsigned long parent_tid_ptr, child_tid_ptr; |
| + unsigned long orig_i1 = regs->u_regs[UREG_I1]; |
| + long ret; |
| |
| parent_tid_ptr = regs->u_regs[UREG_I2]; |
| child_tid_ptr = regs->u_regs[UREG_I4]; |
| |
| - return do_fork(clone_flags, stack_start, |
| - regs, stack_size, |
| - (int __user *) parent_tid_ptr, |
| - (int __user *) child_tid_ptr); |
| + ret = do_fork(clone_flags, stack_start, |
| + regs, stack_size, |
| + (int __user *) parent_tid_ptr, |
| + (int __user *) child_tid_ptr); |
| + |
| + /* If we get an error and potentially restart the system |
| + * call, we're screwed because copy_thread() clobbered |
| + * the parent's %o1. So detect that case and restore it |
| + * here. |
| + */ |
| + if ((unsigned long)ret >= -ERESTART_RESTARTBLOCK) |
| + regs->u_regs[UREG_I1] = orig_i1; |
| + |
| + return ret; |
| } |
| |
| /* Copy a Sparc thread. The fork() return value conventions |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:22 2008 |
| Message-Id: <20080513200822.141647629@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:02 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| "David S. Miller" <davem@davemloft.net> |
| Subject: [patch 09/37] sparc64: Stop creating dummy root PCI host controller devices. |
| Content-Disposition: inline; filename=sparc64-stop-creating-dummy-root-pci-host-controller-devices.patch |
| Content-Length: 8588 |
| Lines: 256 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: David S. Miller <davem@davemloft.net> |
| |
| [ Upstream commit: 86d8337618e69573b5ccd3553f800944e843cae7 ] |
| |
| It just creates confusion, errors, and bugs. |
| |
| For one thing, this can cause dup sysfs or procfs nodes to get |
| created: |
| |
| [ 1.198015] proc_dir_entry '00.0' already registered |
| [ 1.198036] Call Trace: |
| [ 1.198052] [00000000004f2534] create_proc_entry+0x7c/0x98 |
| [ 1.198092] [00000000005719e4] pci_proc_attach_device+0xa4/0xd4 |
| [ 1.198126] [00000000007d991c] pci_proc_init+0x64/0x88 |
| [ 1.198158] [00000000007c62a4] kernel_init+0x190/0x330 |
| [ 1.198183] [0000000000426cf8] kernel_thread+0x38/0x48 |
| [ 1.198210] [00000000006a0d90] rest_init+0x18/0x5c |
| |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/sparc64/kernel/pci.c | 130 +++++++++------------------------------ |
| arch/sparc64/kernel/pci_common.c | 6 - |
| arch/sparc64/kernel/pci_impl.h | 9 -- |
| 3 files changed, 33 insertions(+), 112 deletions(-) |
| |
| --- a/arch/sparc64/kernel/pci.c |
| +++ b/arch/sparc64/kernel/pci.c |
| @@ -351,8 +351,7 @@ static void pci_parse_of_addrs(struct of |
| |
| struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm, |
| struct device_node *node, |
| - struct pci_bus *bus, int devfn, |
| - int host_controller) |
| + struct pci_bus *bus, int devfn) |
| { |
| struct dev_archdata *sd; |
| struct pci_dev *dev; |
| @@ -389,43 +388,28 @@ struct pci_dev *of_create_pci_dev(struct |
| dev->devfn = devfn; |
| dev->multifunction = 0; /* maybe a lie? */ |
| |
| - if (host_controller) { |
| - if (tlb_type != hypervisor) { |
| - pci_read_config_word(dev, PCI_VENDOR_ID, |
| - &dev->vendor); |
| - pci_read_config_word(dev, PCI_DEVICE_ID, |
| - &dev->device); |
| - } else { |
| - dev->vendor = PCI_VENDOR_ID_SUN; |
| - dev->device = 0x80f0; |
| - } |
| - dev->cfg_size = 256; |
| - dev->class = PCI_CLASS_BRIDGE_HOST << 8; |
| - sprintf(pci_name(dev), "%04x:%02x:%02x.%d", pci_domain_nr(bus), |
| - 0x00, PCI_SLOT(devfn), PCI_FUNC(devfn)); |
| - } else { |
| - dev->vendor = of_getintprop_default(node, "vendor-id", 0xffff); |
| - dev->device = of_getintprop_default(node, "device-id", 0xffff); |
| - dev->subsystem_vendor = |
| - of_getintprop_default(node, "subsystem-vendor-id", 0); |
| - dev->subsystem_device = |
| - of_getintprop_default(node, "subsystem-id", 0); |
| - |
| - dev->cfg_size = pci_cfg_space_size(dev); |
| - |
| - /* We can't actually use the firmware value, we have |
| - * to read what is in the register right now. One |
| - * reason is that in the case of IDE interfaces the |
| - * firmware can sample the value before the the IDE |
| - * interface is programmed into native mode. |
| - */ |
| - pci_read_config_dword(dev, PCI_CLASS_REVISION, &class); |
| - dev->class = class >> 8; |
| - dev->revision = class & 0xff; |
| + dev->vendor = of_getintprop_default(node, "vendor-id", 0xffff); |
| + dev->device = of_getintprop_default(node, "device-id", 0xffff); |
| + dev->subsystem_vendor = |
| + of_getintprop_default(node, "subsystem-vendor-id", 0); |
| + dev->subsystem_device = |
| + of_getintprop_default(node, "subsystem-id", 0); |
| + |
| + dev->cfg_size = pci_cfg_space_size(dev); |
| + |
| + /* We can't actually use the firmware value, we have |
| + * to read what is in the register right now. One |
| + * reason is that in the case of IDE interfaces the |
| + * firmware can sample the value before the the IDE |
| + * interface is programmed into native mode. |
| + */ |
| + pci_read_config_dword(dev, PCI_CLASS_REVISION, &class); |
| + dev->class = class >> 8; |
| + dev->revision = class & 0xff; |
| + |
| + sprintf(pci_name(dev), "%04x:%02x:%02x.%d", pci_domain_nr(bus), |
| + dev->bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn)); |
| |
| - sprintf(pci_name(dev), "%04x:%02x:%02x.%d", pci_domain_nr(bus), |
| - dev->bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn)); |
| - } |
| if (ofpci_verbose) |
| printk(" class: 0x%x device name: %s\n", |
| dev->class, pci_name(dev)); |
| @@ -440,26 +424,21 @@ struct pci_dev *of_create_pci_dev(struct |
| dev->current_state = 4; /* unknown power state */ |
| dev->error_state = pci_channel_io_normal; |
| |
| - if (host_controller) { |
| + if (!strcmp(type, "pci") || !strcmp(type, "pciex")) { |
| + /* a PCI-PCI bridge */ |
| dev->hdr_type = PCI_HEADER_TYPE_BRIDGE; |
| dev->rom_base_reg = PCI_ROM_ADDRESS1; |
| - dev->irq = PCI_IRQ_NONE; |
| + } else if (!strcmp(type, "cardbus")) { |
| + dev->hdr_type = PCI_HEADER_TYPE_CARDBUS; |
| } else { |
| - if (!strcmp(type, "pci") || !strcmp(type, "pciex")) { |
| - /* a PCI-PCI bridge */ |
| - dev->hdr_type = PCI_HEADER_TYPE_BRIDGE; |
| - dev->rom_base_reg = PCI_ROM_ADDRESS1; |
| - } else if (!strcmp(type, "cardbus")) { |
| - dev->hdr_type = PCI_HEADER_TYPE_CARDBUS; |
| - } else { |
| - dev->hdr_type = PCI_HEADER_TYPE_NORMAL; |
| - dev->rom_base_reg = PCI_ROM_ADDRESS; |
| + dev->hdr_type = PCI_HEADER_TYPE_NORMAL; |
| + dev->rom_base_reg = PCI_ROM_ADDRESS; |
| |
| - dev->irq = sd->op->irqs[0]; |
| - if (dev->irq == 0xffffffff) |
| - dev->irq = PCI_IRQ_NONE; |
| - } |
| + dev->irq = sd->op->irqs[0]; |
| + if (dev->irq == 0xffffffff) |
| + dev->irq = PCI_IRQ_NONE; |
| } |
| + |
| pci_parse_of_addrs(sd->op, node, dev); |
| |
| if (ofpci_verbose) |
| @@ -748,7 +727,7 @@ static void __devinit pci_of_scan_bus(st |
| prev_devfn = devfn; |
| |
| /* create a new pci_dev for this device */ |
| - dev = of_create_pci_dev(pbm, child, bus, devfn, 0); |
| + dev = of_create_pci_dev(pbm, child, bus, devfn); |
| if (!dev) |
| continue; |
| if (ofpci_verbose) |
| @@ -795,48 +774,9 @@ static void __devinit pci_bus_register_o |
| pci_bus_register_of_sysfs(child_bus); |
| } |
| |
| -int pci_host_bridge_read_pci_cfg(struct pci_bus *bus_dev, |
| - unsigned int devfn, |
| - int where, int size, |
| - u32 *value) |
| -{ |
| - static u8 fake_pci_config[] = { |
| - 0x8e, 0x10, /* Vendor: 0x108e (Sun) */ |
| - 0xf0, 0x80, /* Device: 0x80f0 (Fire) */ |
| - 0x46, 0x01, /* Command: 0x0146 (SERR, PARITY, MASTER, MEM) */ |
| - 0xa0, 0x22, /* Status: 0x02a0 (DEVSEL_MED, FB2B, 66MHZ) */ |
| - 0x00, 0x00, 0x00, 0x06, /* Class: 0x06000000 host bridge */ |
| - 0x00, /* Cacheline: 0x00 */ |
| - 0x40, /* Latency: 0x40 */ |
| - 0x00, /* Header-Type: 0x00 normal */ |
| - }; |
| - |
| - *value = 0; |
| - if (where >= 0 && where < sizeof(fake_pci_config) && |
| - (where + size) >= 0 && |
| - (where + size) < sizeof(fake_pci_config) && |
| - size <= sizeof(u32)) { |
| - while (size--) { |
| - *value <<= 8; |
| - *value |= fake_pci_config[where + size]; |
| - } |
| - } |
| - |
| - return PCIBIOS_SUCCESSFUL; |
| -} |
| - |
| -int pci_host_bridge_write_pci_cfg(struct pci_bus *bus_dev, |
| - unsigned int devfn, |
| - int where, int size, |
| - u32 value) |
| -{ |
| - return PCIBIOS_SUCCESSFUL; |
| -} |
| - |
| struct pci_bus * __devinit pci_scan_one_pbm(struct pci_pbm_info *pbm) |
| { |
| struct device_node *node = pbm->prom_node; |
| - struct pci_dev *host_pdev; |
| struct pci_bus *bus; |
| |
| printk("PCI: Scanning PBM %s\n", node->full_name); |
| @@ -854,10 +794,6 @@ struct pci_bus * __devinit pci_scan_one_ |
| bus->resource[0] = &pbm->io_space; |
| bus->resource[1] = &pbm->mem_space; |
| |
| - /* Create the dummy host bridge and link it in. */ |
| - host_pdev = of_create_pci_dev(pbm, node, bus, 0x00, 1); |
| - bus->self = host_pdev; |
| - |
| pci_of_scan_bus(pbm, node, bus); |
| pci_bus_add_devices(bus); |
| pci_bus_register_of_sysfs(bus); |
| --- a/arch/sparc64/kernel/pci_common.c |
| +++ b/arch/sparc64/kernel/pci_common.c |
| @@ -264,9 +264,6 @@ static int sun4v_read_pci_cfg(struct pci |
| unsigned int func = PCI_FUNC(devfn); |
| unsigned long ret; |
| |
| - if (!bus && devfn == 0x00) |
| - return pci_host_bridge_read_pci_cfg(bus_dev, devfn, where, |
| - size, value); |
| if (config_out_of_range(pbm, bus, devfn, where)) { |
| ret = ~0UL; |
| } else { |
| @@ -300,9 +297,6 @@ static int sun4v_write_pci_cfg(struct pc |
| unsigned int func = PCI_FUNC(devfn); |
| unsigned long ret; |
| |
| - if (!bus && devfn == 0x00) |
| - return pci_host_bridge_write_pci_cfg(bus_dev, devfn, where, |
| - size, value); |
| if (config_out_of_range(pbm, bus, devfn, where)) { |
| /* Do nothing. */ |
| } else { |
| --- a/arch/sparc64/kernel/pci_impl.h |
| +++ b/arch/sparc64/kernel/pci_impl.h |
| @@ -167,15 +167,6 @@ extern void pci_get_pbm_props(struct pci |
| extern struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm); |
| extern void pci_determine_mem_io_space(struct pci_pbm_info *pbm); |
| |
| -extern int pci_host_bridge_read_pci_cfg(struct pci_bus *bus_dev, |
| - unsigned int devfn, |
| - int where, int size, |
| - u32 *value); |
| -extern int pci_host_bridge_write_pci_cfg(struct pci_bus *bus_dev, |
| - unsigned int devfn, |
| - int where, int size, |
| - u32 value); |
| - |
| /* Error reporting support. */ |
| extern void pci_scan_for_target_abort(struct pci_pbm_info *, struct pci_bus *); |
| extern void pci_scan_for_master_abort(struct pci_pbm_info *, struct pci_bus *); |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:22 2008 |
| Message-Id: <20080513200822.331433691@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:03 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| "David S. Miller" <davem@davemloft.net> |
| Subject: [patch 10/37] sparc64: Fix wedged irq regression. |
| Content-Disposition: inline; filename=sparc64-fix-wedged-irq-regression.patch |
| Content-Length: 1973 |
| Lines: 63 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: David S. Miller <davem@davemloft.net> |
| |
| [ Upstream commit: 92aa3573c9cd58fe0bcd1c52c9fd8f5708785917 ] |
| |
| Kernel bugzilla 10273 |
| |
| As reported by Jos van der Ende, ever since commit |
| 5a606b72a4309a656cd1a19ad137dc5557c4b8ea ("[SPARC64]: Do not ACK an |
| INO if it is disabled or inprogress.") sun4u interrupts |
| can get stuck. |
| |
| What this changset did was add the following conditional to |
| the various IRQ chip ->enable() handlers on sparc64: |
| |
| if (unlikely(desc->status & (IRQ_DISABLED|IRQ_INPROGRESS))) |
| return; |
| |
| which is correct, however it means that special care is needed |
| in the ->enable() method. |
| |
| Specifically we must put the interrupt into IDLE state during |
| an enable, or else it might never be sent out again. |
| |
| Setting the INO interrupt state to IDLE resets the state machine, |
| the interrupt input to the INO is retested by the hardware, and |
| if an interrupt is being signalled by the device, the INO |
| moves back into TRANSMIT state, and an interrupt vector is sent |
| to the cpu. |
| |
| The two sun4v IRQ chip handlers were already doing this properly, |
| only sun4u got it wrong. |
| |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/sparc64/kernel/irq.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/arch/sparc64/kernel/irq.c |
| +++ b/arch/sparc64/kernel/irq.c |
| @@ -1,6 +1,6 @@ |
| /* irq.c: UltraSparc IRQ handling/init/registry. |
| * |
| - * Copyright (C) 1997, 2007 David S. Miller (davem@davemloft.net) |
| + * Copyright (C) 1997, 2007, 2008 David S. Miller (davem@davemloft.net) |
| * Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be) |
| * Copyright (C) 1998 Jakub Jelinek (jj@ultra.linux.cz) |
| */ |
| @@ -308,6 +308,7 @@ static void sun4u_irq_enable(unsigned in |
| IMAP_AID_SAFARI | IMAP_NID_SAFARI); |
| val |= tid | IMAP_VALID; |
| upa_writeq(val, imap); |
| + upa_writeq(ICLR_IDLE, data->iclr); |
| } |
| } |
| |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:22 2008 |
| Message-Id: <20080513200822.511923041@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:04 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| "David S. Miller" <davem@davemloft.net> |
| Subject: [patch 11/37] SPARC64: Fix args to 64-bit sys_semctl() via sys_ipc(). |
| Content-Disposition: inline; filename=sparc64-fix-args-to-64-bit-sys_semctl-via-sys_ipc.patch |
| Content-Length: 902 |
| Lines: 34 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: David S. Miller <davem@davemloft.net> |
| |
| [ Upstream commit: 020cfb05f2c594c778537159bd45ea5efb0c5e0d ] |
| |
| Second and third arguments were swapped for whatever reason. |
| |
| Reported by Tom Callaway. |
| |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/sparc64/kernel/sys_sparc.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/arch/sparc64/kernel/sys_sparc.c |
| +++ b/arch/sparc64/kernel/sys_sparc.c |
| @@ -454,8 +454,8 @@ asmlinkage long sys_ipc(unsigned int cal |
| err = sys_semget(first, (int)second, (int)third); |
| goto out; |
| case SEMCTL: { |
| - err = sys_semctl(first, third, |
| - (int)second | IPC_64, |
| + err = sys_semctl(first, second, |
| + (int)third | IPC_64, |
| (union semun) ptr); |
| goto out; |
| } |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:22 2008 |
| Message-Id: <20080513200822.694820029@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:05 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| "David S. Miller" <davem@davemloft.net> |
| Subject: [patch 12/37] serial: Fix sparc driver name strings. |
| Content-Disposition: inline; filename=serial-fix-sparc-driver-name-strings.patch |
| Content-Length: 2437 |
| Lines: 79 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: David S. Miller <davem@davemloft.net> |
| |
| [ Upstream commit: b53e5216e5f73330bffae93b42dceb94e361f4c0 ] |
| |
| They were all "serial" so if multiple of these drivers registered, |
| we'd trigger sysfs directory creation errors: |
| |
| [ 1.695793] proc_dir_entry 'serial' already registered |
| [ 1.695839] Call Trace: |
| [ 1.831891] [00000000004f2534] create_proc_entry+0x7c/0x98 |
| [ 1.833608] [00000000004f3a58] proc_tty_register_driver+0x40/0x70 |
| [ 1.833663] [0000000000594700] tty_register_driver+0x1fc/0x208 |
| [ 1.835371] [00000000005aade4] uart_register_driver+0x134/0x16c |
| [ 1.841762] [00000000005ac274] sunserial_register_minors+0x34/0x68 |
| [ 1.841818] [00000000007db2a4] sunsu_init+0xf8/0x150 |
| [ 1.867697] [00000000007c62a4] kernel_init+0x190/0x330 |
| [ 1.939147] [0000000000426cf8] kernel_thread+0x38/0x48 |
| [ 1.939198] [00000000006a0d90] rest_init+0x18/0x5c |
| |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/serial/sunhv.c | 2 +- |
| drivers/serial/sunsab.c | 2 +- |
| drivers/serial/sunsu.c | 2 +- |
| drivers/serial/sunzilog.c | 2 +- |
| 4 files changed, 4 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/serial/sunhv.c |
| +++ b/drivers/serial/sunhv.c |
| @@ -392,7 +392,7 @@ static struct uart_ops sunhv_pops = { |
| |
| static struct uart_driver sunhv_reg = { |
| .owner = THIS_MODULE, |
| - .driver_name = "serial", |
| + .driver_name = "sunhv", |
| .dev_name = "ttyS", |
| .major = TTY_MAJOR, |
| }; |
| --- a/drivers/serial/sunsab.c |
| +++ b/drivers/serial/sunsab.c |
| @@ -826,7 +826,7 @@ static struct uart_ops sunsab_pops = { |
| |
| static struct uart_driver sunsab_reg = { |
| .owner = THIS_MODULE, |
| - .driver_name = "serial", |
| + .driver_name = "sunsab", |
| .dev_name = "ttyS", |
| .major = TTY_MAJOR, |
| }; |
| --- a/drivers/serial/sunsu.c |
| +++ b/drivers/serial/sunsu.c |
| @@ -1173,7 +1173,7 @@ out: |
| |
| static struct uart_driver sunsu_reg = { |
| .owner = THIS_MODULE, |
| - .driver_name = "serial", |
| + .driver_name = "sunsu", |
| .dev_name = "ttyS", |
| .major = TTY_MAJOR, |
| }; |
| --- a/drivers/serial/sunzilog.c |
| +++ b/drivers/serial/sunzilog.c |
| @@ -1023,7 +1023,7 @@ static struct uart_sunzilog_port *sunzil |
| |
| static struct uart_driver sunzilog_reg = { |
| .owner = THIS_MODULE, |
| - .driver_name = "ttyS", |
| + .driver_name = "sunzilog", |
| .dev_name = "ttyS", |
| .major = TTY_MAJOR, |
| }; |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:23 2008 |
| Message-Id: <20080513200822.896665165@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:06 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| Jarek Poplawski <jarkao2@gmail.com>, |
| "David S. Miller" <davem@davemloft.net> |
| Subject: [patch 13/37] sch_htb: remove from event queue in htb_parent_to_leaf() |
| Content-Disposition: inline; filename=sch_htb-remove-from-event-queue-in-htb_parent_to_leaf.patch |
| Content-Length: 1908 |
| Lines: 59 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Jarek Poplawski <jarkao2@gmail.com> |
| |
| [ Upstream commit: 3ba08b00e0d8413d79be9cab8ec085ceb6ae6fd6 ] |
| |
| There is lack of removing a class from the event queue while changing |
| from parent to leaf which can cause corruption of this rb tree. This |
| patch fixes a bug introduced by my patch: "sch_htb: turn intermediate |
| classes into leaves" commit: 160d5e10f87b1dc88fd9b84b31b1718e0fd76398. |
| |
| Many thanks to Jan 'yanek' Bortl for finding a way to reproduce this |
| rare bug and narrowing the test case, which made possible proper |
| diagnosing. |
| |
| This patch is recommended for all kernels starting from 2.6.20. |
| |
| Reported-and-tested-by: Jan 'yanek' Bortl <yanek@ya.bofh.cz> |
| Signed-off-by: Jarek Poplawski <jarkao2@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| net/sched/sch_htb.c | 8 ++++++-- |
| 1 file changed, 6 insertions(+), 2 deletions(-) |
| |
| --- a/net/sched/sch_htb.c |
| +++ b/net/sched/sch_htb.c |
| @@ -1197,12 +1197,16 @@ static inline int htb_parent_last_child( |
| return 1; |
| } |
| |
| -static void htb_parent_to_leaf(struct htb_class *cl, struct Qdisc *new_q) |
| +static void htb_parent_to_leaf(struct htb_sched *q, struct htb_class *cl, |
| + struct Qdisc *new_q) |
| { |
| struct htb_class *parent = cl->parent; |
| |
| BUG_TRAP(!cl->level && cl->un.leaf.q && !cl->prio_activity); |
| |
| + if (parent->cmode != HTB_CAN_SEND) |
| + htb_safe_rb_erase(&parent->pq_node, q->wait_pq + parent->level); |
| + |
| parent->level = 0; |
| memset(&parent->un.inner, 0, sizeof(parent->un.inner)); |
| INIT_LIST_HEAD(&parent->un.leaf.drop_list); |
| @@ -1300,7 +1304,7 @@ static int htb_delete(struct Qdisc *sch, |
| htb_deactivate(q, cl); |
| |
| if (last_child) |
| - htb_parent_to_leaf(cl, new_q); |
| + htb_parent_to_leaf(q, cl, new_q); |
| |
| if (--cl->refcnt == 0) |
| htb_destroy_class(sch, cl); |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:23 2008 |
| Message-Id: <20080513200823.062749263@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:07 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| "David S. Miller" <davem@davemloft.net> |
| Subject: [patch 14/37] macvlan: Fix memleak on device removal/crash on module removal |
| Content-Disposition: inline; filename=macvlan-fix-memleak-on-device-removal-crash-on-module-removal.patch |
| Content-Length: 1268 |
| Lines: 39 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Patrick McHardy <kaber@trash.net> |
| |
| [ Upstream commit: 7312096454b6cd71267eaa3d0efb408e449e9ff3 ] |
| |
| As noticed by Ben Greear, macvlan crashes the kernel when unloading the |
| module. The reason is that it tries to clean up the macvlan_port pointer |
| on the macvlan device itself instead of the underlying device. A non-NULL |
| pointer is taken as indication that the macvlan_handle_frame_hook is |
| valid, when receiving the next packet on the underlying device it tries |
| to call the NULL hook and crashes. |
| |
| Clean up the macvlan_port on the correct device to fix this. |
| |
| Signed-off-by; Patrick McHardy <kaber@trash.net> |
| Tested-by: Ben Greear <greearb@candelatech.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/net/macvlan.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/drivers/net/macvlan.c |
| +++ b/drivers/net/macvlan.c |
| @@ -450,7 +450,7 @@ static void macvlan_dellink(struct net_d |
| unregister_netdevice(dev); |
| |
| if (list_empty(&port->vlans)) |
| - macvlan_port_destroy(dev); |
| + macvlan_port_destroy(port->dev); |
| } |
| |
| static struct rtnl_link_ops macvlan_link_ops __read_mostly = { |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:23 2008 |
| Message-Id: <20080513200823.257152393@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:08 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| Julian Anastasov <ja@ssi.bg>, |
| "David S. Miller" <davem@davemloft.net> |
| Subject: [patch 15/37] ipvs: fix oops in backup for fwmark conn templates |
| Content-Disposition: inline; filename=ipvs-fix-oops-in-backup-for-fwmark-conn-templates.patch |
| Content-Length: 6492 |
| Lines: 220 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Julian Anastasov <ja@ssi.bg> |
| |
| [ Upstream commit: 2ad17defd596ca7e8ba782d5fc6950ee0e99513c ] |
| |
| Fixes bug http://bugzilla.kernel.org/show_bug.cgi?id=10556 |
| where conn templates with protocol=IPPROTO_IP can oops backup box. |
| |
| Result from ip_vs_proto_get() should be checked because |
| protocol value can be invalid or unsupported in backup. But |
| for valid message we should not fail for templates which use |
| IPPROTO_IP. Also, add checks to validate message limits and |
| connection state. Show state NONE for templates using IPPROTO_IP. |
| |
| Fix tested and confirmed by L0op8ack <l0op8ack@hotmail.com> |
| |
| Signed-off-by: Julian Anastasov <ja@ssi.bg> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| include/net/ip_vs.h | 3 + |
| net/ipv4/ipvs/ip_vs_proto.c | 2 - |
| net/ipv4/ipvs/ip_vs_proto_ah.c | 1 |
| net/ipv4/ipvs/ip_vs_proto_esp.c | 1 |
| net/ipv4/ipvs/ip_vs_proto_tcp.c | 1 |
| net/ipv4/ipvs/ip_vs_proto_udp.c | 1 |
| net/ipv4/ipvs/ip_vs_sync.c | 80 +++++++++++++++++++++++++++++----------- |
| 7 files changed, 66 insertions(+), 23 deletions(-) |
| |
| --- a/include/net/ip_vs.h |
| +++ b/include/net/ip_vs.h |
| @@ -405,7 +405,8 @@ struct sk_buff; |
| struct ip_vs_protocol { |
| struct ip_vs_protocol *next; |
| char *name; |
| - __u16 protocol; |
| + u16 protocol; |
| + u16 num_states; |
| int dont_defrag; |
| atomic_t appcnt; /* counter of proto app incs */ |
| int *timeout_table; /* protocol timeout table */ |
| --- a/net/ipv4/ipvs/ip_vs_proto_ah.c |
| +++ b/net/ipv4/ipvs/ip_vs_proto_ah.c |
| @@ -160,6 +160,7 @@ static void ah_exit(struct ip_vs_protoco |
| struct ip_vs_protocol ip_vs_protocol_ah = { |
| .name = "AH", |
| .protocol = IPPROTO_AH, |
| + .num_states = 1, |
| .dont_defrag = 1, |
| .init = ah_init, |
| .exit = ah_exit, |
| --- a/net/ipv4/ipvs/ip_vs_proto.c |
| +++ b/net/ipv4/ipvs/ip_vs_proto.c |
| @@ -148,7 +148,7 @@ const char * ip_vs_state_name(__u16 prot |
| struct ip_vs_protocol *pp = ip_vs_proto_get(proto); |
| |
| if (pp == NULL || pp->state_name == NULL) |
| - return "ERR!"; |
| + return (IPPROTO_IP == proto) ? "NONE" : "ERR!"; |
| return pp->state_name(state); |
| } |
| |
| --- a/net/ipv4/ipvs/ip_vs_proto_esp.c |
| +++ b/net/ipv4/ipvs/ip_vs_proto_esp.c |
| @@ -159,6 +159,7 @@ static void esp_exit(struct ip_vs_protoc |
| struct ip_vs_protocol ip_vs_protocol_esp = { |
| .name = "ESP", |
| .protocol = IPPROTO_ESP, |
| + .num_states = 1, |
| .dont_defrag = 1, |
| .init = esp_init, |
| .exit = esp_exit, |
| --- a/net/ipv4/ipvs/ip_vs_proto_tcp.c |
| +++ b/net/ipv4/ipvs/ip_vs_proto_tcp.c |
| @@ -594,6 +594,7 @@ static void ip_vs_tcp_exit(struct ip_vs_ |
| struct ip_vs_protocol ip_vs_protocol_tcp = { |
| .name = "TCP", |
| .protocol = IPPROTO_TCP, |
| + .num_states = IP_VS_TCP_S_LAST, |
| .dont_defrag = 0, |
| .appcnt = ATOMIC_INIT(0), |
| .init = ip_vs_tcp_init, |
| --- a/net/ipv4/ipvs/ip_vs_proto_udp.c |
| +++ b/net/ipv4/ipvs/ip_vs_proto_udp.c |
| @@ -409,6 +409,7 @@ static void udp_exit(struct ip_vs_protoc |
| struct ip_vs_protocol ip_vs_protocol_udp = { |
| .name = "UDP", |
| .protocol = IPPROTO_UDP, |
| + .num_states = IP_VS_UDP_S_LAST, |
| .dont_defrag = 0, |
| .init = udp_init, |
| .exit = udp_exit, |
| --- a/net/ipv4/ipvs/ip_vs_sync.c |
| +++ b/net/ipv4/ipvs/ip_vs_sync.c |
| @@ -288,11 +288,16 @@ static void ip_vs_process_message(const |
| char *p; |
| int i; |
| |
| + if (buflen < sizeof(struct ip_vs_sync_mesg)) { |
| + IP_VS_ERR_RL("sync message header too short\n"); |
| + return; |
| + } |
| + |
| /* Convert size back to host byte order */ |
| m->size = ntohs(m->size); |
| |
| if (buflen != m->size) { |
| - IP_VS_ERR("bogus message\n"); |
| + IP_VS_ERR_RL("bogus sync message size\n"); |
| return; |
| } |
| |
| @@ -307,9 +312,48 @@ static void ip_vs_process_message(const |
| for (i=0; i<m->nr_conns; i++) { |
| unsigned flags, state; |
| |
| - s = (struct ip_vs_sync_conn *)p; |
| + if (p + SIMPLE_CONN_SIZE > buffer+buflen) { |
| + IP_VS_ERR_RL("bogus conn in sync message\n"); |
| + return; |
| + } |
| + s = (struct ip_vs_sync_conn *) p; |
| flags = ntohs(s->flags) | IP_VS_CONN_F_SYNC; |
| + flags &= ~IP_VS_CONN_F_HASHED; |
| + if (flags & IP_VS_CONN_F_SEQ_MASK) { |
| + opt = (struct ip_vs_sync_conn_options *)&s[1]; |
| + p += FULL_CONN_SIZE; |
| + if (p > buffer+buflen) { |
| + IP_VS_ERR_RL("bogus conn options in sync message\n"); |
| + return; |
| + } |
| + } else { |
| + opt = NULL; |
| + p += SIMPLE_CONN_SIZE; |
| + } |
| + |
| state = ntohs(s->state); |
| + if (!(flags & IP_VS_CONN_F_TEMPLATE)) { |
| + pp = ip_vs_proto_get(s->protocol); |
| + if (!pp) { |
| + IP_VS_ERR_RL("Unsupported protocol %u in sync msg\n", |
| + s->protocol); |
| + continue; |
| + } |
| + if (state >= pp->num_states) { |
| + IP_VS_DBG(2, "Invalid %s state %u in sync msg\n", |
| + pp->name, state); |
| + continue; |
| + } |
| + } else { |
| + /* protocol in templates is not used for state/timeout */ |
| + pp = NULL; |
| + if (state > 0) { |
| + IP_VS_DBG(2, "Invalid template state %u in sync msg\n", |
| + state); |
| + state = 0; |
| + } |
| + } |
| + |
| if (!(flags & IP_VS_CONN_F_TEMPLATE)) |
| cp = ip_vs_conn_in_get(s->protocol, |
| s->caddr, s->cport, |
| @@ -345,14 +389,9 @@ static void ip_vs_process_message(const |
| IP_VS_ERR("ip_vs_conn_new failed\n"); |
| return; |
| } |
| - cp->state = state; |
| } else if (!cp->dest) { |
| dest = ip_vs_try_bind_dest(cp); |
| - if (!dest) { |
| - /* it is an unbound entry created by |
| - * synchronization */ |
| - cp->flags = flags | IP_VS_CONN_F_HASHED; |
| - } else |
| + if (dest) |
| atomic_dec(&dest->refcnt); |
| } else if ((cp->dest) && (cp->protocol == IPPROTO_TCP) && |
| (cp->state != state)) { |
| @@ -371,23 +410,22 @@ static void ip_vs_process_message(const |
| } |
| } |
| |
| - if (flags & IP_VS_CONN_F_SEQ_MASK) { |
| - opt = (struct ip_vs_sync_conn_options *)&s[1]; |
| + if (opt) |
| memcpy(&cp->in_seq, opt, sizeof(*opt)); |
| - p += FULL_CONN_SIZE; |
| - } else |
| - p += SIMPLE_CONN_SIZE; |
| - |
| atomic_set(&cp->in_pkts, sysctl_ip_vs_sync_threshold[0]); |
| cp->state = state; |
| - pp = ip_vs_proto_get(s->protocol); |
| - cp->timeout = pp->timeout_table[cp->state]; |
| + cp->old_state = cp->state; |
| + /* |
| + * We can not recover the right timeout for templates |
| + * in all cases, we can not find the right fwmark |
| + * virtual service. If needed, we can do it for |
| + * non-fwmark persistent services. |
| + */ |
| + if (!(flags & IP_VS_CONN_F_TEMPLATE) && pp->timeout_table) |
| + cp->timeout = pp->timeout_table[state]; |
| + else |
| + cp->timeout = (3*60*HZ); |
| ip_vs_conn_put(cp); |
| - |
| - if (p > buffer+buflen) { |
| - IP_VS_ERR("bogus message\n"); |
| - return; |
| - } |
| } |
| } |
| |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:23 2008 |
| Message-Id: <20080513200823.443597806@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:09 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| Chris Wright <chrisw@sous-sol.org>, |
| Arnaldo Carvalho de Melo <acme@redhat.com>, |
| "David S. Miller" <davem@davemloft.net> |
| Subject: [patch 16/37] dccp: return -EINVAL on invalid feature length |
| Content-Disposition: inline; filename=dccp-return-einval-on-invalid-feature-length.patch |
| Content-Length: 936 |
| Lines: 34 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Chris Wright <chrisw@sous-sol.org> |
| |
| [ Upstream commit: 19443178fbfbf40db15c86012fc37df1a44ab857 ] |
| |
| dccp_feat_change() validates length and on error is returning 1. |
| This happens to work since call chain is checking for 0 == success, |
| but this is returned to userspace, so make it a real error value. |
| |
| Signed-off-by: Chris Wright <chrisw@sous-sol.org> |
| Acked-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| net/dccp/feat.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/net/dccp/feat.c |
| +++ b/net/dccp/feat.c |
| @@ -32,7 +32,7 @@ int dccp_feat_change(struct dccp_minisoc |
| |
| if (len > 3) { |
| DCCP_WARN("invalid length %d\n", len); |
| - return 1; |
| + return -EINVAL; |
| } |
| /* XXX add further sanity checks */ |
| |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:23 2008 |
| Message-Id: <20080513200823.625657607@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:10 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| Oliver Hartkopp <oliver@hartkopp.net>, |
| Urs Thuermann <urs@isnogud.escape.de>, |
| "David S. Miller" <davem@davemloft.net> |
| Subject: [patch 17/37] can: Fix can_send() handling on dev_queue_xmit() failures |
| Content-Disposition: inline; filename=can-fix-can_send-handling-on-dev_queue_xmit-failures.patch |
| Content-Length: 1951 |
| Lines: 75 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Oliver Hartkopp <oliver@hartkopp.net> |
| |
| [ Upstream commit: c2ab7ac225e29006b7117d6a9fe8f3be8d98b0c2 ] |
| |
| The tx packet counting and the local loopback of CAN frames should |
| only happen in the case that the CAN frame has been enqueued to the |
| netdevice tx queue successfully. |
| |
| Thanks to Andre Naujoks <nautsch@gmail.com> for reporting this issue. |
| |
| Signed-off-by: Oliver Hartkopp <oliver@hartkopp.net> |
| Signed-off-by: Urs Thuermann <urs@isnogud.escape.de> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| net/can/af_can.c | 16 ++++++++++++---- |
| 1 file changed, 12 insertions(+), 4 deletions(-) |
| |
| --- a/net/can/af_can.c |
| +++ b/net/can/af_can.c |
| @@ -208,6 +208,7 @@ static int can_create(struct net *net, s |
| */ |
| int can_send(struct sk_buff *skb, int loop) |
| { |
| + struct sk_buff *newskb = NULL; |
| int err; |
| |
| if (skb->dev->type != ARPHRD_CAN) { |
| @@ -244,8 +245,7 @@ int can_send(struct sk_buff *skb, int lo |
| * If the interface is not capable to do loopback |
| * itself, we do it here. |
| */ |
| - struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC); |
| - |
| + newskb = skb_clone(skb, GFP_ATOMIC); |
| if (!newskb) { |
| kfree_skb(skb); |
| return -ENOMEM; |
| @@ -254,7 +254,6 @@ int can_send(struct sk_buff *skb, int lo |
| newskb->sk = skb->sk; |
| newskb->ip_summed = CHECKSUM_UNNECESSARY; |
| newskb->pkt_type = PACKET_BROADCAST; |
| - netif_rx(newskb); |
| } |
| } else { |
| /* indication for the CAN driver: no loopback required */ |
| @@ -266,11 +265,20 @@ int can_send(struct sk_buff *skb, int lo |
| if (err > 0) |
| err = net_xmit_errno(err); |
| |
| + if (err) { |
| + if (newskb) |
| + kfree_skb(newskb); |
| + return err; |
| + } |
| + |
| + if (newskb) |
| + netif_rx(newskb); |
| + |
| /* update statistics */ |
| can_stats.tx_frames++; |
| can_stats.tx_frames_delta++; |
| |
| - return err; |
| + return 0; |
| } |
| EXPORT_SYMBOL(can_send); |
| |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:23 2008 |
| Message-Id: <20080513200823.809941434@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:11 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| kernel@gentoo.org, |
| sam@ravnborg.org, |
| Ingo Molnar <mingo@elte.hu>, |
| Thomas Gleixner <tglx@linutronix.de> |
| Subject: [patch 18/37] x86: use defconfigs from x86/configs/* |
| Content-Disposition: inline; filename=x86-use-defconfigs-from-x86-configs.patch |
| Content-Length: 1755 |
| Lines: 62 |
| |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Sam Ravnborg <sam@ravnborg.org> |
| |
| commit b9b39bfba5b0de3418305f01cfa7bc55a16004e1 upstream |
| |
| x86: use defconfigs from x86/configs/* |
| |
| Daniel Drake <dsd@gentoo.org> reported: |
| |
| In 2.6.23, if you unpacked a kernel source tarball and then |
| ran "make menuconfig" you'd be presented with this message: |
| # using defaults found in arch/i386/defconfig |
| |
| and the default options would be set. |
| |
| The same thing in 2.6.24 does not give you any "using defaults" message, and |
| the default config options within menuconfig are rather blank (e.g. no PCI |
| support). You can work around this by explicitly running "make defconfig" |
| before menuconfig, but it would be nice to have the behaviour the way it was |
| for 2.6.23 (and the way it still is for other archs). |
| |
| Fixed by adding a x86 specific defconfig list to Kconfig. |
| |
| Fixes: http://bugzilla.kernel.org/show_bug.cgi?id=10470 |
| |
| Tested-by: Daniel Drake <dsd@gentoo.org> |
| Signed-off-by: Sam Ravnborg <sam@ravnborg.org> |
| Signed-off-by: Ingo Molnar <mingo@elte.hu> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/x86/Kconfig | 12 ++++++++++++ |
| 1 file changed, 12 insertions(+) |
| |
| --- a/arch/x86/Kconfig |
| +++ b/arch/x86/Kconfig |
| @@ -24,6 +24,18 @@ config X86 |
| select HAVE_KRETPROBES |
| select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64) |
| |
| +config DEFCONFIG_LIST |
| + string |
| + depends on X86_32 |
| + option defconfig_list |
| + default "arch/x86/configs/i386_defconfig" |
| + |
| +config DEFCONFIG_LIST |
| + string |
| + depends on X86_64 |
| + option defconfig_list |
| + default "arch/x86/configs/x86_64_defconfig" |
| + |
| |
| config GENERIC_LOCKBREAK |
| def_bool n |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:24 2008 |
| Message-Id: <20080513200823.995720912@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:12 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| Netfilter Development Mailinglist <netfilter-devel@vger.kernel.org>, |
| "David S. Miller" <davem@davemloft.net>, |
| Philip Craig <philipc@snapgear.com>, |
| Patrick McHardy <kaber@trash.net> |
| Subject: [patch 19/37] nf_conntrack: padding breaks conntrack hash on ARM |
| Content-Disposition: inline; filename=nf_conntrack-padding-breaks-conntrack-hash-on-arm.patch |
| Content-Length: 2922 |
| Lines: 80 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Philip Craig <philipc@snapgear.com> |
| |
| [NETFILTER]: nf_conntrack: padding breaks conntrack hash on ARM |
| |
| Upstream commit 443a70d50: |
| |
| commit 0794935e "[NETFILTER]: nf_conntrack: optimize hash_conntrack()" |
| results in ARM platforms hashing uninitialised padding. This padding |
| doesn't exist on other architectures. |
| |
| Fix this by replacing NF_CT_TUPLE_U_BLANK() with memset() to ensure |
| everything is initialised. There were only 4 bytes that |
| NF_CT_TUPLE_U_BLANK() wasn't clearing anyway (or 12 bytes on ARM). |
| |
| Signed-off-by: Philip Craig <philipc@snapgear.com> |
| Signed-off-by: Patrick McHardy <kaber@trash.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| include/net/netfilter/nf_conntrack_tuple.h | 10 ---------- |
| net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c | 2 +- |
| net/netfilter/nf_conntrack_core.c | 4 ++-- |
| 3 files changed, 3 insertions(+), 13 deletions(-) |
| |
| --- a/include/net/netfilter/nf_conntrack_tuple.h |
| +++ b/include/net/netfilter/nf_conntrack_tuple.h |
| @@ -101,16 +101,6 @@ struct nf_conntrack_tuple_mask |
| } src; |
| }; |
| |
| -/* This is optimized opposed to a memset of the whole structure. Everything we |
| - * really care about is the source/destination unions */ |
| -#define NF_CT_TUPLE_U_BLANK(tuple) \ |
| - do { \ |
| - (tuple)->src.u.all = 0; \ |
| - (tuple)->dst.u.all = 0; \ |
| - memset(&(tuple)->src.u3, 0, sizeof((tuple)->src.u3)); \ |
| - memset(&(tuple)->dst.u3, 0, sizeof((tuple)->dst.u3)); \ |
| - } while (0) |
| - |
| #ifdef __KERNEL__ |
| |
| #define NF_CT_DUMP_TUPLE(tp) \ |
| --- a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c |
| +++ b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c |
| @@ -305,7 +305,7 @@ getorigdst(struct sock *sk, int optval, |
| const struct nf_conntrack_tuple_hash *h; |
| struct nf_conntrack_tuple tuple; |
| |
| - NF_CT_TUPLE_U_BLANK(&tuple); |
| + memset(&tuple, 0, sizeof(tuple)); |
| tuple.src.u3.ip = inet->rcv_saddr; |
| tuple.src.u.tcp.port = inet->sport; |
| tuple.dst.u3.ip = inet->daddr; |
| --- a/net/netfilter/nf_conntrack_core.c |
| +++ b/net/netfilter/nf_conntrack_core.c |
| @@ -104,7 +104,7 @@ nf_ct_get_tuple(const struct sk_buff *sk |
| const struct nf_conntrack_l3proto *l3proto, |
| const struct nf_conntrack_l4proto *l4proto) |
| { |
| - NF_CT_TUPLE_U_BLANK(tuple); |
| + memset(tuple, 0, sizeof(*tuple)); |
| |
| tuple->src.l3num = l3num; |
| if (l3proto->pkt_to_tuple(skb, nhoff, tuple) == 0) |
| @@ -153,7 +153,7 @@ nf_ct_invert_tuple(struct nf_conntrack_t |
| const struct nf_conntrack_l3proto *l3proto, |
| const struct nf_conntrack_l4proto *l4proto) |
| { |
| - NF_CT_TUPLE_U_BLANK(inverse); |
| + memset(inverse, 0, sizeof(*inverse)); |
| |
| inverse->src.l3num = orig->src.l3num; |
| if (l3proto->invert_tuple(inverse, orig) == 0) |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:24 2008 |
| Message-Id: <20080513200824.183254663@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:13 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| Netfilter Development Mailinglist <netfilter-devel@vger.kernel.org>, |
| "David S. Miller" <davem@davemloft.net>, |
| Arnaud Ebalard <arno@natisbad.org>, |
| Patrick McHardy <kaber@trash.net> |
| Subject: [patch 20/37] {nfnetlink, ip, ip6}_queue: fix skb_over_panic when enlarging packets |
| Content-Disposition: inline; filename=nfnetlink-ip-ip6-_queue-fix-skb_over_panic-when-enlarging-packets.patch |
| Content-Length: 5401 |
| Lines: 131 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Arnaud Ebalard <arno@natisbad.org> |
| |
| [NETFILTER]: {nfnetlink,ip,ip6}_queue: fix skb_over_panic when enlarging packets |
| |
| From: Arnaud Ebalard <arno@natisbad.org> |
| |
| Upstream commit 9a732ed6d: |
| |
| While reinjecting *bigger* modified versions of IPv6 packets using |
| libnetfilter_queue, things work fine on a 2.6.24 kernel (2.6.22 too) |
| but I get the following on recents kernels (2.6.25, trace below is |
| against today's net-2.6 git tree): |
| |
| skb_over_panic: text:c04fddb0 len:696 put:632 head:f7592c00 data:f7592c00 tail:0xf7592eb8 end:0xf7592e80 dev:eth0 |
| ------------[ cut here ]------------ |
| invalid opcode: 0000 [#1] PREEMPT |
| Process sendd (pid: 3657, ti=f6014000 task=f77c31d0 task.ti=f6014000) |
| Stack: c071e638 c04fddb0 000002b8 00000278 f7592c00 f7592c00 f7592eb8 f7592e80 |
| f763c000 f6bc5200 f7592c40 f6015c34 c04cdbfc f6bc5200 00000278 f6015c60 |
| c04fddb0 00000020 f72a10c0 f751b420 00000001 0000000a 000002b8 c065582c |
| Call Trace: |
| [<c04fddb0>] ? nfqnl_recv_verdict+0x1c0/0x2e0 |
| [<c04cdbfc>] ? skb_put+0x3c/0x40 |
| [<c04fddb0>] ? nfqnl_recv_verdict+0x1c0/0x2e0 |
| [<c04fd115>] ? nfnetlink_rcv_msg+0xf5/0x160 |
| [<c04fd03e>] ? nfnetlink_rcv_msg+0x1e/0x160 |
| [<c04fd020>] ? nfnetlink_rcv_msg+0x0/0x160 |
| [<c04f8ed7>] ? netlink_rcv_skb+0x77/0xa0 |
| [<c04fcefc>] ? nfnetlink_rcv+0x1c/0x30 |
| [<c04f8c73>] ? netlink_unicast+0x243/0x2b0 |
| [<c04cfaba>] ? memcpy_fromiovec+0x4a/0x70 |
| [<c04f9406>] ? netlink_sendmsg+0x1c6/0x270 |
| [<c04c8244>] ? sock_sendmsg+0xc4/0xf0 |
| [<c011970d>] ? set_next_entity+0x1d/0x50 |
| [<c0133a80>] ? autoremove_wake_function+0x0/0x40 |
| [<c0118f9e>] ? __wake_up_common+0x3e/0x70 |
| [<c0342fbf>] ? n_tty_receive_buf+0x34f/0x1280 |
| [<c011d308>] ? __wake_up+0x68/0x70 |
| [<c02cea47>] ? copy_from_user+0x37/0x70 |
| [<c04cfd7c>] ? verify_iovec+0x2c/0x90 |
| [<c04c837a>] ? sys_sendmsg+0x10a/0x230 |
| [<c011967a>] ? __dequeue_entity+0x2a/0xa0 |
| [<c011970d>] ? set_next_entity+0x1d/0x50 |
| [<c0345397>] ? pty_write+0x47/0x60 |
| [<c033d59b>] ? tty_default_put_char+0x1b/0x20 |
| [<c011d2e9>] ? __wake_up+0x49/0x70 |
| [<c033df99>] ? tty_ldisc_deref+0x39/0x90 |
| [<c033ff20>] ? tty_write+0x1a0/0x1b0 |
| [<c04c93af>] ? sys_socketcall+0x7f/0x260 |
| [<c0102ff9>] ? sysenter_past_esp+0x6a/0x91 |
| [<c05f0000>] ? snd_intel8x0m_probe+0x270/0x6e0 |
| ======================= |
| Code: 00 00 89 5c 24 14 8b 98 9c 00 00 00 89 54 24 0c 89 5c 24 10 8b 40 50 89 4c 24 04 c7 04 24 38 e6 71 c0 89 44 24 08 e8 c4 46 c5 ff <0f> 0b eb fe 55 89 e5 56 89 d6 53 89 c3 83 ec 0c 8b 40 50 39 d0 |
| EIP: [<c04ccdfc>] skb_over_panic+0x5c/0x60 SS:ESP 0068:f6015bf8 |
| |
| Looking at the code, I ended up in nfq_mangle() function (called by |
| nfqnl_recv_verdict()) which performs a call to skb_copy_expand() due to |
| the increased size of data passed to the function. AFAICT, it should ask |
| for 'diff' instead of 'diff - skb_tailroom(e->skb)'. Because the |
| resulting sk_buff has not enough space to support the skb_put(skb, diff) |
| call a few lines later, this results in the call to skb_over_panic(). |
| |
| The patch below asks for allocation of a copy with enough space for |
| mangled packet and the same amount of headroom as old sk_buff. While |
| looking at how the regression appeared (e2b58a67), I noticed the same |
| pattern in ipq_mangle_ipv6() and ipq_mangle_ipv4(). The patch corrects |
| those locations too. |
| |
| Tested with bigger reinjected IPv6 packets (nfqnl_mangle() path), things |
| are ok (2.6.25 and today's net-2.6 git tree). |
| |
| Signed-off-by: Arnaud Ebalard <arno@natisbad.org> |
| Signed-off-by: Patrick McHardy <kaber@trash.net> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| |
| --- |
| net/ipv4/netfilter/ip_queue.c | 5 ++--- |
| net/ipv6/netfilter/ip6_queue.c | 5 ++--- |
| net/netfilter/nfnetlink_queue.c | 5 ++--- |
| 3 files changed, 6 insertions(+), 9 deletions(-) |
| |
| --- a/net/ipv4/netfilter/ip_queue.c |
| +++ b/net/ipv4/netfilter/ip_queue.c |
| @@ -296,9 +296,8 @@ ipq_mangle_ipv4(ipq_verdict_msg_t *v, st |
| if (v->data_len > 0xFFFF) |
| return -EINVAL; |
| if (diff > skb_tailroom(e->skb)) { |
| - nskb = skb_copy_expand(e->skb, 0, |
| - diff - skb_tailroom(e->skb), |
| - GFP_ATOMIC); |
| + nskb = skb_copy_expand(e->skb, skb_headroom(e->skb), |
| + diff, GFP_ATOMIC); |
| if (!nskb) { |
| printk(KERN_WARNING "ip_queue: error " |
| "in mangle, dropping packet\n"); |
| --- a/net/ipv6/netfilter/ip6_queue.c |
| +++ b/net/ipv6/netfilter/ip6_queue.c |
| @@ -298,9 +298,8 @@ ipq_mangle_ipv6(ipq_verdict_msg_t *v, st |
| if (v->data_len > 0xFFFF) |
| return -EINVAL; |
| if (diff > skb_tailroom(e->skb)) { |
| - nskb = skb_copy_expand(e->skb, 0, |
| - diff - skb_tailroom(e->skb), |
| - GFP_ATOMIC); |
| + nskb = skb_copy_expand(e->skb, skb_headroom(e->skb), |
| + diff, GFP_ATOMIC); |
| if (!nskb) { |
| printk(KERN_WARNING "ip6_queue: OOM " |
| "in mangle, dropping packet\n"); |
| --- a/net/netfilter/nfnetlink_queue.c |
| +++ b/net/netfilter/nfnetlink_queue.c |
| @@ -454,9 +454,8 @@ nfqnl_mangle(void *data, int data_len, s |
| if (data_len > 0xFFFF) |
| return -EINVAL; |
| if (diff > skb_tailroom(e->skb)) { |
| - nskb = skb_copy_expand(e->skb, 0, |
| - diff - skb_tailroom(e->skb), |
| - GFP_ATOMIC); |
| + nskb = skb_copy_expand(e->skb, skb_headroom(e->skb), |
| + diff, GFP_ATOMIC); |
| if (!nskb) { |
| printk(KERN_WARNING "nf_queue: OOM " |
| "in mangle, dropping packet\n"); |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:24 2008 |
| Message-Id: <20080513200824.357684722@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:14 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org, |
| Jeff Garzik l <jeff@garzik.org>, |
| IDE/ATA development list <linux-ide@vger.kernel.org> |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| Tejun Heo <htejun@gmail.com>, |
| Ryan Roth <ryan.roth@ch2m.com>, |
| Jeff Garzik <jgarzik@redhat.com> |
| Subject: [patch 21/37] ata_piix: verify SIDPR access before enabling it |
| Content-Disposition: inline; filename=ata_piix-verify-sidpr-access-before-enabling-it.patch |
| Content-Length: 2043 |
| Lines: 67 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Tejun Heo <htejun@gmail.com> |
| |
| commit cb6716c879ecf49e2af344926c6a476821812061 upstream |
| |
| On certain configurations (certain macbooks), even though all the |
| conditions for SIDPR access described in the datasheet are met, |
| actually reading those registers just returns 0 and have no effect on |
| write. Verify SIDPR is actually working before enabling it. |
| |
| This is reported by Ryan Roth in bz#10512. |
| |
| Signed-off-by: Tejun Heo <htejun@gmail.com> |
| Cc: Ryan Roth <ryan.roth@ch2m.com> |
| Signed-off-by: Jeff Garzik <jgarzik@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/ata/ata_piix.c | 25 +++++++++++++++++++++++++ |
| 1 file changed, 25 insertions(+) |
| |
| --- a/drivers/ata/ata_piix.c |
| +++ b/drivers/ata/ata_piix.c |
| @@ -1531,6 +1531,8 @@ static void __devinit piix_init_sidpr(st |
| { |
| struct pci_dev *pdev = to_pci_dev(host->dev); |
| struct piix_host_priv *hpriv = host->private_data; |
| + struct ata_device *dev0 = &host->ports[0]->link.device[0]; |
| + u32 scontrol; |
| int i; |
| |
| /* check for availability */ |
| @@ -1549,6 +1551,29 @@ static void __devinit piix_init_sidpr(st |
| return; |
| |
| hpriv->sidpr = pcim_iomap_table(pdev)[PIIX_SIDPR_BAR]; |
| + |
| + /* SCR access via SIDPR doesn't work on some configurations. |
| + * Give it a test drive by inhibiting power save modes which |
| + * we'll do anyway. |
| + */ |
| + scontrol = piix_sidpr_read(dev0, SCR_CONTROL); |
| + |
| + /* if IPM is already 3, SCR access is probably working. Don't |
| + * un-inhibit power save modes as BIOS might have inhibited |
| + * them for a reason. |
| + */ |
| + if ((scontrol & 0xf00) != 0x300) { |
| + scontrol |= 0x300; |
| + piix_sidpr_write(dev0, SCR_CONTROL, scontrol); |
| + scontrol = piix_sidpr_read(dev0, SCR_CONTROL); |
| + |
| + if ((scontrol & 0xf00) != 0x300) { |
| + dev_printk(KERN_INFO, host->dev, "SCR access via " |
| + "SIDPR is available but doesn't work\n"); |
| + return; |
| + } |
| + } |
| + |
| host->ports[0]->ops = &piix_sidpr_sata_ops; |
| host->ports[1]->ops = &piix_sidpr_sata_ops; |
| } |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:24 2008 |
| Message-Id: <20080513200824.541138555@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:15 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org, |
| jejb@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com>, |
| Ingo Molnar <mingo@elte.hu>, |
| Thomas Gleixner <tglx@linutronix.de> |
| Subject: [patch 22/37] x86: sysfs cpu?/topology is empty in 2.6.25 (32-bit Intel system) |
| Content-Disposition: inline; filename=x86-sysfs-cpu-topology-is-empty-in-2.6.25.patch |
| Content-Length: 2304 |
| Lines: 85 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com> |
| |
| commit 5c3a121d52b30a1e53cdaa802fa1965fcd243164 upstream |
| |
| System topology on intel based system needs to be exported |
| for non-numa case as well. |
| |
| All parts of asm-i386/topology.h has come under |
| #ifdef CONFIG_NUMA after the merge to asm-x86/topology.h |
| |
| /sys/devices/system/cpu/cpu?/topology/* is populated based on |
| ENABLE_TOPO_DEFINES |
| |
| The sysfs cpu topology is not being populated on my dual socket |
| dual core xeon 5160 processor based (x86 32 bit) system. |
| |
| CONFIG_NUMA is not set in my case yet the topology is relevant |
| and useful. |
| |
| irqbalance daemon application depends on topology to build the |
| cpus and package list and it fails on Fedora9 beta since the |
| sysfs topology was not being populated in the 2.6.25 kernel. |
| |
| I am not sure if it was intentional to not define ENABLE_TOPO_DEFINES |
| for non-numa systems. |
| |
| This fix has been tested on the above mentioned dual core, dual socket |
| system. |
| |
| Signed-off-by: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com> |
| Signed-off-by: Ingo Molnar <mingo@elte.hu> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| include/asm-x86/topology.h | 18 ++++++++++-------- |
| 1 file changed, 10 insertions(+), 8 deletions(-) |
| |
| --- a/include/asm-x86/topology.h |
| +++ b/include/asm-x86/topology.h |
| @@ -25,6 +25,16 @@ |
| #ifndef _ASM_X86_TOPOLOGY_H |
| #define _ASM_X86_TOPOLOGY_H |
| |
| +#ifdef CONFIG_X86_32 |
| +# ifdef CONFIG_X86_HT |
| +# define ENABLE_TOPO_DEFINES |
| +# endif |
| +#else |
| +# ifdef CONFIG_SMP |
| +# define ENABLE_TOPO_DEFINES |
| +# endif |
| +#endif |
| + |
| #ifdef CONFIG_NUMA |
| #include <linux/cpumask.h> |
| #include <asm/mpspec.h> |
| @@ -112,10 +122,6 @@ extern unsigned long node_end_pfn[]; |
| extern unsigned long node_remap_size[]; |
| #define node_has_online_mem(nid) (node_start_pfn[nid] != node_end_pfn[nid]) |
| |
| -# ifdef CONFIG_X86_HT |
| -# define ENABLE_TOPO_DEFINES |
| -# endif |
| - |
| # define SD_CACHE_NICE_TRIES 1 |
| # define SD_IDLE_IDX 1 |
| # define SD_NEWIDLE_IDX 2 |
| @@ -123,10 +129,6 @@ extern unsigned long node_remap_size[]; |
| |
| #else |
| |
| -# ifdef CONFIG_SMP |
| -# define ENABLE_TOPO_DEFINES |
| -# endif |
| - |
| # define SD_CACHE_NICE_TRIES 2 |
| # define SD_IDLE_IDX 2 |
| # define SD_NEWIDLE_IDX 0 |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:24 2008 |
| Message-Id: <20080513200824.740371978@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:16 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| Jean Delvare <khali@linux-fr.org> |
| Subject: [patch 23/37] i2c-piix4: Blacklist two mainboards |
| Content-Disposition: inline; filename=i2c-piix4-blacklist-two-mainboards.patch |
| Content-Length: 2406 |
| Lines: 72 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Jean Delvare <khali@linux-fr.org> |
| |
| commit c2fc54fcd340cbee47510aa84c346aab3440ba09 upstream |
| |
| We had a report that running sensors-detect on a Sapphire AM2RD790 |
| motherbord killed the CPU. While the exact cause is still unknown, |
| I'd rather play it safe and prevent any access to the SMBus on that |
| machine by not letting the i2c-piix4 driver attach to the SMBus host |
| device on that machine. Also blacklist a similar board made by DFI. |
| |
| Signed-off-by: Jean Delvare <khali@linux-fr.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/i2c/busses/i2c-piix4.c | 32 ++++++++++++++++++++++++++++++-- |
| 1 file changed, 30 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/i2c/busses/i2c-piix4.c |
| +++ b/drivers/i2c/busses/i2c-piix4.c |
| @@ -108,7 +108,27 @@ static unsigned short piix4_smba; |
| static struct pci_driver piix4_driver; |
| static struct i2c_adapter piix4_adapter; |
| |
| -static struct dmi_system_id __devinitdata piix4_dmi_table[] = { |
| +static struct dmi_system_id __devinitdata piix4_dmi_blacklist[] = { |
| + { |
| + .ident = "Sapphire AM2RD790", |
| + .matches = { |
| + DMI_MATCH(DMI_BOARD_VENDOR, "SAPPHIRE Inc."), |
| + DMI_MATCH(DMI_BOARD_NAME, "PC-AM2RD790"), |
| + }, |
| + }, |
| + { |
| + .ident = "DFI Lanparty UT 790FX", |
| + .matches = { |
| + DMI_MATCH(DMI_BOARD_VENDOR, "DFI Inc."), |
| + DMI_MATCH(DMI_BOARD_NAME, "LP UT 790FX"), |
| + }, |
| + }, |
| + { } |
| +}; |
| + |
| +/* The IBM entry is in a separate table because we only check it |
| + on Intel-based systems */ |
| +static struct dmi_system_id __devinitdata piix4_dmi_ibm[] = { |
| { |
| .ident = "IBM", |
| .matches = { DMI_MATCH(DMI_SYS_VENDOR, "IBM"), }, |
| @@ -123,8 +143,16 @@ static int __devinit piix4_setup(struct |
| |
| dev_info(&PIIX4_dev->dev, "Found %s device\n", pci_name(PIIX4_dev)); |
| |
| + /* On some motherboards, it was reported that accessing the SMBus |
| + caused severe hardware problems */ |
| + if (dmi_check_system(piix4_dmi_blacklist)) { |
| + dev_err(&PIIX4_dev->dev, |
| + "Accessing the SMBus on this system is unsafe!\n"); |
| + return -EPERM; |
| + } |
| + |
| /* Don't access SMBus on IBM systems which get corrupted eeproms */ |
| - if (dmi_check_system(piix4_dmi_table) && |
| + if (dmi_check_system(piix4_dmi_ibm) && |
| PIIX4_dev->vendor == PCI_VENDOR_ID_INTEL) { |
| dev_err(&PIIX4_dev->dev, "IBM system detected; this module " |
| "may corrupt your serial eeprom! Refusing to load " |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:25 2008 |
| Message-Id: <20080513200824.926511766@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:17 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| "David S. Miller" <davem@davemloft.net> |
| Subject: [patch 24/37] sparc: Fix ptrace() detach. |
| Content-Disposition: inline; filename=sparc-fix-ptrace-detach.patch |
| Content-Length: 2367 |
| Lines: 80 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: David S. Miller <davem@davemloft.net> |
| |
| [ Upstream commit: 986bef854fab44012df678a5b51817d5274d3ca1 ] |
| |
| Forever we had a PTRACE_SUNOS_DETACH which was unconditionally |
| recognized, regardless of the personality of the process. |
| |
| Unfortunately, this value is what ended up in the GLIBC sys/ptrace.h |
| header file on sparc as PTRACE_DETACH and PT_DETACH. |
| |
| So continue to recognize this old value. Luckily, it doesn't conflict |
| with anything we actually care about. |
| |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/sparc/kernel/ptrace.c | 2 ++ |
| arch/sparc64/kernel/ptrace.c | 4 ++++ |
| include/asm-sparc/ptrace.h | 1 + |
| include/asm-sparc64/ptrace.h | 1 + |
| 4 files changed, 8 insertions(+) |
| |
| --- a/arch/sparc64/kernel/ptrace.c |
| +++ b/arch/sparc64/kernel/ptrace.c |
| @@ -944,6 +944,8 @@ long compat_arch_ptrace(struct task_stru |
| break; |
| |
| default: |
| + if (request == PTRACE_SPARC_DETACH) |
| + request = PTRACE_DETACH; |
| ret = compat_ptrace_request(child, request, addr, data); |
| break; |
| } |
| @@ -1036,6 +1038,8 @@ long arch_ptrace(struct task_struct *chi |
| break; |
| |
| default: |
| + if (request == PTRACE_SPARC_DETACH) |
| + request = PTRACE_DETACH; |
| ret = ptrace_request(child, request, addr, data); |
| break; |
| } |
| --- a/arch/sparc/kernel/ptrace.c |
| +++ b/arch/sparc/kernel/ptrace.c |
| @@ -441,6 +441,8 @@ long arch_ptrace(struct task_struct *chi |
| break; |
| |
| default: |
| + if (request == PTRACE_SPARC_DETACH) |
| + request = PTRACE_DETACH; |
| ret = ptrace_request(child, request, addr, data); |
| break; |
| } |
| --- a/include/asm-sparc64/ptrace.h |
| +++ b/include/asm-sparc64/ptrace.h |
| @@ -263,6 +263,7 @@ extern void __show_regs(struct pt_regs * |
| #define SF_XXARG 0x5c |
| |
| /* Stuff for the ptrace system call */ |
| +#define PTRACE_SPARC_DETACH 11 |
| #define PTRACE_GETREGS 12 |
| #define PTRACE_SETREGS 13 |
| #define PTRACE_GETFPREGS 14 |
| --- a/include/asm-sparc/ptrace.h |
| +++ b/include/asm-sparc/ptrace.h |
| @@ -149,6 +149,7 @@ extern void show_regs(struct pt_regs *); |
| #define SF_XXARG 0x5c |
| |
| /* Stuff for the ptrace system call */ |
| +#define PTRACE_SPARC_DETACH 11 |
| #define PTRACE_GETREGS 12 |
| #define PTRACE_SETREGS 13 |
| #define PTRACE_GETFPREGS 14 |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:25 2008 |
| Message-Id: <20080513200825.098534188@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:18 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| "David S. Miller" <davem@davemloft.net> |
| Subject: [patch 25/37] sparc: Fix mremap address range validation. |
| Content-Disposition: inline; filename=sparc-fix-mremap-address-range-validation.patch |
| Content-Length: 6706 |
| Lines: 234 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: David S. Miller <davem@davemloft.net> |
| |
| Just like mmap, we need to validate address ranges regardless |
| of MAP_FIXED. |
| |
| sparc{,64}_mmap_check()'s flag argument is unused, remove. |
| |
| Based upon a report and preliminary patch by |
| Jan Lieskovsky <jlieskov@redhat.com> |
| |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/sparc/kernel/sys_sparc.c | 48 +++----------------------------------- |
| arch/sparc64/kernel/sys_sparc.c | 36 +++------------------------- |
| arch/sparc64/kernel/sys_sparc32.c | 33 +------------------------- |
| include/asm-sparc/mman.h | 5 +-- |
| include/asm-sparc64/mman.h | 5 +-- |
| 5 files changed, 15 insertions(+), 112 deletions(-) |
| |
| --- a/arch/sparc64/kernel/sys_sparc32.c |
| +++ b/arch/sparc64/kernel/sys_sparc32.c |
| @@ -906,44 +906,15 @@ asmlinkage unsigned long sys32_mremap(un |
| unsigned long old_len, unsigned long new_len, |
| unsigned long flags, u32 __new_addr) |
| { |
| - struct vm_area_struct *vma; |
| unsigned long ret = -EINVAL; |
| unsigned long new_addr = __new_addr; |
| |
| - if (old_len > STACK_TOP32 || new_len > STACK_TOP32) |
| + if (unlikely(sparc64_mmap_check(addr, old_len))) |
| goto out; |
| - if (addr > STACK_TOP32 - old_len) |
| + if (unlikely(sparc64_mmap_check(new_addr, new_len))) |
| goto out; |
| down_write(¤t->mm->mmap_sem); |
| - if (flags & MREMAP_FIXED) { |
| - if (new_addr > STACK_TOP32 - new_len) |
| - goto out_sem; |
| - } else if (addr > STACK_TOP32 - new_len) { |
| - unsigned long map_flags = 0; |
| - struct file *file = NULL; |
| - |
| - ret = -ENOMEM; |
| - if (!(flags & MREMAP_MAYMOVE)) |
| - goto out_sem; |
| - |
| - vma = find_vma(current->mm, addr); |
| - if (vma) { |
| - if (vma->vm_flags & VM_SHARED) |
| - map_flags |= MAP_SHARED; |
| - file = vma->vm_file; |
| - } |
| - |
| - /* MREMAP_FIXED checked above. */ |
| - new_addr = get_unmapped_area(file, addr, new_len, |
| - vma ? vma->vm_pgoff : 0, |
| - map_flags); |
| - ret = new_addr; |
| - if (new_addr & ~PAGE_MASK) |
| - goto out_sem; |
| - flags |= MREMAP_FIXED; |
| - } |
| ret = do_mremap(addr, old_len, new_len, flags, new_addr); |
| -out_sem: |
| up_write(¤t->mm->mmap_sem); |
| out: |
| return ret; |
| --- a/arch/sparc64/kernel/sys_sparc.c |
| +++ b/arch/sparc64/kernel/sys_sparc.c |
| @@ -542,8 +542,7 @@ asmlinkage long sparc64_personality(unsi |
| return ret; |
| } |
| |
| -int sparc64_mmap_check(unsigned long addr, unsigned long len, |
| - unsigned long flags) |
| +int sparc64_mmap_check(unsigned long addr, unsigned long len) |
| { |
| if (test_thread_flag(TIF_32BIT)) { |
| if (len >= STACK_TOP32) |
| @@ -609,46 +608,19 @@ asmlinkage unsigned long sys64_mremap(un |
| unsigned long old_len, unsigned long new_len, |
| unsigned long flags, unsigned long new_addr) |
| { |
| - struct vm_area_struct *vma; |
| unsigned long ret = -EINVAL; |
| |
| if (test_thread_flag(TIF_32BIT)) |
| goto out; |
| if (unlikely(new_len >= VA_EXCLUDE_START)) |
| goto out; |
| - if (unlikely(invalid_64bit_range(addr, old_len))) |
| + if (unlikely(sparc64_mmap_check(addr, old_len))) |
| + goto out; |
| + if (unlikely(sparc64_mmap_check(new_addr, new_len))) |
| goto out; |
| |
| down_write(¤t->mm->mmap_sem); |
| - if (flags & MREMAP_FIXED) { |
| - if (invalid_64bit_range(new_addr, new_len)) |
| - goto out_sem; |
| - } else if (invalid_64bit_range(addr, new_len)) { |
| - unsigned long map_flags = 0; |
| - struct file *file = NULL; |
| - |
| - ret = -ENOMEM; |
| - if (!(flags & MREMAP_MAYMOVE)) |
| - goto out_sem; |
| - |
| - vma = find_vma(current->mm, addr); |
| - if (vma) { |
| - if (vma->vm_flags & VM_SHARED) |
| - map_flags |= MAP_SHARED; |
| - file = vma->vm_file; |
| - } |
| - |
| - /* MREMAP_FIXED checked above. */ |
| - new_addr = get_unmapped_area(file, addr, new_len, |
| - vma ? vma->vm_pgoff : 0, |
| - map_flags); |
| - ret = new_addr; |
| - if (new_addr & ~PAGE_MASK) |
| - goto out_sem; |
| - flags |= MREMAP_FIXED; |
| - } |
| ret = do_mremap(addr, old_len, new_len, flags, new_addr); |
| -out_sem: |
| up_write(¤t->mm->mmap_sem); |
| out: |
| return ret; |
| --- a/arch/sparc/kernel/sys_sparc.c |
| +++ b/arch/sparc/kernel/sys_sparc.c |
| @@ -220,7 +220,7 @@ out: |
| return err; |
| } |
| |
| -int sparc_mmap_check(unsigned long addr, unsigned long len, unsigned long flags) |
| +int sparc_mmap_check(unsigned long addr, unsigned long len) |
| { |
| if (ARCH_SUN4C_SUN4 && |
| (len > 0x20000000 || |
| @@ -296,52 +296,14 @@ asmlinkage unsigned long sparc_mremap(un |
| unsigned long old_len, unsigned long new_len, |
| unsigned long flags, unsigned long new_addr) |
| { |
| - struct vm_area_struct *vma; |
| unsigned long ret = -EINVAL; |
| - if (ARCH_SUN4C_SUN4) { |
| - if (old_len > 0x20000000 || new_len > 0x20000000) |
| - goto out; |
| - if (addr < 0xe0000000 && addr + old_len > 0x20000000) |
| - goto out; |
| - } |
| - if (old_len > TASK_SIZE - PAGE_SIZE || |
| - new_len > TASK_SIZE - PAGE_SIZE) |
| + |
| + if (unlikely(sparc_mmap_check(addr, old_len))) |
| + goto out; |
| + if (unlikely(sparc_mmap_check(new_addr, new_len))) |
| goto out; |
| down_write(¤t->mm->mmap_sem); |
| - if (flags & MREMAP_FIXED) { |
| - if (ARCH_SUN4C_SUN4 && |
| - new_addr < 0xe0000000 && |
| - new_addr + new_len > 0x20000000) |
| - goto out_sem; |
| - if (new_addr + new_len > TASK_SIZE - PAGE_SIZE) |
| - goto out_sem; |
| - } else if ((ARCH_SUN4C_SUN4 && addr < 0xe0000000 && |
| - addr + new_len > 0x20000000) || |
| - addr + new_len > TASK_SIZE - PAGE_SIZE) { |
| - unsigned long map_flags = 0; |
| - struct file *file = NULL; |
| - |
| - ret = -ENOMEM; |
| - if (!(flags & MREMAP_MAYMOVE)) |
| - goto out_sem; |
| - |
| - vma = find_vma(current->mm, addr); |
| - if (vma) { |
| - if (vma->vm_flags & VM_SHARED) |
| - map_flags |= MAP_SHARED; |
| - file = vma->vm_file; |
| - } |
| - |
| - new_addr = get_unmapped_area(file, addr, new_len, |
| - vma ? vma->vm_pgoff : 0, |
| - map_flags); |
| - ret = new_addr; |
| - if (new_addr & ~PAGE_MASK) |
| - goto out_sem; |
| - flags |= MREMAP_FIXED; |
| - } |
| ret = do_mremap(addr, old_len, new_len, flags, new_addr); |
| -out_sem: |
| up_write(¤t->mm->mmap_sem); |
| out: |
| return ret; |
| --- a/include/asm-sparc64/mman.h |
| +++ b/include/asm-sparc64/mman.h |
| @@ -37,9 +37,8 @@ |
| |
| #ifdef __KERNEL__ |
| #ifndef __ASSEMBLY__ |
| -#define arch_mmap_check sparc64_mmap_check |
| -int sparc64_mmap_check(unsigned long addr, unsigned long len, |
| - unsigned long flags); |
| +#define arch_mmap_check(addr,len,flags) sparc64_mmap_check(addr,len) |
| +int sparc64_mmap_check(unsigned long addr, unsigned long len); |
| #endif |
| #endif |
| |
| --- a/include/asm-sparc/mman.h |
| +++ b/include/asm-sparc/mman.h |
| @@ -37,9 +37,8 @@ |
| |
| #ifdef __KERNEL__ |
| #ifndef __ASSEMBLY__ |
| -#define arch_mmap_check sparc_mmap_check |
| -int sparc_mmap_check(unsigned long addr, unsigned long len, |
| - unsigned long flags); |
| +#define arch_mmap_check(addr,len,flags) sparc_mmap_check(addr,len) |
| +int sparc_mmap_check(unsigned long addr, unsigned long len); |
| #endif |
| #endif |
| |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:25 2008 |
| Message-Id: <20080513200825.295491553@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:19 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| "David S. Miller" <davem@davemloft.net> |
| Subject: [patch 26/37] sparc: Fix debugger syscall restart interactions. |
| Content-Disposition: inline; filename=sparc-fix-debugger-syscall-restart-interactions.patch |
| Content-Length: 21658 |
| Lines: 685 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: David S. Miller <davem@davemloft.net> |
| |
| [ This is a 2.6.25 backport of upstream changeset |
| 28e6103665301ce60634e8a77f0b657c6cc099de with sparc32 build |
| fixes from Robert Reif ] |
| |
| So, forever, we've had this ptrace_signal_deliver implementation |
| which tries to handle all of the nasties that can occur when the |
| debugger looks at a process about to take a signal. It's meant |
| to address all of these issues inside of the kernel so that the |
| debugger need not be mindful of such things. |
| |
| Problem is, this doesn't work. |
| |
| The idea was that we should do the syscall restart business first, so |
| that the debugger captures that state. Otherwise, if the debugger for |
| example saves the child's state, makes the child execute something |
| else, then restores the saved state, we won't handle the syscall |
| restart properly because we lose the "we're in a syscall" state. |
| |
| The code here worked for most cases, but if the debugger actually |
| passes the signal through to the child unaltered, it's possible that |
| we would do a syscall restart when we shouldn't have. |
| |
| In particular this breaks the case of debugging a process under a gdb |
| which is being debugged by yet another gdb. gdb uses sigsuspend |
| to wait for SIGCHLD of the inferior, but if gdb itself is being |
| debugged by a top-level gdb we get a ptrace_stop(). The top-level gdb |
| does a PTRACE_CONT with SIGCHLD to let the inferior gdb see the |
| signal. But ptrace_signal_deliver() assumed the debugger would cancel |
| out the signal and therefore did a syscall restart, because the return |
| error was ERESTARTNOHAND. |
| |
| Fix this by simply making ptrace_signal_deliver() a nop, and providing |
| a way for the debugger to control system call restarting properly: |
| |
| 1) Report a "in syscall" software bit in regs->{tstate,psr}. |
| It is set early on in trap entry to a system call and is fully |
| visible to the debugger via ptrace() and regsets. |
| |
| 2) Test this bit right before doing a syscall restart. We have |
| to do a final recheck right after get_signal_to_deliver() in |
| case the debugger cleared the bit during ptrace_stop(). |
| |
| 3) Clear the bit in trap return so we don't accidently try to set |
| that bit in the real register. |
| |
| As a result we also get a ptrace_{is,clear}_syscall() for sparc32 just |
| like sparc64 has. |
| |
| M68K has this same exact bug, and is now the only other user of the |
| ptrace_signal_deliver hook. It needs to be fixed in the same exact |
| way as sparc. |
| |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/sparc/kernel/entry.S | 2 + |
| arch/sparc/kernel/ptrace.c | 4 +- |
| arch/sparc/kernel/rtrap.S | 11 ++++-- |
| arch/sparc/kernel/signal.c | 64 ++++++++++++++++--------------------- |
| arch/sparc64/kernel/etrap.S | 7 ++-- |
| arch/sparc64/kernel/ptrace.c | 12 ++++-- |
| arch/sparc64/kernel/rtrap.S | 1 |
| arch/sparc64/kernel/signal.c | 69 +++++++++++++++++----------------------- |
| arch/sparc64/kernel/signal32.c | 30 +++++++++++------ |
| include/asm-sparc/psr.h | 1 |
| include/asm-sparc/ptrace.h | 12 ++++++ |
| include/asm-sparc/signal.h | 8 ---- |
| include/asm-sparc64/psrcompat.h | 2 + |
| include/asm-sparc64/pstate.h | 1 |
| include/asm-sparc64/ptrace.h | 12 ++++++ |
| include/asm-sparc64/signal.h | 8 ---- |
| include/asm-sparc64/ttable.h | 7 ++-- |
| 17 files changed, 136 insertions(+), 115 deletions(-) |
| |
| --- a/arch/sparc64/kernel/etrap.S |
| +++ b/arch/sparc64/kernel/etrap.S |
| @@ -27,11 +27,12 @@ |
| |
| .text |
| .align 64 |
| - .globl etrap, etrap_irq, etraptl1 |
| + .globl etrap_syscall, etrap, etrap_irq, etraptl1 |
| etrap: rdpr %pil, %g2 |
| -etrap_irq: |
| - TRAP_LOAD_THREAD_REG(%g6, %g1) |
| +etrap_irq: clr %g3 |
| +etrap_syscall: TRAP_LOAD_THREAD_REG(%g6, %g1) |
| rdpr %tstate, %g1 |
| + or %g1, %g3, %g1 |
| sllx %g2, 20, %g3 |
| andcc %g1, TSTATE_PRIV, %g0 |
| or %g1, %g3, %g1 |
| --- a/arch/sparc64/kernel/ptrace.c |
| +++ b/arch/sparc64/kernel/ptrace.c |
| @@ -287,11 +287,11 @@ static int genregs64_set(struct task_str |
| 32 * sizeof(u64), |
| 33 * sizeof(u64)); |
| if (!ret) { |
| - /* Only the condition codes can be modified |
| - * in the %tstate register. |
| + /* Only the condition codes and the "in syscall" |
| + * state can be modified in the %tstate register. |
| */ |
| - tstate &= (TSTATE_ICC | TSTATE_XCC); |
| - regs->tstate &= ~(TSTATE_ICC | TSTATE_XCC); |
| + tstate &= (TSTATE_ICC | TSTATE_XCC | TSTATE_SYSCALL); |
| + regs->tstate &= ~(TSTATE_ICC | TSTATE_XCC | TSTATE_SYSCALL); |
| regs->tstate |= tstate; |
| } |
| } |
| @@ -657,8 +657,10 @@ static int genregs32_set(struct task_str |
| switch (pos) { |
| case 32: /* PSR */ |
| tstate = regs->tstate; |
| - tstate &= ~(TSTATE_ICC | TSTATE_XCC); |
| + tstate &= ~(TSTATE_ICC | TSTATE_XCC | TSTATE_SYSCALL); |
| tstate |= psr_to_tstate_icc(reg); |
| + if (reg & PSR_SYSCALL) |
| + tstate |= TSTATE_SYSCALL; |
| regs->tstate = tstate; |
| break; |
| case 33: /* PC */ |
| --- a/arch/sparc64/kernel/rtrap.S |
| +++ b/arch/sparc64/kernel/rtrap.S |
| @@ -270,6 +270,7 @@ rt_continue: ldx [%sp + PTREGS_OFF + P |
| wr %o3, %g0, %y |
| wrpr %l4, 0x0, %pil |
| wrpr %g0, 0x1, %tl |
| + andn %l1, TSTATE_SYSCALL, %l1 |
| wrpr %l1, %g0, %tstate |
| wrpr %l2, %g0, %tpc |
| wrpr %o2, %g0, %tnpc |
| --- a/arch/sparc64/kernel/signal32.c |
| +++ b/arch/sparc64/kernel/signal32.c |
| @@ -295,6 +295,9 @@ void do_new_sigreturn32(struct pt_regs * |
| regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC); |
| regs->tstate |= psr_to_tstate_icc(psr); |
| |
| + /* Prevent syscall restart. */ |
| + pt_regs_clear_syscall(regs); |
| + |
| err |= __get_user(fpu_save, &sf->fpu_save); |
| if (fpu_save) |
| err |= restore_fpu_state32(regs, &sf->fpu_state); |
| @@ -448,6 +451,9 @@ asmlinkage void do_rt_sigreturn32(struct |
| regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC); |
| regs->tstate |= psr_to_tstate_icc(psr); |
| |
| + /* Prevent syscall restart. */ |
| + pt_regs_clear_syscall(regs); |
| + |
| err |= __get_user(fpu_save, &sf->fpu_save); |
| if (fpu_save) |
| err |= restore_fpu_state32(regs, &sf->fpu_state); |
| @@ -1280,20 +1286,24 @@ static inline void syscall_restart32(uns |
| * mistake. |
| */ |
| void do_signal32(sigset_t *oldset, struct pt_regs * regs, |
| - unsigned long orig_i0, int restart_syscall) |
| + int restart_syscall, unsigned long orig_i0) |
| { |
| - siginfo_t info; |
| - struct signal_deliver_cookie cookie; |
| struct k_sigaction ka; |
| + siginfo_t info; |
| int signr; |
| int svr4_signal = current->personality == PER_SVR4; |
| |
| - cookie.restart_syscall = restart_syscall; |
| - cookie.orig_i0 = orig_i0; |
| + signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| + |
| + /* If the debugger messes with the program counter, it clears |
| + * the "in syscall" bit, directing us to not perform a syscall |
| + * restart. |
| + */ |
| + if (restart_syscall && !pt_regs_is_syscall(regs)) |
| + restart_syscall = 0; |
| |
| - signr = get_signal_to_deliver(&info, &ka, regs, &cookie); |
| if (signr > 0) { |
| - if (cookie.restart_syscall) |
| + if (restart_syscall) |
| syscall_restart32(orig_i0, regs, &ka.sa); |
| handle_signal32(signr, &ka, &info, oldset, |
| regs, svr4_signal); |
| @@ -1307,16 +1317,16 @@ void do_signal32(sigset_t *oldset, struc |
| clear_thread_flag(TIF_RESTORE_SIGMASK); |
| return; |
| } |
| - if (cookie.restart_syscall && |
| + if (restart_syscall && |
| (regs->u_regs[UREG_I0] == ERESTARTNOHAND || |
| regs->u_regs[UREG_I0] == ERESTARTSYS || |
| regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { |
| /* replay the system call when we are done */ |
| - regs->u_regs[UREG_I0] = cookie.orig_i0; |
| + regs->u_regs[UREG_I0] = orig_i0; |
| regs->tpc -= 4; |
| regs->tnpc -= 4; |
| } |
| - if (cookie.restart_syscall && |
| + if (restart_syscall && |
| regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { |
| regs->u_regs[UREG_G1] = __NR_restart_syscall; |
| regs->tpc -= 4; |
| --- a/arch/sparc64/kernel/signal.c |
| +++ b/arch/sparc64/kernel/signal.c |
| @@ -336,6 +336,9 @@ void do_rt_sigreturn(struct pt_regs *reg |
| regs->tpc = tpc; |
| regs->tnpc = tnpc; |
| |
| + /* Prevent syscall restart. */ |
| + pt_regs_clear_syscall(regs); |
| + |
| sigdelsetmask(&set, ~_BLOCKABLE); |
| spin_lock_irq(¤t->sighand->siglock); |
| current->blocked = set; |
| @@ -500,7 +503,7 @@ static inline void handle_signal(unsigne |
| } |
| |
| static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, |
| - struct sigaction *sa) |
| + struct sigaction *sa) |
| { |
| switch (regs->u_regs[UREG_I0]) { |
| case ERESTART_RESTARTBLOCK: |
| @@ -524,17 +527,20 @@ static inline void syscall_restart(unsig |
| * want to handle. Thus you cannot kill init even with a SIGKILL even by |
| * mistake. |
| */ |
| -static void do_signal(struct pt_regs *regs, unsigned long orig_i0, int restart_syscall) |
| +static void do_signal(struct pt_regs *regs, unsigned long orig_i0, int __ignored) |
| { |
| - siginfo_t info; |
| - struct signal_deliver_cookie cookie; |
| struct k_sigaction ka; |
| - int signr; |
| + int restart_syscall; |
| sigset_t *oldset; |
| + siginfo_t info; |
| + int signr; |
| |
| - cookie.restart_syscall = restart_syscall; |
| - cookie.orig_i0 = orig_i0; |
| - |
| + if (pt_regs_is_syscall(regs) && |
| + (regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) { |
| + restart_syscall = 1; |
| + } else |
| + restart_syscall = 0; |
| + |
| if (test_thread_flag(TIF_RESTORE_SIGMASK)) |
| oldset = ¤t->saved_sigmask; |
| else |
| @@ -543,16 +549,24 @@ static void do_signal(struct pt_regs *re |
| #ifdef CONFIG_SPARC32_COMPAT |
| if (test_thread_flag(TIF_32BIT)) { |
| extern void do_signal32(sigset_t *, struct pt_regs *, |
| - unsigned long, int); |
| - do_signal32(oldset, regs, orig_i0, |
| - cookie.restart_syscall); |
| + int restart_syscall, |
| + unsigned long orig_i0); |
| + do_signal32(oldset, regs, restart_syscall, orig_i0); |
| return; |
| } |
| #endif |
| |
| - signr = get_signal_to_deliver(&info, &ka, regs, &cookie); |
| + signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| + |
| + /* If the debugger messes with the program counter, it clears |
| + * the software "in syscall" bit, directing us to not perform |
| + * a syscall restart. |
| + */ |
| + if (restart_syscall && !pt_regs_is_syscall(regs)) |
| + restart_syscall = 0; |
| + |
| if (signr > 0) { |
| - if (cookie.restart_syscall) |
| + if (restart_syscall) |
| syscall_restart(orig_i0, regs, &ka.sa); |
| handle_signal(signr, &ka, &info, oldset, regs); |
| |
| @@ -565,16 +579,16 @@ static void do_signal(struct pt_regs *re |
| clear_thread_flag(TIF_RESTORE_SIGMASK); |
| return; |
| } |
| - if (cookie.restart_syscall && |
| + if (restart_syscall && |
| (regs->u_regs[UREG_I0] == ERESTARTNOHAND || |
| regs->u_regs[UREG_I0] == ERESTARTSYS || |
| regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { |
| /* replay the system call when we are done */ |
| - regs->u_regs[UREG_I0] = cookie.orig_i0; |
| + regs->u_regs[UREG_I0] = orig_i0; |
| regs->tpc -= 4; |
| regs->tnpc -= 4; |
| } |
| - if (cookie.restart_syscall && |
| + if (restart_syscall && |
| regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { |
| regs->u_regs[UREG_G1] = __NR_restart_syscall; |
| regs->tpc -= 4; |
| @@ -596,26 +610,3 @@ void do_notify_resume(struct pt_regs *re |
| if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) |
| do_signal(regs, orig_i0, restart_syscall); |
| } |
| - |
| -void ptrace_signal_deliver(struct pt_regs *regs, void *cookie) |
| -{ |
| - struct signal_deliver_cookie *cp = cookie; |
| - |
| - if (cp->restart_syscall && |
| - (regs->u_regs[UREG_I0] == ERESTARTNOHAND || |
| - regs->u_regs[UREG_I0] == ERESTARTSYS || |
| - regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { |
| - /* replay the system call when we are done */ |
| - regs->u_regs[UREG_I0] = cp->orig_i0; |
| - regs->tpc -= 4; |
| - regs->tnpc -= 4; |
| - cp->restart_syscall = 0; |
| - } |
| - if (cp->restart_syscall && |
| - regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { |
| - regs->u_regs[UREG_G1] = __NR_restart_syscall; |
| - regs->tpc -= 4; |
| - regs->tnpc -= 4; |
| - cp->restart_syscall = 0; |
| - } |
| -} |
| --- a/arch/sparc/kernel/entry.S |
| +++ b/arch/sparc/kernel/entry.S |
| @@ -1398,6 +1398,8 @@ ret_from_fork: |
| .align 4 |
| .globl linux_sparc_syscall |
| linux_sparc_syscall: |
| + sethi %hi(PSR_SYSCALL), %l4 |
| + or %l0, %l4, %l0 |
| /* Direct access to user regs, must faster. */ |
| cmp %g1, NR_SYSCALLS |
| bgeu linux_sparc_ni_syscall |
| --- a/arch/sparc/kernel/ptrace.c |
| +++ b/arch/sparc/kernel/ptrace.c |
| @@ -170,8 +170,8 @@ static int genregs32_set(struct task_str |
| switch (pos) { |
| case 32: /* PSR */ |
| psr = regs->psr; |
| - psr &= ~PSR_ICC; |
| - psr |= (reg & PSR_ICC); |
| + psr &= ~(PSR_ICC | PSR_SYSCALL); |
| + psr |= (reg & (PSR_ICC | PSR_SYSCALL)); |
| regs->psr = psr; |
| break; |
| case 33: /* PC */ |
| --- a/arch/sparc/kernel/rtrap.S |
| +++ b/arch/sparc/kernel/rtrap.S |
| @@ -50,8 +50,9 @@ rtrap_7win_patch5: and %g1, 0x7f, %g1 |
| ret_trap_entry: |
| ret_trap_lockless_ipi: |
| andcc %t_psr, PSR_PS, %g0 |
| + sethi %hi(PSR_SYSCALL), %g1 |
| be 1f |
| - nop |
| + andn %t_psr, %g1, %t_psr |
| |
| wr %t_psr, 0x0, %psr |
| b ret_trap_kernel |
| @@ -73,7 +74,6 @@ signal_p: |
| ld [%sp + STACKFRAME_SZ + PT_PSR], %t_psr |
| |
| mov %l5, %o1 |
| - mov %l6, %o2 |
| call do_signal |
| add %sp, STACKFRAME_SZ, %o0 ! pt_regs ptr |
| |
| @@ -81,6 +81,8 @@ signal_p: |
| ld [%sp + STACKFRAME_SZ + PT_PSR], %t_psr |
| clr %l6 |
| ret_trap_continue: |
| + sethi %hi(PSR_SYSCALL), %g1 |
| + andn %t_psr, %g1, %t_psr |
| wr %t_psr, 0x0, %psr |
| WRITE_PAUSE |
| |
| @@ -137,8 +139,9 @@ ret_trap_userwins_ok: |
| LOAD_PT_PRIV(sp, t_psr, t_pc, t_npc) |
| or %t_pc, %t_npc, %g2 |
| andcc %g2, 0x3, %g0 |
| + sethi %hi(PSR_SYSCALL), %g2 |
| be 1f |
| - nop |
| + andn %t_psr, %g2, %t_psr |
| |
| b ret_trap_unaligned_pc |
| add %sp, STACKFRAME_SZ, %o0 |
| @@ -201,6 +204,8 @@ rtrap_patch5: and %g1, 0xff, %g1 |
| 1: |
| LOAD_PT_ALL(sp, t_psr, t_pc, t_npc, g1) |
| 2: |
| + sethi %hi(PSR_SYSCALL), %twin_tmp1 |
| + andn %t_psr, %twin_tmp1, %t_psr |
| wr %t_psr, 0x0, %psr |
| WRITE_PAUSE |
| |
| --- a/arch/sparc/kernel/signal.c |
| +++ b/arch/sparc/kernel/signal.c |
| @@ -178,6 +178,9 @@ static inline void do_new_sigreturn (str |
| regs->psr = (up_psr & ~(PSR_ICC | PSR_EF)) |
| | (regs->psr & (PSR_ICC | PSR_EF)); |
| |
| + /* Prevent syscall restart. */ |
| + pt_regs_clear_syscall(regs); |
| + |
| err |= __get_user(fpu_save, &sf->fpu_save); |
| |
| if (fpu_save) |
| @@ -299,6 +302,9 @@ asmlinkage void do_rt_sigreturn(struct p |
| |
| regs->psr = (regs->psr & ~PSR_ICC) | (psr & PSR_ICC); |
| |
| + /* Prevent syscall restart. */ |
| + pt_regs_clear_syscall(regs); |
| + |
| err |= __get_user(fpu_save, &sf->fpu_save); |
| |
| if (fpu_save) |
| @@ -1008,13 +1014,13 @@ static inline void syscall_restart(unsig |
| * want to handle. Thus you cannot kill init even with a SIGKILL even by |
| * mistake. |
| */ |
| -asmlinkage void do_signal(struct pt_regs * regs, unsigned long orig_i0, int restart_syscall) |
| +asmlinkage void do_signal(struct pt_regs * regs, unsigned long orig_i0) |
| { |
| - siginfo_t info; |
| - struct sparc_deliver_cookie cookie; |
| struct k_sigaction ka; |
| - int signr; |
| + int restart_syscall; |
| sigset_t *oldset; |
| + siginfo_t info; |
| + int signr; |
| |
| /* |
| * XXX Disable svr4 signal handling until solaris emulation works. |
| @@ -1027,18 +1033,28 @@ asmlinkage void do_signal(struct pt_regs |
| int svr4_signal = current->personality == PER_SVR4; |
| #endif |
| |
| - cookie.restart_syscall = restart_syscall; |
| - cookie.orig_i0 = orig_i0; |
| + if (pt_regs_is_syscall(regs) && (regs->psr & PSR_C)) |
| + restart_syscall = 1; |
| + else |
| + restart_syscall = 0; |
| |
| if (test_thread_flag(TIF_RESTORE_SIGMASK)) |
| oldset = ¤t->saved_sigmask; |
| else |
| oldset = ¤t->blocked; |
| |
| - signr = get_signal_to_deliver(&info, &ka, regs, &cookie); |
| + signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
| + |
| + /* If the debugger messes with the program counter, it clears |
| + * the software "in syscall" bit, directing us to not perform |
| + * a syscall restart. |
| + */ |
| + if (restart_syscall && !pt_regs_is_syscall(regs)) |
| + restart_syscall = 0; |
| + |
| if (signr > 0) { |
| - if (cookie.restart_syscall) |
| - syscall_restart(cookie.orig_i0, regs, &ka.sa); |
| + if (restart_syscall) |
| + syscall_restart(orig_i0, regs, &ka.sa); |
| handle_signal(signr, &ka, &info, oldset, |
| regs, svr4_signal); |
| /* a signal was successfully delivered; the saved |
| @@ -1050,16 +1066,16 @@ asmlinkage void do_signal(struct pt_regs |
| clear_thread_flag(TIF_RESTORE_SIGMASK); |
| return; |
| } |
| - if (cookie.restart_syscall && |
| + if (restart_syscall && |
| (regs->u_regs[UREG_I0] == ERESTARTNOHAND || |
| regs->u_regs[UREG_I0] == ERESTARTSYS || |
| regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { |
| /* replay the system call when we are done */ |
| - regs->u_regs[UREG_I0] = cookie.orig_i0; |
| + regs->u_regs[UREG_I0] = orig_i0; |
| regs->pc -= 4; |
| regs->npc -= 4; |
| } |
| - if (cookie.restart_syscall && |
| + if (restart_syscall && |
| regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { |
| regs->u_regs[UREG_G1] = __NR_restart_syscall; |
| regs->pc -= 4; |
| @@ -1111,27 +1127,3 @@ do_sys_sigstack(struct sigstack __user * |
| out: |
| return ret; |
| } |
| - |
| -void ptrace_signal_deliver(struct pt_regs *regs, void *cookie) |
| -{ |
| - struct sparc_deliver_cookie *cp = cookie; |
| - |
| - if (cp->restart_syscall && |
| - (regs->u_regs[UREG_I0] == ERESTARTNOHAND || |
| - regs->u_regs[UREG_I0] == ERESTARTSYS || |
| - regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { |
| - /* replay the system call when we are done */ |
| - regs->u_regs[UREG_I0] = cp->orig_i0; |
| - regs->pc -= 4; |
| - regs->npc -= 4; |
| - cp->restart_syscall = 0; |
| - } |
| - |
| - if (cp->restart_syscall && |
| - regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { |
| - regs->u_regs[UREG_G1] = __NR_restart_syscall; |
| - regs->pc -= 4; |
| - regs->npc -= 4; |
| - cp->restart_syscall = 0; |
| - } |
| -} |
| --- a/include/asm-sparc64/psrcompat.h |
| +++ b/include/asm-sparc64/psrcompat.h |
| @@ -12,6 +12,7 @@ |
| #define PSR_PIL 0x00000f00 /* processor interrupt level */ |
| #define PSR_EF 0x00001000 /* enable floating point */ |
| #define PSR_EC 0x00002000 /* enable co-processor */ |
| +#define PSR_SYSCALL 0x00004000 /* inside of a syscall */ |
| #define PSR_LE 0x00008000 /* SuperSparcII little-endian */ |
| #define PSR_ICC 0x00f00000 /* integer condition codes */ |
| #define PSR_C 0x00100000 /* carry bit */ |
| @@ -30,6 +31,7 @@ static inline unsigned int tstate_to_psr |
| PSR_S | |
| ((tstate & TSTATE_ICC) >> 12) | |
| ((tstate & TSTATE_XCC) >> 20) | |
| + ((tstate & TSTATE_SYSCALL) ? PSR_SYSCALL : 0) | |
| PSR_V8PLUS); |
| } |
| |
| --- a/include/asm-sparc64/pstate.h |
| +++ b/include/asm-sparc64/pstate.h |
| @@ -62,6 +62,7 @@ |
| #define TSTATE_PRIV _AC(0x0000000000000400,UL) /* Privilege. */ |
| #define TSTATE_IE _AC(0x0000000000000200,UL) /* Interrupt Enable. */ |
| #define TSTATE_AG _AC(0x0000000000000100,UL) /* Alternate Globals.*/ |
| +#define TSTATE_SYSCALL _AC(0x0000000000000020,UL) /* in syscall trap */ |
| #define TSTATE_CWP _AC(0x000000000000001f,UL) /* Curr Win-Pointer. */ |
| |
| /* Floating-Point Registers State Register. |
| --- a/include/asm-sparc64/ptrace.h |
| +++ b/include/asm-sparc64/ptrace.h |
| @@ -10,6 +10,8 @@ |
| |
| #ifndef __ASSEMBLY__ |
| |
| +#include <linux/types.h> |
| + |
| struct pt_regs { |
| unsigned long u_regs[16]; /* globals and ins */ |
| unsigned long tstate; |
| @@ -27,6 +29,16 @@ struct pt_regs32 { |
| unsigned int u_regs[16]; /* globals and ins */ |
| }; |
| |
| +static inline bool pt_regs_is_syscall(struct pt_regs *regs) |
| +{ |
| + return (regs->tstate & TSTATE_SYSCALL); |
| +} |
| + |
| +static inline bool pt_regs_clear_syscall(struct pt_regs *regs) |
| +{ |
| + return (regs->tstate &= ~TSTATE_SYSCALL); |
| +} |
| + |
| #define UREG_G0 0 |
| #define UREG_G1 1 |
| #define UREG_G2 2 |
| --- a/include/asm-sparc64/signal.h |
| +++ b/include/asm-sparc64/signal.h |
| @@ -186,13 +186,7 @@ struct k_sigaction { |
| void __user *ka_restorer; |
| }; |
| |
| -struct signal_deliver_cookie { |
| - int restart_syscall; |
| - unsigned long orig_i0; |
| -}; |
| - |
| -struct pt_regs; |
| -extern void ptrace_signal_deliver(struct pt_regs *regs, void *cookie); |
| +#define ptrace_signal_deliver(regs, cookie) do { } while (0) |
| |
| #endif /* !(__KERNEL__) */ |
| |
| --- a/include/asm-sparc64/ttable.h |
| +++ b/include/asm-sparc64/ttable.h |
| @@ -91,13 +91,14 @@ |
| clr %l6; |
| |
| #define SYSCALL_TRAP(routine, systbl) \ |
| + rdpr %pil, %g2; \ |
| + mov TSTATE_SYSCALL, %g3; \ |
| sethi %hi(109f), %g7; \ |
| - ba,pt %xcc, etrap; \ |
| + ba,pt %xcc, etrap_syscall; \ |
| 109: or %g7, %lo(109b), %g7; \ |
| sethi %hi(systbl), %l7; \ |
| ba,pt %xcc, routine; \ |
| - or %l7, %lo(systbl), %l7; \ |
| - nop; nop; |
| + or %l7, %lo(systbl), %l7; |
| |
| #define INDIRECT_SOLARIS_SYSCALL(num) \ |
| sethi %hi(109f), %g7; \ |
| --- a/include/asm-sparc/psr.h |
| +++ b/include/asm-sparc/psr.h |
| @@ -25,6 +25,7 @@ |
| #define PSR_PIL 0x00000f00 /* processor interrupt level */ |
| #define PSR_EF 0x00001000 /* enable floating point */ |
| #define PSR_EC 0x00002000 /* enable co-processor */ |
| +#define PSR_SYSCALL 0x00004000 /* inside of a syscall */ |
| #define PSR_LE 0x00008000 /* SuperSparcII little-endian */ |
| #define PSR_ICC 0x00f00000 /* integer condition codes */ |
| #define PSR_C 0x00100000 /* carry bit */ |
| --- a/include/asm-sparc/ptrace.h |
| +++ b/include/asm-sparc/ptrace.h |
| @@ -10,6 +10,8 @@ |
| |
| #ifndef __ASSEMBLY__ |
| |
| +#include <linux/types.h> |
| + |
| struct pt_regs { |
| unsigned long psr; |
| unsigned long pc; |
| @@ -39,6 +41,16 @@ struct pt_regs { |
| #define UREG_FP UREG_I6 |
| #define UREG_RETPC UREG_I7 |
| |
| +static inline bool pt_regs_is_syscall(struct pt_regs *regs) |
| +{ |
| + return (regs->psr & PSR_SYSCALL); |
| +} |
| + |
| +static inline bool pt_regs_clear_syscall(struct pt_regs *regs) |
| +{ |
| + return (regs->psr &= ~PSR_SYSCALL); |
| +} |
| + |
| /* A register window */ |
| struct reg_window { |
| unsigned long locals[8]; |
| --- a/include/asm-sparc/signal.h |
| +++ b/include/asm-sparc/signal.h |
| @@ -199,13 +199,7 @@ typedef struct sigaltstack { |
| size_t ss_size; |
| } stack_t; |
| |
| -struct sparc_deliver_cookie { |
| - int restart_syscall; |
| - unsigned long orig_i0; |
| -}; |
| - |
| -struct pt_regs; |
| -extern void ptrace_signal_deliver(struct pt_regs *regs, void *cookie); |
| +#define ptrace_signal_deliver(regs, cookie) do { } while (0) |
| |
| #endif /* !(__KERNEL__) */ |
| |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:25 2008 |
| Message-Id: <20080513200825.488589000@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:20 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| "David S. Miller" <davem@davemloft.net> |
| Subject: [patch 27/37] sparc32: Dont twiddle PT_DTRACE in exec. |
| Content-Disposition: inline; filename=sparc32-don-t-twiddle-pt_dtrace-in-exec.patch |
| Content-Length: 790 |
| Lines: 33 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: David S. Miller <davem@davemloft.net> |
| |
| [ Upstream commit: c07c6053c41f736711ed856aa377007078c7c396 ] |
| |
| That bit isn't used on this platform. |
| |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/sparc/kernel/process.c | 5 ----- |
| 1 file changed, 5 deletions(-) |
| |
| --- a/arch/sparc/kernel/process.c |
| +++ b/arch/sparc/kernel/process.c |
| @@ -640,11 +640,6 @@ asmlinkage int sparc_execve(struct pt_re |
| (char __user * __user *)regs->u_regs[base + UREG_I2], |
| regs); |
| putname(filename); |
| - if (error == 0) { |
| - task_lock(current); |
| - current->ptrace &= ~PT_DTRACE; |
| - task_unlock(current); |
| - } |
| out: |
| return error; |
| } |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:25 2008 |
| Message-Id: <20080513200825.745853401@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:21 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| Leonardo Chiquitto <lchiquitto@novell.com> |
| Subject: [patch 28/37] USB: airprime: unlock mutex instead of trying to lock it again |
| Content-Disposition: inline; filename=usb-airprime-unlock-mutex-instead-of-trying-to-lock-it-again.patch |
| Content-Length: 973 |
| Lines: 32 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Leonardo Chiquitto <leonardo@iken.com.br> |
| |
| commit 21ae1dd1d4948968ad2d923c5e104d38fb35b4e4 upstream |
| |
| The following patch fixes a [probable] copy & paste mistake in |
| airprime.c. Instead of unlocking an acquired mutex, the actual |
| code tries to lock it again. |
| |
| Signed-off-by: Leonardo Chiquitto <lchiquitto@novell.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/usb/serial/airprime.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/drivers/usb/serial/airprime.c |
| +++ b/drivers/usb/serial/airprime.c |
| @@ -220,7 +220,7 @@ static void airprime_close(struct usb_se |
| mutex_lock(&port->serial->disc_mutex); |
| if (!port->serial->disconnected) |
| airprime_send_setup(port); |
| - mutex_lock(&port->serial->disc_mutex); |
| + mutex_unlock(&port->serial->disc_mutex); |
| |
| for (i = 0; i < NUM_READ_URBS; ++i) { |
| usb_kill_urb (priv->read_urbp[i]); |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:26 2008 |
| Message-Id: <20080513200826.003558849@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:22 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| Roel Kluin <12o3l@tiscali.nl>, |
| Francois Romieu <romieu@fr.zoreil.com> |
| Subject: [patch 29/37] r8169: fix past rtl_chip_info array size for unknown chipsets |
| Content-Disposition: inline; filename=r8169-fix-past-rtl_chip_info-array-size-for-unknown-chipsets.patch |
| Content-Length: 1098 |
| Lines: 44 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Roel Kluin <12o3l@tiscali.nl> |
| |
| commit cee60c377de6d9d10f0a2876794149bd79a15020 upstream. |
| |
| 'i' is unsigned. |
| |
| Signed-off-by: Roel Kluin <12o3l@tiscali.nl> |
| Acked-by: Francois Romieu <romieu@fr.zoreil.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/net/r8169.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/net/r8169.c |
| +++ b/drivers/net/r8169.c |
| @@ -1705,18 +1705,18 @@ rtl8169_init_one(struct pci_dev *pdev, c |
| |
| rtl8169_print_mac_version(tp); |
| |
| - for (i = ARRAY_SIZE(rtl_chip_info) - 1; i >= 0; i--) { |
| + for (i = 0; i < ARRAY_SIZE(rtl_chip_info); i++) { |
| if (tp->mac_version == rtl_chip_info[i].mac_version) |
| break; |
| } |
| - if (i < 0) { |
| + if (i == ARRAY_SIZE(rtl_chip_info)) { |
| /* Unknown chip: assume array element #0, original RTL-8169 */ |
| if (netif_msg_probe(tp)) { |
| dev_printk(KERN_DEBUG, &pdev->dev, |
| "unknown chip version, assuming %s\n", |
| rtl_chip_info[0].name); |
| } |
| - i++; |
| + i = 0; |
| } |
| tp->chipset = i; |
| |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:26 2008 |
| Message-Id: <20080513200826.291989781@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:23 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| Ivan Vecera <ivecera@redhat.com>, |
| Francois Romieu <romieu@fr.zoreil.com> |
| Subject: [patch 30/37] r8169: fix oops in r8169_get_mac_version |
| Content-Disposition: inline; filename=r8169-fix-oops-in-r8169_get_mac_version.patch |
| Content-Length: 1105 |
| Lines: 39 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Ivan Vecera <ivecera@redhat.com> |
| |
| commit 21e197f231343201368338603cb0909a13961bac upstream. |
| |
| r8169_get_mac_version crashes when it meets an unknown MAC |
| due to tp->pci_dev not being set. Initialize it early. |
| |
| Signed-off-by: Ivan Vecera <ivecera@redhat.com> |
| Acked-by: Francois Romieu <romieu@fr.zoreil.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/net/r8169.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/drivers/net/r8169.c |
| +++ b/drivers/net/r8169.c |
| @@ -1617,6 +1617,7 @@ rtl8169_init_one(struct pci_dev *pdev, c |
| SET_NETDEV_DEV(dev, &pdev->dev); |
| tp = netdev_priv(dev); |
| tp->dev = dev; |
| + tp->pci_dev = pdev; |
| tp->msg_enable = netif_msg_init(debug.msg_enable, R8169_MSG_DEFAULT); |
| |
| /* enable device (incl. PCI PM wakeup and hotplug setup) */ |
| @@ -1777,7 +1778,6 @@ rtl8169_init_one(struct pci_dev *pdev, c |
| #endif |
| |
| tp->intr_mask = 0xffff; |
| - tp->pci_dev = pdev; |
| tp->mmio_addr = ioaddr; |
| tp->align = cfg->align; |
| tp->hw_start = cfg->hw_start; |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:26 2008 |
| Message-Id: <20080513200826.531795538@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:24 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org, |
| jejb@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| Jeremy Higdon <jeremy@sgi.com>, |
| Jes Sorensen <jes@sgi.com>, |
| James Bottomley <James.Bottomley@HansenPartnership.com> |
| Subject: [patch 31/37] SCSI: qla1280: Fix queue depth problem |
| Content-Disposition: inline; filename=scsi-qla1280-fix-queue-depth-problem.patch |
| Content-Length: 2477 |
| Lines: 67 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Jeremy Higdon <jeremy@sgi.com> |
| |
| commit af5741c6de4f4a1d8608b0f00867c77cb7123635 upstream |
| |
| The qla1280 driver was ANDing the output value of mailbox register |
| 0 with (1 << target-number) to determine whether to enable queueing |
| on the target in question. |
| |
| But mailbox register 0 has the status code for the mailbox command |
| (in this case, Set Target Parameters). Potential values are: |
| /* |
| * ISP mailbox command complete status codes |
| */ |
| |
| So clearly that is in error. I can't think what the author of that |
| line was looking for in a mailbox register, so I just eliminated the |
| AND. flag is used later in the function, and I think that the later |
| usage was also wrong, though it was used to set values that aren't |
| used. Oh well, an overhaul of this driver is not what I want to do |
| now -- just a bugfix. |
| |
| After the fix, I found that my disks were getting a queue depth of |
| 255, which is far too many. Most SCSI disks are limited to 32 or |
| 64. In any case, there's no point, queueing up a bunch of commands |
| to the adapter that will just result in queue full or starve other |
| targets from being issued commands due to running out of internal |
| memory. So I dropped default queue depth to 32 (from which 1 is |
| subtracted elsewhere, giving net of 31). |
| |
| I tested with a Seagate ST336753LC, and results look good, so |
| I'm satisfied with this patch. |
| |
| Signed-off-by: Jeremy Higdon <jeremy@sgi.com> |
| Acked-by: Jes Sorensen <jes@sgi.com> |
| Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/scsi/qla1280.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/scsi/qla1280.c |
| +++ b/drivers/scsi/qla1280.c |
| @@ -2012,7 +2012,7 @@ qla1280_set_defaults(struct scsi_qla_hos |
| nv->bus[bus].config_2.req_ack_active_negation = 1; |
| nv->bus[bus].config_2.data_line_active_negation = 1; |
| nv->bus[bus].selection_timeout = 250; |
| - nv->bus[bus].max_queue_depth = 256; |
| + nv->bus[bus].max_queue_depth = 32; |
| |
| if (IS_ISP1040(ha)) { |
| nv->bus[bus].bus_reset_delay = 3; |
| @@ -2056,7 +2056,7 @@ qla1280_config_target(struct scsi_qla_ho |
| status = qla1280_mailbox_command(ha, 0x0f, mb); |
| |
| /* Save Tag queuing enable flag. */ |
| - flag = (BIT_0 << target) & mb[0]; |
| + flag = (BIT_0 << target); |
| if (nv->bus[bus].target[target].parameter.tag_queuing) |
| ha->bus_settings[bus].qtag_enables |= flag; |
| |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:26 2008 |
| Message-Id: <20080513200826.781669963@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:25 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org, |
| jejb@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| Mike Christie <michaelc@cs.wisc.edu>, |
| James Bottomley <James.Bottomley@HansenPartnership.com> |
| Subject: [patch 32/37] SCSI: libiscsi regression in 2.6.25: fix nop timer handling |
| Content-Disposition: inline; filename=scsi-libiscsi-regression-in-2.6.25-fix-nop-timer-handling.patch |
| Content-Length: 2925 |
| Lines: 81 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Mike Christie <michaelc@cs.wisc.edu> |
| |
| commit 4cf1043593db6a337f10e006c23c69e5fc93e722 upstream |
| |
| The following patch fixes a bug in the iscsi nop processing. |
| The target sends iscsi nops to ping the initiator and the |
| initiator has to send nops to reply and can send nops to |
| ping the target. |
| |
| In 2.6.25 we moved the nop processing to the kernel to handle |
| problems when the userspace daemon is not up, but the target |
| is pinging us, and to handle when scsi commands timeout, but |
| the transport may be the cause (we can send a nop to check |
| the transport). When we added this code we added a bug where |
| if the transport timer wakes at the exact same time we are supposed to check |
| for a nop timeout we drop the session instead of checking the transport. |
| |
| This patch checks if a iscsi ping is outstanding and if the ping has |
| timed out, to determine if we need to signal a connection problem. |
| |
| Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> |
| Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/scsi/libiscsi.c | 17 +++++++++-------- |
| 1 file changed, 9 insertions(+), 8 deletions(-) |
| |
| --- a/drivers/scsi/libiscsi.c |
| +++ b/drivers/scsi/libiscsi.c |
| @@ -1353,19 +1353,20 @@ static void iscsi_check_transport_timeou |
| { |
| struct iscsi_conn *conn = (struct iscsi_conn *)data; |
| struct iscsi_session *session = conn->session; |
| - unsigned long timeout, next_timeout = 0, last_recv; |
| + unsigned long recv_timeout, next_timeout = 0, last_recv; |
| |
| spin_lock(&session->lock); |
| if (session->state != ISCSI_STATE_LOGGED_IN) |
| goto done; |
| |
| - timeout = conn->recv_timeout; |
| - if (!timeout) |
| + recv_timeout = conn->recv_timeout; |
| + if (!recv_timeout) |
| goto done; |
| |
| - timeout *= HZ; |
| + recv_timeout *= HZ; |
| last_recv = conn->last_recv; |
| - if (time_before_eq(last_recv + timeout + (conn->ping_timeout * HZ), |
| + if (conn->ping_mtask && |
| + time_before_eq(conn->last_ping + (conn->ping_timeout * HZ), |
| jiffies)) { |
| iscsi_conn_printk(KERN_ERR, conn, "ping timeout of %d secs " |
| "expired, last rx %lu, last ping %lu, " |
| @@ -1376,15 +1377,15 @@ static void iscsi_check_transport_timeou |
| return; |
| } |
| |
| - if (time_before_eq(last_recv + timeout, jiffies)) { |
| + if (time_before_eq(last_recv + recv_timeout, jiffies)) { |
| if (time_before_eq(conn->last_ping, last_recv)) { |
| /* send a ping to try to provoke some traffic */ |
| debug_scsi("Sending nopout as ping on conn %p\n", conn); |
| iscsi_send_nopout(conn, NULL); |
| } |
| - next_timeout = last_recv + timeout + (conn->ping_timeout * HZ); |
| + next_timeout = conn->last_ping + (conn->ping_timeout * HZ); |
| } else |
| - next_timeout = last_recv + timeout; |
| + next_timeout = last_recv + recv_timeout; |
| |
| debug_scsi("Setting next tmo %lu\n", next_timeout); |
| mod_timer(&conn->transport_timer, next_timeout); |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:27 2008 |
| Message-Id: <20080513200826.991579323@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:26 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org, |
| jejb@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| Mike Christie <michaelc@cs.wisc.edu>, |
| James Bottomley <James.Bottomley@HansenPartnership.com> |
| Subject: [patch 33/37] SCSI: libiscsi regression in 2.6.25: fix setting of recv timer |
| Content-Disposition: inline; filename=scsi-libiscsi-regression-in-2.6.25-fix-setting-of-recv-timer.patch |
| Content-Length: 1875 |
| Lines: 55 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Mike Christie <michaelc@cs.wisc.edu> |
| |
| commit c8611f975403dd20e6503aff8aded5dcb718f75b upstream |
| |
| If the ping tmo is longer than the recv tmo then we could miss a window |
| where we were supposed to check the recv tmo. This happens because |
| the ping code will set the next timeout for the ping timeout, and if the |
| ping executes quickly there will be a long chunk of time before the |
| timer wakes up again. |
| |
| This patch has the ping processing code kick off a recv |
| tmo check when getting a nop in response to our ping. |
| |
| Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> |
| Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/scsi/libiscsi.c | 12 ++++++------ |
| 1 file changed, 6 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/scsi/libiscsi.c |
| +++ b/drivers/scsi/libiscsi.c |
| @@ -635,7 +635,9 @@ static int __iscsi_complete_pdu(struct i |
| if (iscsi_recv_pdu(conn->cls_conn, hdr, data, |
| datalen)) |
| rc = ISCSI_ERR_CONN_FAILED; |
| - } |
| + } else |
| + mod_timer(&conn->transport_timer, |
| + jiffies + conn->recv_timeout); |
| iscsi_free_mgmt_task(conn, mtask); |
| break; |
| default: |
| @@ -1378,11 +1380,9 @@ static void iscsi_check_transport_timeou |
| } |
| |
| if (time_before_eq(last_recv + recv_timeout, jiffies)) { |
| - if (time_before_eq(conn->last_ping, last_recv)) { |
| - /* send a ping to try to provoke some traffic */ |
| - debug_scsi("Sending nopout as ping on conn %p\n", conn); |
| - iscsi_send_nopout(conn, NULL); |
| - } |
| + /* send a ping to try to provoke some traffic */ |
| + debug_scsi("Sending nopout as ping on conn %p\n", conn); |
| + iscsi_send_nopout(conn, NULL); |
| next_timeout = conn->last_ping + (conn->ping_timeout * HZ); |
| } else |
| next_timeout = last_recv + recv_timeout; |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:27 2008 |
| Message-Id: <20080513200827.192716967@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:27 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org, |
| jejb@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| James Bottomley <James.Bottomley@HansenPartnership.com> |
| Subject: [patch 34/37] SCSI: aha152x: Fix oops on module removal |
| Content-Disposition: inline; filename=scsi-aha152x-fix-oops-on-module-removal.patch |
| Content-Length: 2484 |
| Lines: 63 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: James Bottomley <James.Bottomley@HansenPartnership.com> |
| |
| commit 64976a0387835a7ac61bbe2a99b27ccae34eac5d upstream |
| |
| Reported-by: Frank de Jong <frapex@xs4all.nl> |
| > after trying to unload the module: |
| > BUG: unable to handle kernel paging request at 00100100 |
| > IP: [<fb9ff667>] :aha152x:aha152x_exit+0x47/0x6a |
| > *pde = 00000000 |
| > Oops: 0000 [#1] PREEMPT SMP |
| > Modules linked in: aha152x(-) w83781d hwmon_vid tun ne 8390 bonding |
| > usb_storage snd_usb_audio snd_usb_lib snd_rawmidi pwc snd_seq_device |
| > compat_ioctl32 snd_hwdep videodev v4l1_compat 3c59x mii intel_agp |
| > agpgart snd_pcm_oss snd_pcm snd_timer snd_page_alloc snd_mixer_oss snd |
| > |
| > Pid: 2837, comm: rmmod Not tainted (2.6.25.3 #1) |
| > EIP: 0060:[<fb9ff667>] EFLAGS: 00210212 CPU: 0 |
| > EIP is at aha152x_exit+0x47/0x6a [aha152x] |
| > EAX: 00000001 EBX: 000ffdc4 ECX: f7c517a8 EDX: 00000001 |
| > ESI: 00000000 EDI: 00000003 EBP: e7880000 ESP: e7881f58 |
| > DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068 |
| > Process rmmod (pid: 2837, ti=e7880000 task=f27eb580 task.ti=e7880000) |
| > Stack: fba03700 c01419d2 31616861 00783235 e795ee70 c0157709 b7f24000 e79ae000 |
| > c0158271 ffffffff b7f25000 e79ae004 e795e370 b7f25000 e795e37c e795e370 |
| > 009ae000 fba03700 00000880 e7881fa8 00000000 bf93ec20 bf93ec20 c0102faa |
| > Call Trace: |
| > [<c01419d2>] sys_delete_module+0x112/0x1a0 |
| > [<c0157709>] remove_vma+0x39/0x50 |
| > [<c0158271>] do_munmap+0x181/0x1f0 |
| > [<c0102faa>] sysenter_past_esp+0x5f/0x85 |
| > [<c0490000>] rsc_parse+0x0/0x3c0 |
| |
| The problem is that the driver calls aha152x_release() under a |
| list_for_each_entry(). Unfortunately, aha152x_release() deletes from |
| the list in question. Fix this by using list_for_each_entry_safe(). |
| |
| Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/scsi/aha152x.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/scsi/aha152x.c |
| +++ b/drivers/scsi/aha152x.c |
| @@ -3919,9 +3919,9 @@ static int __init aha152x_init(void) |
| |
| static void __exit aha152x_exit(void) |
| { |
| - struct aha152x_hostdata *hd; |
| + struct aha152x_hostdata *hd, *tmp; |
| |
| - list_for_each_entry(hd, &aha152x_host_list, host_list) { |
| + list_for_each_entry_safe(hd, tmp, &aha152x_host_list, host_list) { |
| struct Scsi_Host *shost = container_of((void *)hd, struct Scsi_Host, hostdata); |
| |
| aha152x_release(shost); |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:27 2008 |
| Message-Id: <20080513200827.350719521@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:28 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org, |
| jejb@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| James Bottomley <James.Bottomley@HansenPartnership.com> |
| Subject: [patch 35/37] SCSI: aha152x: fix init suspiciously returned 1, it should follow 0/-E convention |
| Content-Disposition: inline; filename=scsi-aha152x-fix-init-suspiciously-returned-1-it-should-follow-0-e-convention.patch |
| Content-Length: 1227 |
| Lines: 46 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: James Bottomley <James.Bottomley@HansenPartnership.com> |
| |
| commit ad2fa42d044b98469449880474a9662fb689f7f9 upstream |
| |
| Reported-by: Frank de Jong <frapex@xs4all.nl> |
| > [1.] One line summary of the problem: |
| > linux-2.6.25.3, aha152x'->init suspiciously returned 1, it should |
| > follow 0/-E convention. The module / driver works okay. Unloading the |
| > module is impossible. |
| |
| The driver is apparently returning 0 on failure and 1 on success. |
| That's a bit unfortunate. Fix it by altering to -ENODEV and 0. |
| |
| Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/scsi/aha152x.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/scsi/aha152x.c |
| +++ b/drivers/scsi/aha152x.c |
| @@ -3835,7 +3835,7 @@ static int __init aha152x_init(void) |
| iounmap(p); |
| } |
| if (!ok && setup_count == 0) |
| - return 0; |
| + return -ENODEV; |
| |
| printk(KERN_INFO "aha152x: BIOS test: passed, "); |
| #else |
| @@ -3914,7 +3914,7 @@ static int __init aha152x_init(void) |
| #endif |
| } |
| |
| - return 1; |
| + return 0; |
| } |
| |
| static void __exit aha152x_exit(void) |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:27 2008 |
| Message-Id: <20080513200827.670972096@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:29 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org, |
| jejb@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| "Maciej W. Rozycki" <macro@linux-mips.org>, |
| Alessandro Zummo <a.zummo@towertech.it>, |
| David Brownell <david-b@pacbell.net>, |
| Dmitri Vorobiev <dmitri.vorobiev@gmail.com> |
| Subject: [patch 36/37] rtc: rtc_time_to_tm: use unsigned arithmetic |
| Content-Disposition: inline; filename=rtc-rtc_time_to_tm-use-unsigned-arithmetic.patch |
| Content-Length: 1763 |
| Lines: 52 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Maciej W. Rozycki <macro@linux-mips.org> |
| |
| commit 945185a69daa457c4c5e46e47f4afad7dcea734f upstream |
| Date: Mon, 12 May 2008 14:02:24 -0700 |
| Subject: [patch 36/37] rtc: rtc_time_to_tm: use unsigned arithmetic |
| |
| The input argument to rtc_time_to_tm() is unsigned as well as are members of |
| the output structure. However signed arithmetic is used within for |
| calculations leading to incorrect results for input values outside the signed |
| positive range. If this happens the time of day returned is out of range. |
| |
| Found the problem when fiddling with the RTC and the driver where year was set |
| to an unexpectedly large value like 2070, e.g.: |
| |
| rtc0: setting system clock to 2070-01-01 1193046:71582832:26 UTC (3155760954) |
| |
| while it should be: |
| |
| rtc0: setting system clock to 2070-01-01 00:15:54 UTC (3155760954) |
| |
| Changing types to unsigned fixes the problem. |
| |
| [akpm@linux-foundation.org: remove old-fashioned `register' keyword] |
| Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org> |
| Cc: Alessandro Zummo <a.zummo@towertech.it> |
| Cc: David Brownell <david-b@pacbell.net> |
| Cc: Dmitri Vorobiev <dmitri.vorobiev@gmail.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/rtc/rtc-lib.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/drivers/rtc/rtc-lib.c |
| +++ b/drivers/rtc/rtc-lib.c |
| @@ -51,7 +51,7 @@ EXPORT_SYMBOL(rtc_year_days); |
| */ |
| void rtc_time_to_tm(unsigned long time, struct rtc_time *tm) |
| { |
| - register int days, month, year; |
| + unsigned int days, month, year; |
| |
| days = time / 86400; |
| time -= days * 86400; |
| |
| -- |
| |
| From gregkh@mini.kroah.org Tue May 13 13:08:28 2008 |
| Message-Id: <20080513200827.862976946@mini.kroah.org> |
| References: <20080513200453.064446337@mini.kroah.org> |
| User-Agent: quilt/0.46-1 |
| Date: Tue, 13 May 2008 13:05:30 -0700 |
| From: Greg KH <gregkh@suse.de> |
| To: linux-kernel@vger.kernel.org, |
| stable@kernel.org, |
| jejb@kernel.org |
| Cc: Justin Forbes <jmforbes@linuxtx.org>, |
| Zwane Mwaikambo <zwane@arm.linux.org.uk>, |
| Theodore Ts'o <tytso@mit.edu>, |
| Randy Dunlap <rdunlap@xenotime.net>, |
| Dave Jones <davej@redhat.com>, |
| Chuck Wolber <chuckw@quantumlinux.com>, |
| Chris Wedgwood <reviews@ml.cw.f00f.org>, |
| Michael Krufky <mkrufky@linuxtv.org>, |
| Chuck Ebbert <cebbert@redhat.com>, |
| Domenico Andreoli <cavokz@gmail.com>, |
| torvalds@linux-foundation.org, |
| akpm@linux-foundation.org, |
| alan@lxorguk.ukuu.org.uk, |
| NeilBrown <neilb@suse.de>, |
| Dan Williams <dan.j.williams@intel.com> |
| Subject: [patch 37/37] md: fix raid5 repair operations |
| Content-Disposition: inline; filename=md-fix-raid5-repair-operations.patch |
| Content-Length: 3263 |
| Lines: 89 |
| |
| 2.6.25-stable review patch. If anyone has any objections, please let us |
| know. |
| |
| ------------------ |
| From: Dan Williams <dan.j.williams@intel.com> |
| |
| commit c8894419acf5e56851de9741c5047bebd78acd1f upstream |
| Date: Mon, 12 May 2008 14:02:12 -0700 |
| Subject: [patch 37/37] md: fix raid5 'repair' operations |
| |
| commit bd2ab67030e9116f1e4aae1289220255412b37fd "md: close a livelock window |
| in handle_parity_checks5" introduced a bug in handling 'repair' operations. |
| After a repair operation completes we clear the state bits tracking this |
| operation. However, they are cleared too early and this results in the code |
| deciding to re-run the parity check operation. Since we have done the repair |
| in memory the second check does not find a mismatch and thus does not do a |
| writeback. |
| |
| Test results: |
| $ echo repair > /sys/block/md0/md/sync_action |
| $ cat /sys/block/md0/md/mismatch_cnt |
| 51072 |
| $ echo repair > /sys/block/md0/md/sync_action |
| $ cat /sys/block/md0/md/mismatch_cnt |
| 0 |
| |
| (also fix incorrect indentation) |
| |
| Tested-by: George Spelvin <linux@horizon.com> |
| Acked-by: NeilBrown <neilb@suse.de> |
| Signed-off-by: Dan Williams <dan.j.williams@intel.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/md/raid5.c | 25 +++++++++++++------------ |
| 1 file changed, 13 insertions(+), 12 deletions(-) |
| |
| --- a/drivers/md/raid5.c |
| +++ b/drivers/md/raid5.c |
| @@ -2354,8 +2354,8 @@ static void handle_parity_checks5(raid5_ |
| |
| /* complete a check operation */ |
| if (test_and_clear_bit(STRIPE_OP_CHECK, &sh->ops.complete)) { |
| - clear_bit(STRIPE_OP_CHECK, &sh->ops.ack); |
| - clear_bit(STRIPE_OP_CHECK, &sh->ops.pending); |
| + clear_bit(STRIPE_OP_CHECK, &sh->ops.ack); |
| + clear_bit(STRIPE_OP_CHECK, &sh->ops.pending); |
| if (s->failed == 0) { |
| if (sh->ops.zero_sum_result == 0) |
| /* parity is correct (on disc, |
| @@ -2385,16 +2385,6 @@ static void handle_parity_checks5(raid5_ |
| canceled_check = 1; /* STRIPE_INSYNC is not set */ |
| } |
| |
| - /* check if we can clear a parity disk reconstruct */ |
| - if (test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.complete) && |
| - test_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending)) { |
| - |
| - clear_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending); |
| - clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.complete); |
| - clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.ack); |
| - clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending); |
| - } |
| - |
| /* start a new check operation if there are no failures, the stripe is |
| * not insync, and a repair is not in flight |
| */ |
| @@ -2409,6 +2399,17 @@ static void handle_parity_checks5(raid5_ |
| } |
| } |
| |
| + /* check if we can clear a parity disk reconstruct */ |
| + if (test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.complete) && |
| + test_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending)) { |
| + |
| + clear_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending); |
| + clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.complete); |
| + clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.ack); |
| + clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending); |
| + } |
| + |
| + |
| /* Wait for check parity and compute block operations to complete |
| * before write-back. If a failure occurred while the check operation |
| * was in flight we need to cycle this stripe through handle_stripe |
| |
| -- |
| |