Add stable releases 2.6.23.2 to 2.6.23.8.

* debian/changelog: Update.
* debian/patches/bugfix/all/stable/2.6.23.2.patch,
  debian/patches/bugfix/all/stable/2.6.23.3.patch,
  debian/patches/bugfix/all/stable/2.6.23.4.patch,
  debian/patches/bugfix/all/stable/2.6.23.5.patch,
  debian/patches/bugfix/all/stable/2.6.23.6.patch,
  debian/patches/bugfix/all/stable/2.6.23.7.patch,
  debian/patches/bugfix/all/stable/2.6.23.8.patch: Add.
* debian/patches/series/1~experimental.1: Update.

svn path=/dists/trunk/linux-2.6/; revision=9725
This commit is contained in:
Bastian Blank 2007-11-16 22:04:51 +00:00
parent 1541a0b3e6
commit ae74dcceb7
9 changed files with 5427 additions and 1 deletions

128
debian/changelog vendored
View File

@ -111,7 +111,133 @@ linux-2.6 (2.6.23-1~experimental.1) UNRELEASED; urgency=low
* [ia64] Re-enable various unintentionally disabled config options
* Enable hugetlbfs on i386, amd64, sparc64 and powerpc64. Closes: #450939
-- dann frazier <dannf@debian.org> Mon, 12 Nov 2007 22:23:32 -0700
[ Bastian Blank ]
* Add stable release 2.6.23.2:
- BLOCK: Fix bad sharing of tag busy list on queues with shared tag maps
- fix tmpfs BUG and AOP_WRITEPAGE_ACTIVATE
- Fix compat futex hangs.
- sched: keep utime/stime monotonic
- fix the softlockup watchdog to actually work
- splice: fix double kunmap() in vmsplice copy path
- writeback: don't propagate AOP_WRITEPAGE_ACTIVATE
- SLUB: Fix memory leak by not reusing cpu_slab
- HOWTO: update ja_JP/HOWTO with latest changes
- fix param_sysfs_builtin name length check
- param_sysfs_builtin memchr argument fix
- Remove broken ptrace() special-case code from file mapping
- locks: fix possible infinite loop in posix deadlock detection
- lockdep: fix mismatched lockdep_depth/curr_chain_hash
* Add stable release 2.6.23.3:
- revert "x86_64: allocate sparsemem memmap above 4G"
- x86: fix TSC clock source calibration error
- x86 setup: sizeof() is unsigned, unbreak comparisons
- x86 setup: handle boot loaders which set up the stack incorrectly
- x86: fix global_flush_tlb() bug
- xfs: eagerly remove vmap mappings to avoid upsetting Xen
- xen: fix incorrect vcpu_register_vcpu_info hypercall argument
- xen: deal with stale cr3 values when unpinning pagetables
- xen: add batch completion callbacks
- UML - kill subprocesses on exit
- UML - stop using libc asm/user.h
- UML - Fix kernel vs libc symbols clash
- UML - Stop using libc asm/page.h
- POWERPC: Make sure to of_node_get() the result of pci_device_to_OF_node()
- POWERPC: Fix handling of stfiwx math emulation
- MIPS: R1: Fix hazard barriers to make kernels work on R2 also.
- MIPS: MT: Fix bug in multithreaded kernels.
- Fix sparc64 MAP_FIXED handling of framebuffer mmaps
- Fix sparc64 niagara optimized RAID xor asm
* Add stable release 2.6.23.4:
- mac80211: make ieee802_11_parse_elems return void
- mac80211: only honor IW_SCAN_THIS_ESSID in STA, IBSS, and AP modes
- mac80211: honor IW_SCAN_THIS_ESSID in siwscan ioctl
- mac80211: store SSID in sta_bss_list
- mac80211: store channel info in sta_bss_list
- mac80211: reorder association debug output
- ieee80211: fix TKIP QoS bug
- NETFILTER: nf_conntrack_tcp: fix connection reopening
- Fix netlink timeouts.
- Fix crypto_alloc_comp() error checking.
- Fix SET_VLAN_INGRESS_PRIORITY_CMD error return.
- Fix VLAN address syncing.
- Fix endianness bug in U32 classifier.
- Fix TEQL oops.
- Fix error returns in sys_socketpair()
- softmac: fix wext MLME request reason code endianness
- Fix kernel_accept() return handling.
- TCP: Fix size calculation in sk_stream_alloc_pskb
- Fix SKB_WITH_OVERHEAD calculations.
- Fix 9P protocol build
- Fix advertised packet scheduler timer resolution
- Add get_unaligned to ieee80211_get_radiotap_len
- mac80211: Improve sanity checks on injected packets
- mac80211: filter locally-originated multicast frames
* Add stable release 2.6.23.5:
- zd1211rw, fix oops when ejecting install media
- rtl8187: Fix more frag bit checking, rts duration calc
- ipw2100: send WEXT scan events
- zd1201: avoid null ptr access of skb->dev
- sky2: fix power settings on Yukon XL
- sky2: ethtool register reserved area blackout
- sky2: status ring race fix
- skge: XM PHY handling fixes
- Fix L2TP oopses.
- TG3: Fix performance regression on 5705.
- forcedeth: add MCP77 device IDs
- forcedeth msi bugfix
- ehea: 64K page kernel support fix
- libertas: fix endianness breakage
- libertas: more endianness breakage
* Add stable release 2.6.23.6:
- ACPI: suspend: Wrong order of GPE restore.
- ACPI: sleep: Fix GPE suspend cleanup
- libata: backport ATA_FLAG_NO_SRST and ATA_FLAG_ASSUME_ATA, part 2
- libata: backport ATA_FLAG_NO_SRST and ATA_FLAG_ASSUME_ATA
- libata: add HTS542525K9SA00 to NCQ blacklist
- radeon: set the address to access the GART table on the CPU side correctly
- Char: moxa, fix and optimise empty timer
- Char: rocket, fix dynamic_dev tty
- hptiop: avoid buffer overflow when returning sense data
- ide: Fix cs5535 driver accessing beyond array boundary
- ide: Fix siimage driver accessing beyond array boundary
- ide: Add ide_get_paired_drive() helper
- ide: fix serverworks.c UDMA regression
- i4l: fix random freezes with AVM B1 drivers
- i4l: Fix random hard freeze with AVM c4 card
- ALSA: hda-codec - Add array terminator for dmic in STAC codec
- USB: usbserial - fix potential deadlock between write() and IRQ
- USB: add URB_FREE_BUFFER to permissible flags
- USB: mutual exclusion for EHCI init and port resets
- usb-gadget-ether: prevent oops caused by error interrupt race
- USB: remove USB_QUIRK_NO_AUTOSUSPEND
- MSI: Use correct data offset for 32-bit MSI in read_msi_msg()
- md: raid5: fix clearing of biofill operations
- md: fix an unsigned compare to allow creation of bitmaps with v1.0 metadata
- dm: fix thaw_bdev
- dm delay: fix status
- libata: sync NCQ blacklist with upstream
- ALSA: hdsp - Fix zero division
- ALSA: emu10k1 - Fix memory corruption
- ALSA: Fix build error without CONFIG_HAS_DMA
- ALSA: fix selector unit bug affecting some USB speakerphones
- ALSA: hda-codec - Avoid zero NID in line_out_pins[] of STAC codecs
- IB/mthca: Use mmiowb() to avoid firmware commands getting jumbled up
- IB/uverbs: Fix checking of userspace object ownership
- hwmon/lm87: Disable VID when it should be
- hwmon/lm87: Fix a division by zero
- hwmon/w83627hf: Don't assume bank 0
- hwmon/w83627hf: Fix setting fan min right after driver load
- i915: fix vbl swap allocation size.
- POWERPC: Fix platinumfb framebuffer
* Add stable release 2.6.23.7:
- NFS: Fix a writeback race...
- ocfs2: fix write() performance regression
- minixfs: limit minixfs printks on corrupted dir i_size (CVE-2006-6058)
* Add stable release 2.6.23.8:
- wait_task_stopped: Check p->exit_state instead of TASK_TRACED (CVE-2007-5500)
- TCP: Make sure write_queue_from does not begin with NULL ptr (CVE-2007-5501)
-- Bastian Blank <waldi@debian.org> Fri, 16 Nov 2007 23:01:31 +0100
linux-2.6 (2.6.22-6) unstable; urgency=low

View File

@ -0,0 +1,693 @@
diff --git a/Documentation/ja_JP/HOWTO b/Documentation/ja_JP/HOWTO
index 9f08dab..d9d832c 100644
--- a/Documentation/ja_JP/HOWTO
+++ b/Documentation/ja_JP/HOWTO
@@ -1,4 +1,4 @@
-<2D>ソNOTE:
+NOTE:
This is a version of Documentation/HOWTO translated into Japanese.
This document is maintained by Tsugikazu Shibata <tshibata@ab.jp.nec.com>
and the JF Project team <www.linux.or.jp/JF>.
@@ -11,14 +11,14 @@ for non English (read: Japanese) speakers and is not intended as a
fork. So if you have any comments or updates for this file, please try
to update the original English file first.
-Last Updated: 2007/07/18
+Last Updated: 2007/09/23
==================================
縺薙縺ッ縲<EFBDAF>
-linux-2.6.22/Documentation/HOWTO
+linux-2.6.23/Documentation/HOWTO
縺ョ蜥瑚ィウ縺ァ縺吶€<E590B6>
鄙サ險ウ蝗」菴難シ<E99BA3> JF 繝励Ο繧ク繧ァ繧ッ繝<EFBDAF> < http://www.linux.or.jp/JF/ >
-鄙サ險ウ譌・<E8AD8C><EFBDA5> 2007/07/16
+鄙サ險ウ譌・<E8AD8C><EFBDA5> 2007/09/19
鄙サ險ウ閠<EFBDB3><EFBFBD> Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com>
譬。豁」閠<EFBDA3><EFBFBD> 譚セ蛟峨<EFBC86> <nbh--mats at nifty dot com>
蟆乗棊 髮<><E9ABAE>縺輔 (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp>
@@ -27,6 +27,7 @@ linux-2.6.22/Documentation/HOWTO
驥主哨縺輔s (Kenji Noguchi) <tokyo246 at gmail dot com>
豐ウ蜀<EFBDB3><EFBC86> (Takayoshi Kochi) <t-kochi at bq dot jp dot nec dot com>
蟯ゥ譛ャ縺輔s (iwamoto) <iwamoto.kn at ncos dot nec dot co dot jp>
+ 蜀<>伐縺輔 (Satoshi Uchida) <s-uchida at ap dot jp dot nec dot com>
==================================
Linux 繧ォ繝シ繝阪Ν髢狗匱縺ョ繧<EFBDAE>譁ケ
@@ -40,7 +41,7 @@ Linux 繧ォ繝シ繝阪Ν髢狗匱繧ウ繝溘Η繝九ユ繧」縺ィ蜈ア縺ォ豢サ蜍輔☆繧九d繧頑婿繧貞ュヲ縺
謇句勧縺代↓縺ェ繧翫縺吶€<E590B6>
繧ゅ縲√縺ョ繝峨く繝・繝。繝ウ繝医<E7B99D>縺ゥ縺薙°縺悟商縺上↑縺」縺ヲ縺<EFBDA6>◆蝣エ蜷医↓縺ッ縲√縺ョ繝峨く繝・繝。繝ウ
-繝医<E7B99D>€蠕後↓繝ェ繧ケ繝医縺溘Γ繝ウ繝<EFBDB3>リ繝シ縺ォ繝代ャ繝√騾√▲縺ヲ縺上□縺輔<EFBC9E>
+繝医<E7B99D>€蠕後↓繝ェ繧ケ繝医縺溘Γ繝ウ繝<EFBDB3>リ縺ォ繝代ャ繝√騾√▲縺ヲ縺上□縺輔<EFBC9E>
縺ッ縺倥a縺ォ
---------
@@ -59,7 +60,7 @@ Linux 繧ォ繝シ繝阪Ν髢狗匱繧ウ繝溘Η繝九ユ繧」縺ィ蜈ア縺ォ豢サ蜍輔☆繧九d繧頑婿繧貞ュヲ縺
繝阪Ν髢狗匱閠<E58CB1>↓縺ッ蠢<EFBDAF>ヲ√〒縺吶€ゅい繝シ繧ュ繝<EFBDAD>け繝√Ε蜷代¢縺ョ菴弱Ξ繝吶Ν驛ィ蛻<EFBDA8><E89BBB>髢狗匱繧偵☆繧九<E7B9A7>
縺ァ縺ェ縺代縺ー縲<EFBDB0>(縺ゥ繧薙↑繧「繝シ繧ュ繝<EFBDAD>け繝√Ε縺ァ繧<EFBDA7>)繧「繧サ繝ウ繝悶Μ(險ウ豕ィ: 險€<C280>)縺ッ蠢<EFBDAF>ヲ√≠繧<E289A0>
縺セ縺帙縲ゆサ・荳九<E88DB3>譛ャ縺ッ縲€隱槭<E99AB1>蜊∝<E89C8A>縺ェ遏・隴倥菴募ケエ繧ゅ<E7B9A7>邨碁ィ薙↓蜿悶▲縺ヲ莉」繧上繧ゅ<E7B9A7>
-縺ァ縺ッ縺ゅ縺セ縺帙縺後€∝ー代↑縺上→繧ゅΜ繝輔ぃ繝ャ繝ウ繧ケ縺ィ縺励※縺ッ縺<EFBDAF>譛ャ縺ァ縺吶€<E590B6>
+縺ァ縺ッ縺ゅ縺セ縺帙縺後€∝ー代↑縺上→繧ゅΜ繝輔ぃ繝ャ繝ウ繧ケ縺ィ縺励※縺ッ濶ッ縺<EFBDAF>悽縺ァ縺吶€<E590B6>
- "The C Programming Language" by Kernighan and Ritchie [Prentice Hall]
-縲弱<E7B8B2>繝ュ繧ー繝ゥ繝溘Φ繧ー險€隱橸シ」隨ャ2迚医€<E58CBB>(B.W. 繧ォ繝シ繝九ワ繝ウ/D.M. 繝ェ繝<EFBDAA>メ繝シ闡<EFBDBC> 遏ウ逕ー譎エ荵<EFBDB4>ィウ) [蜈ア遶句<E981B6><EFBFBD>
- "Practical C Programming" by Steve Oualline [O'Reilly]
@@ -76,7 +77,7 @@ Linux 繧ォ繝シ繝阪Ν髢狗匱繧ウ繝溘Η繝九ユ繧」縺ィ蜈ア縺ォ豢サ蜍輔☆繧九d繧頑婿繧貞ュヲ縺
縺ィ縺阪←縺阪€√き繝シ繝阪Ν縺後ヤ繝シ繝ォ繝√ぉ繧、繝ウ繧<EFBDB3> C 險€隱樊僑蠑オ縺ォ鄂ョ縺<EFBDAE>※縺<E280BB>蜑肴署縺後←縺<E28690>
縺ェ縺」縺ヲ縺<EFBDA6>縺ョ縺九縺九縺ォ縺上縺薙→縺後≠繧翫€縺溘€∵ョ句ソオ縺ェ縺薙→縺ォ豎コ螳夂噪縺ェ繝ェ繝輔ぃ
繝ャ繝ウ繧ケ縺ッ蟄伜惠縺励縺帙縲よュ蝣ア繧貞セ励縺ォ縺ッ縲“cc 縺ョ info 繝壹<E7B99D>繧ク( info gcc )繧<>
-縺ソ縺ヲ縺上□縺輔<EFBC9E>
+隕九※縺上□縺輔<EFBC9E>
縺ゅ↑縺溘<E7B8BA>譌「蟄倥<E89F84>髢狗匱繧ウ繝溘Η繝九ユ繧」縺ィ荳€邱偵↓菴懈・ュ縺吶譁ケ豕輔蟄ヲ縺シ縺<EFBDBC>→縺励※縺<E280BB><EFBD8B>
縺ィ縺ォ逡呎э縺励※縺上□縺輔縲ゅ◎縺ョ繧ウ繝溘Η繝九ユ繧」縺ッ縲√さ繝シ繝<EFBDBC>ぅ繝ウ繧ー縲√せ繧ソ繧、繝ォ縲<EFBDAB>
@@ -92,7 +93,7 @@ Linux 繧ォ繝シ繝阪Ν髢狗匱繧ウ繝溘Η繝九ユ繧」縺ィ蜈ア縺ォ豢サ蜍輔☆繧九d繧頑婿繧貞ュヲ縺
Linux 繧ォ繝シ繝阪Ν縺ョ繧ス繝シ繧ケ繧ウ繝シ繝峨<E7B99D> GPL 繝ゥ繧、繧サ繝ウ繧ケ縺ョ荳九〒繝ェ繝ェ繝シ繧ケ縺輔縺ヲ縺<EFBDA6>
縺吶€ゅΛ繧、繧サ繝ウ繧ケ縺ョ隧ウ邏ー縺ォ縺、縺<EFBDA4>※縺ッ縲√た繝シ繧ケ繝<EFBDB9>Μ繝シ縺ョ繝。繧、繝ウ繝<EFBDB3>ぅ繝ャ繧ッ繝医Μ縺ォ蟄伜惠
-縺吶OPYING 縺ョ繝輔ぃ繧、繝ォ繧偵∩縺ヲ縺上□縺輔縲ゅ縺励Λ繧、繧サ繝ウ繧ケ縺ォ縺、縺<EFBDA4>※縺輔縺ォ雉ェ
+縺吶OPYING 縺ョ繝輔ぃ繧、繝ォ繧定ヲ九※縺上□縺輔縲ゅ縺励Λ繧、繧サ繝ウ繧ケ縺ォ縺、縺<EFBDA4>※縺輔縺ォ雉ェ
蝠上縺ゅ縺ー縲´inux Kernel 繝。繝シ繝ェ繝ウ繧ー繝ェ繧ケ繝医↓雉ェ蝠上☆繧九<E7B9A7>縺ァ縺ッ縺ェ縺上€√←縺<E28690>
豕募セ句ョカ縺ォ逶ク隲<EFBDB8>縺ヲ縺上□縺輔縲ゅΓ繝シ繝ェ繝ウ繧ー繝ェ繧ケ繝医<E7B99D>莠コ驕斐<E9A995>豕募セ句ョカ縺ァ縺ッ縺ェ縺上€∵ウ慕噪
蝠城。後↓縺、縺<EFBDA4>※縺ッ蠖シ繧峨<E7B9A7>螢ー譏弱<E8AD8F>縺ゅ※縺ォ縺吶縺ケ縺阪〒縺ッ縺ゅ縺セ縺帙<EFBD93>
@@ -109,7 +110,8 @@ Linux 繧ォ繝シ繝阪Ν繧ス繝シ繧ケ繝<EFBDB9>Μ繝シ縺ッ蟷<EFBDAF><EFBFBD><EFBC9E>峇縺ョ繝峨く繝・繝。繝ウ繝医
譁ー縺励繝峨く繝・繝。繝ウ繝医ヵ繧。繧、繝ォ繧りソス蜉<EFBDBD>縺吶縺薙→繧貞匡繧√縺吶€<E590B6>
繧ォ繝シ繝阪Ν縺ョ螟画峩縺後€√き繝シ繝阪Ν縺後Θ繝シ繧カ遨コ髢薙↓蜈ャ髢九縺ヲ縺<EFBDA6>繧、繝ウ繧ソ繝シ繝輔ぉ繧、繧ケ縺ョ
螟画峩繧貞シ輔″襍キ縺薙☆蝣エ蜷医€√◎縺ョ螟画峩繧定ェャ譏弱☆繧九<E7B9A7>繝九Η繧「繝ォ繝壹<E7B99D>繧ク縺ョ繝代ャ繝√<EFBD84><E8ABA0>
-繧偵<E7B9A7>繝九Η繧「繝ォ繝壹<E7B99D>繧ク縺ョ繝。繝ウ繝<EFBDB3>リ mtk-manpages@gmx.net 縺ォ騾√縺薙→繧貞匡繧√縺吶€<E590B6>
+繧偵<E7B9A7>繝九Η繧「繝ォ繝壹<E7B99D>繧ク縺ョ繝。繝ウ繝<EFBDB3>リ mtk-manpages@gmx.net 縺ォ騾√k縺薙→繧貞匡繧√∪
+縺吶€<E590B6>
莉・荳九<E88DB3>繧ォ繝シ繝阪Ν繧ス繝シ繧ケ繝<EFBDB9>Μ繝シ縺ォ蜷ォ縺セ繧後※縺<E280BB>隱ュ繧薙〒縺翫¥縺ケ縺阪ヵ繧。繧、繝ォ縺ョ荳€隕ァ縺ァ
<>-
@@ -117,7 +119,7 @@ Linux 繧ォ繝シ繝阪Ν繧ス繝シ繧ケ繝<EFBDB9>Μ繝シ縺ッ蟷<EFBDAF><EFBFBD><EFBC9E>峇縺ョ繝峨く繝・繝。繝ウ繝医
README
縺薙<E7B8BA>繝輔ぃ繧、繝ォ縺ッ Linux繧ォ繝シ繝阪Ν縺ョ邁。蜊倥↑閭梧勹縺ィ繧ォ繝シ繝阪Ν繧定ィュ螳<EFBDAD>(險ウ豕ィ
configure )縺励€∫函謌<E587BD>(險ウ豕ィ build )縺吶縺溘縺ォ蠢<EFBDAB>ヲ√↑縺薙→縺ッ菴輔°縺梧嶌縺九
- 縺ヲ縺<EFBDA6>縺吶€ゅき繝シ繝阪Ν縺ォ髢「縺励※蛻昴縺ヲ縺ョ莠コ縺ッ縺薙縺九繧ケ繧ソ繝シ繝医☆繧九→繧医縺ァ
+ 縺ヲ縺<EFBDA6>縺吶€ゅき繝シ繝阪Ν縺ォ髢「縺励※蛻昴縺ヲ縺ョ莠コ縺ッ縺薙縺九繧ケ繧ソ繝シ繝医☆繧九→濶ッ縺<EFBDAF>
縺励<EFBD87>€<EFBFBD>
Documentation/Changes
@@ -128,7 +130,7 @@ Linux 繧ォ繝シ繝阪Ν繧ス繝シ繧ケ繝<EFBDB9>Μ繝シ縺ッ蟷<EFBDAF><EFBFBD><EFBC9E>峇縺ョ繝峨く繝・繝。繝ウ繝医
Documentation/CodingStyle
縺薙l縺ッ Linux 繧ォ繝シ繝阪Ν縺ョ繧ウ繝シ繝<EFBDBC>ぅ繝ウ繧ー繧ケ繧ソ繧、繝ォ縺ィ閭梧勹縺ォ縺ゅ<EFBD8B>罰繧定ィ倩ソー
縺励※縺<E280BB>縺吶€<C280>縺ヲ縺ョ譁ー縺励繧ウ繝シ繝峨<E7B99D>縺薙<E7B8BA>繝峨く繝・繝。繝ウ繝医↓縺ゅ繧ャ繧、繝峨Λ繧、繝ウ
- 縺ォ蠕薙▲縺ヲ縺<EFBDA6>縺薙→繧呈悄蠕<E68284>繧後※縺<E280BB>縺吶€ょ、ァ驛ィ蛻<EFBDA8><E89BBB>繝。繝ウ繝<EFBDB3>リ繝シ縺ッ縺薙繧峨<E7B9A7>繝ォ繝シ
+ 縺ォ蠕薙▲縺ヲ縺<EFBDA6>縺薙→繧呈悄蠕<E68284>繧後※縺<E280BB>縺吶€ょ、ァ驛ィ蛻<EFBDA8><E89BBB>繝。繝ウ繝<EFBDB3>リ縺ッ縺薙繧峨<E7B9A7>繝ォ繝シ
繝ォ縺ォ蠕薙▲縺ヲ縺<EFBDA6>繧ゅ<E7B9A7><EFBFBD>縺代蜿励¢莉倥¢縲∝、壹¥縺ョ莠コ縺ッ豁」縺励繧ケ繧ソ繧、繝ォ縺ョ繧ウ繝シ繝<EFBDBC>
<>縺代繝ャ繝薙Η繝シ縺励縺吶€<E590B6>
@@ -168,16 +170,16 @@ Linux 繧ォ繝シ繝阪Ν繧ス繝シ繧ケ繝<EFBDB9>Μ繝シ縺ッ蟷<EFBDAF><EFBFBD><EFBC9E>峇縺ョ繝峨く繝・繝。繝ウ繝医
謾ッ謠エ縺励※縺上□縺輔<EFBC9E>
Documentation/ManagementStyle
- 縺薙<E7B8BA>繝峨く繝・繝。繝ウ繝医<E7B99D> Linux 繧ォ繝シ繝阪Ν縺ョ繝。繝ウ繝<EFBDB3>リ繝シ驕斐縺ゥ縺<EFBDA9>。悟虚縺吶縺九€<E4B99D>
+ 縺薙<E7B8BA>繝峨く繝・繝。繝ウ繝医<E7B99D> Linux 繧ォ繝シ繝阪Ν縺ョ繝。繝ウ繝<EFBDB3>リ驕斐縺ゥ縺<EFBDA9>。悟虚縺吶縺九€<E4B99D>
蠖シ繧峨<E7B9A7>謇区ウ輔<EFBDB3>閭梧勹縺ォ縺ゅ蜈ア譛峨繧後※縺<E280BB>邊セ逾槭↓縺、縺<EFBDA4>※險倩ソー縺励※縺<E280BB>縺吶€
繧後<E7B9A7>繧ォ繝シ繝阪Ν髢狗匱縺ョ蛻晏ソ<E6998F>€<EFBFBD>↑繧会シ医縺励¥縺ッ縲∝腰縺ォ闊亥袖縺後≠繧九□縺代<E7B8BA>莠コ縺ァ繧ゑシ<E38291>
- 驥崎ヲ√〒縺吶€ゅ↑縺懊↑繧峨縺ョ繝峨く繝・繝。繝ウ繝医<E7B99D>縲√き繝シ繝阪Ν繝。繝ウ繝<EFBDB3>リ繝シ驕斐<E9A995>迢ャ迚ケ縺ェ
+ 驥崎ヲ√〒縺吶€ゅ↑縺懊↑繧峨縺ョ繝峨く繝・繝。繝ウ繝医<E7B99D>縲√き繝シ繝阪Ν繝。繝ウ繝<EFBDB3>リ驕斐<E9A995>迢ャ迚ケ縺ェ
陦悟虚縺ォ縺、縺<EFBDA4>※縺ョ螟壹¥縺ョ隱、隗」繧<EFBDA3>キキ荵ア繧定ァ」豸医☆繧九°繧峨〒縺吶€<E590B6>
Documentation/stable_kernel_rules.txt
縺薙<E7B8BA>繝輔ぃ繧、繝ォ縺ッ縺ゥ縺ョ繧医≧縺ォ stable 繧ォ繝シ繝阪Ν縺ョ繝ェ繝ェ繝シ繧ケ縺瑚。後繧後縺九<E7B8BA>繝ォ繝シ
繝ォ縺瑚ィ倩ソー縺輔縺ヲ縺<EFBDA6>縺吶€ゅ◎縺励※縺薙繧峨<E7B9A7>繝ェ繝ェ繝シ繧ケ縺ョ荳ュ縺ョ縺ゥ縺薙°縺ァ螟画峩繧貞叙
- 繧雁<E7B9A7>繧後※繧ゅ<EFBD89>◆縺<E29786><E7B8BA>エ蜷医↓菴輔縺吶縺ー縺<EFBDB0>縺九遉コ縺輔縺ヲ縺<EFBDA6>縺吶€<E590B6>
+ 繧雁<E7B9A7>繧後※繧ゅ<EFBD89>◆縺<E29786><E7B8BA>エ蜷医↓菴輔縺吶縺ー濶ッ縺<EFBDAF>°縺檎、コ縺輔縺ヲ縺<EFBDA6>縺吶€<E590B6>
Documentation/kernel-docs.txt
€€繧ォ繝シ繝阪Ν髢狗匱縺ォ莉倬囂縺吶螟夜Κ繝峨く繝・繝。繝ウ繝医<E7B99D>繝ェ繧ケ繝医〒縺吶€縺励≠縺ェ縺溘
@@ -218,9 +220,9 @@ web 繧オ繧、繝医↓縺ッ縲√さ繝シ繝峨<E7B99D>讒区<E8AE92>縲√し繝悶す繧ケ繝<EFBDB9>Β縲∫樟蝨ィ蟄伜惠縺吶
縺薙縺ォ縺ッ縲√縺溘€√き繝シ繝阪Ν縺ョ繧ウ繝ウ繝代う繝ォ縺ョ繧<EFBDAE>譁ケ繧<EFBDB9>ヱ繝<E383B1>メ縺ョ蠖薙※譁ケ縺ェ縺ゥ縺ョ髢捺磁
<>↑蝓コ譛ャ諠<EFBDAC><E8ABA0>ア繧りィ倩ソー縺輔縺ヲ縺<EFBDA6>縺吶€<E590B6>
-縺ゅ↑縺溘縺ゥ縺薙°繧峨せ繧ソ繝シ繝医縺ヲ繧医縺九縺九縺ェ縺<EFBDAA>´inux 繧ォ繝シ繝阪Ν髢狗匱繧ウ繝溘Η
+縺ゅ↑縺溘縺ゥ縺薙°繧峨せ繧ソ繝シ繝医縺ヲ濶ッ縺<EFBDAF>°繧上°繧峨↑縺<E28691>´inux 繧ォ繝シ繝阪Ν髢狗匱繧ウ繝溘Η
繝九ユ繧」縺ォ蜿ょ刈縺励※菴輔°縺吶縺薙→繧偵縺後縺ヲ縺<EFBDA6>蝣エ蜷医↓縺ッ縲´inux kernel
-Janitor's 繝励Ο繧ク繧ァ繧ッ繝医↓縺<E28693>¢縺ー繧医縺ァ縺励<EFBD87> -
+Janitor's 繝励Ο繧ク繧ァ繧ッ繝医↓縺<E28693>¢縺ー濶ッ縺<EFBDAF>〒縺励<EFBD87> -
http://janitor.kernelnewbies.org/
縺薙縺ッ縺昴<E7B8BA>繧医≧縺ェ繧ケ繧ソ繝シ繝医縺吶縺ョ縺ォ縺<EFBDAB>▲縺ヲ縺、縺代<E7B8BA>蝣エ謇€縺ァ縺吶€縺薙↓縺ッ縲<EFBDAF>
Linux 繧ォ繝シ繝阪Ν繧ス繝シ繧ケ繝<EFBDB9>Μ繝シ縺ョ荳ュ縺ォ蜷ォ縺セ繧後縲√″繧後縺ォ縺励€∽ソョ豁」縺励↑縺代縺ー縺ェ
@@ -243,7 +245,7 @@ Linux 繧ォ繝シ繝阪Ν繧ス繝シ繧ケ繝<EFBDB9>Μ繝シ縺ョ荳ュ縺ォ蜷ォ縺セ繧後縲√″繧後縺ォ縺励€∽ソ
閾ェ蟾ア蜿ら<E89CBF>譁ケ蠑上〒縲∫エ「蠑輔縺、縺<EFBDA4>◆ web 蠖「蠑上〒縲√た繝シ繧ケ繧ウ繝シ繝峨蜿ら<E89CBF>縺吶縺薙→縺<E28692>
縺ァ縺阪縺吶€縺ョ譛€譁ー縺ョ邏<EFBDAE>譎エ縺励繧ォ繝シ繝阪Ν繧ウ繝シ繝峨<E7B99D>繝ェ繝昴ず繝医Μ縺ッ莉・荳九〒隕九▽縺九
縺セ縺<EFBDBE>-
- http://sosdg.org/~coywolf/lxr/
+ http://sosdg.org/~qiyong/lxr/
髢狗匱繝励Ο繧サ繧ケ
-----------------------
@@ -265,9 +267,9 @@ Linux 繧ォ繝シ繝阪Ν縺ョ髢狗匱繝励Ο繧サ繧ケ縺ッ迴セ蝨ィ蟷セ縺、縺九<E7B8BA>逡ー縺ェ繧九Γ繧、繝ウ繧
莉・荳九<E88DB3>縺ィ縺翫-
- 譁ー縺励繧ォ繝シ繝阪Ν縺後Μ繝ェ繝シ繧ケ縺輔縺溽峩蠕後↓縲<E28693>2騾ア髢薙<E9ABA2>迚ケ蛻・譛滄俣縺瑚ィュ縺代繧後€<E5BE8C>
- 縺薙<E7B8BA>譛滄俣荳ュ縺ォ縲√Γ繝ウ繝<EFBDB3>リ繝シ驕斐<E9A995> Linus 縺ォ螟ァ縺阪↑蟾ョ蛻<EFBDAE>騾√縺薙→縺後〒縺阪
- 縺吶€縺ョ繧医≧縺ェ蟾ョ蛻<EFBDAE><E89BBB>騾壼クク -mm 繧ォ繝シ繝阪Ν縺ォ謨ー騾ア髢灘性縺セ繧後※縺阪◆繝代ャ繝√〒
- 縺吶€<E590B6> 螟ァ縺阪↑螟画峩縺ッ git(繧ォ繝シ繝阪Ν縺ョ繧ス繝シ繧ケ邂。逅<EFBDA1>ヤ繝シ繝ォ縲∬ゥウ邏ー縺ッ
+ 縺薙<E7B8BA>譛滄俣荳ュ縺ォ縲√Γ繝ウ繝<EFBDB3>リ驕斐<E9A995> Linus 縺ォ螟ァ縺阪↑蟾ョ蛻<EFBDAE>騾√縺薙→縺後〒縺阪縺吶€<E590B6>
+ 縺薙<E7B8BA>繧医≧縺ェ蟾ョ蛻<EFBDAE><E89BBB>騾壼クク -mm 繧ォ繝シ繝阪Ν縺ォ謨ー騾ア髢灘性縺セ繧後※縺阪◆繝代ャ繝√〒縺吶€<E590B6>
+ 螟ァ縺阪↑螟画峩縺ッ git(繧ォ繝シ繝阪Ν縺ョ繧ス繝シ繧ケ邂。逅<EFBDA1>ヤ繝シ繝ォ縲∬ゥウ邏ー縺ッ
http://git.or.cz/ 蜿ら<E89CBF>) 繧剃スソ縺」縺ヲ騾√縺ョ縺悟・ス縺セ縺励<EFBC9E>譁ケ縺ァ縺吶縲√ヱ繝<E383B1>
繝√ヵ繧。繧、繝ォ縺ョ蠖「蠑上<E8A091>縺セ縺セ騾√縺ョ縺ァ繧ょ香蛻<E9A699>〒縺吶€<E590B6>
@@ -285,6 +287,10 @@ Linux 繧ォ繝シ繝阪Ν縺ョ髢狗匱繝励Ο繧サ繧ケ縺ッ迴セ蝨ィ蟷セ縺、縺九<E7B8BA>逡ー縺ェ繧九Γ繧、繝ウ繧
縺ォ螳牙ョ壹縺溽憾諷九↓縺ゅ縺ィ蛻、譁ュ縺励◆縺ィ縺阪↓繝ェ繝ェ繝シ繧ケ縺輔縺セ縺吶€ら岼讓吶<E8AE93>豈朱€ア譁ー
縺励> -rc 繧ォ繝シ繝阪Ν繧偵Μ繝ェ繝シ繧ケ縺吶縺薙→縺ァ縺吶€<E590B6>
+ - 莉・荳九<E88DB3> URL 縺ァ蜷<EFBDA7> -rc 繝ェ繝ェ繝シ繧ケ縺ォ蟄伜惠縺吶譌「遏・縺ョ蠕梧綾繧雁撫鬘後<E9AC98>繝ェ繧ケ繝<EFBDB9>
+ 縺瑚ソス霍。縺輔縺セ縺<EFBDBE>-
+ http://kernelnewbies.org/known_regressions
+
- 縺薙<E7B8BA>繝励Ο繧サ繧ケ縺ッ繧ォ繝シ繝阪Ν<CE9D> 縲梧コ門縺後〒縺阪◆縲阪→閠<E28692>∴繧峨繧九縺ァ邯咏カ壹縺セ
縺吶€縺ョ繝励Ο繧サ繧ケ縺ッ縺<EFBDAF><EFBFBD>◆縺<E29786> 6騾ア髢鍋カ咏カ壹縺セ縺吶€<E590B6>
@@ -331,8 +337,8 @@ Andrew 縺ッ蛟句挨縺ョ繧オ繝悶す繧ケ繝<EFBDB9>Β繧ォ繝シ繝阪Ν<CE9D>Μ繝シ縺ィ繝代ャ繝√蜈ィ縺ヲ<E7B8BA>
linux-kernel 繝。繝シ繝ェ繝ウ繧ー繝ェ繧ケ繝医〒蜿朱寔縺輔l縺溷、壽焚縺ョ繝代ャ繝√→蜷梧凾縺ォ荳€縺、縺ォ縺セ
縺ィ繧√縺吶€<E590B6>
縺薙<E7B8BA><EFBFBD>Μ繝シ縺ッ譁ー讖溯<E8AE96>縺ィ繝代ャ繝√讀懆ィシ縺輔繧句<E7B9A7>エ縺ィ縺ェ繧翫縺吶€ゅ≠繧区悄髢薙<E9ABA2>髢薙ヱ繝<E383B1>
-縺<> -mm 縺ォ蜈・縺」縺ヲ萓。蛟、繧定ィシ譏弱繧後◆繧峨€、ndrew 繧<>し繝悶す繧ケ繝<EFBDB9>Β繝。繝ウ繝<EFBDB3>リ縺後€√Γ
-繧、繝ウ繝ゥ繧、繝ウ縺ク蜈・繧後k繧医≧縺ォ Linus 縺ォ繝励ャ繧キ繝・縺励縺吶€<E590B6>
+縺<> -mm 縺ォ蜈・縺」縺ヲ萓。蛟、繧定ィシ譏弱繧後◆繧峨€、ndrew 繧<>し繝悶す繧ケ繝<EFBDB9>Β繝。繝ウ繝<EFBDB3>リ縺後€<E5BE8C>
+繝。繧、繝ウ繝ゥ繧、繝ウ縺ク蜈・繧後k繧医≧縺ォ Linus 縺ォ繝励ャ繧キ繝・縺励縺吶€<E590B6>
繝。繧、繝ウ繧ォ繝シ繝阪Ν<CE9D>Μ繝シ縺ォ蜷ォ繧√縺溘縺ォ Linus 縺ォ騾√k蜑阪↓縲√☆縺ケ縺ヲ縺ョ譁ー縺励>繝代ャ
繝√′ -mm 繝<>Μ繝シ縺ァ繝<EFBDA7>せ繝医繧後縺薙→縺悟シキ縺乗耳螂ィ縺輔縺セ縺吶€<E590B6>
@@ -460,7 +466,7 @@ MAINTAINERS 繝輔ぃ繧、繝ォ縺ォ繝ェ繧ケ繝医縺ゅ縺セ縺吶<E7B8BA>縺ァ蜿ら<E89CBF>縺励※縺上□縺輔<E7B8BA>
縺帙s-
蠖シ繧峨<E7B9A7>縺ゅ↑縺溘<E7B8BA>繝代ャ繝√<E7B99D>陦梧ッ弱↓繧ウ繝。繝ウ繝医蜈・繧後◆縺<E29786><E7B8BA>縺ァ縲√◎縺ョ縺溘縺ォ縺ッ縺昴≧縺<E289A7>
繧九縺九≠繧翫縺帙縲ゅ≠縺ェ縺溘<E7B8BA>繝。繝シ繝ォ繝励Ο繧ー繝ゥ繝<EFBDA9>縺檎ゥコ逋ス繧<EFBDBD>ち繝悶蝨ァ邵ョ縺励↑縺<E28691><EFBD88>
-縺ォ遒コ隱阪縺滓婿縺後<EFBC9E>〒縺吶€よ怙蛻昴<E89BBB>濶ッ縺<EFBDAF>ユ繧ケ繝医→縺励※縺ッ縲∬<E7B8B2><EFBFBD>↓繝。繝シ繝ォ繧帝€√▲縺ヲ
+縺ォ遒コ隱阪縺滓婿縺瑚憶縺<E686B6>〒縺吶€よ怙蛻昴<E89BBB>濶ッ縺<EFBDAF>ユ繧ケ繝医→縺励※縺ッ縲∬<E7B8B2><EFBFBD>↓繝。繝シ繝ォ繧帝€√▲縺ヲ
縺ソ縺ヲ縲√◎縺ョ繝代ャ繝√閾ェ蛻<EFBDAA>〒蠖薙※縺ヲ縺ソ繧九縺ィ縺ァ縺吶€縺励◎繧後<E280B2>縺剰。後°縺ェ縺<EFBDAA>
繧峨€√≠縺ェ縺溘<E7B8BA>繝。繝シ繝ォ繝励Ο繧ー繝ゥ繝<EFBDA9>繧堤峩縺励※繧ゅ<EFBD89>°縲∵ュ」縺励¥蜍輔¥繧医≧縺ォ螟峨∴繧九∋
縺阪〒縺吶€<E590B6>
@@ -507,14 +513,14 @@ MAINTAINERS 繝輔ぃ繧、繝ォ縺ォ繝ェ繧ケ繝医縺ゅ縺セ縺吶<E7B8BA>縺ァ蜿ら<E89CBF>縺励※縺上□縺輔<E7B8BA>
縺ィ繧よ勸騾壹<E9A8BE>縺薙→縺ァ縺吶€繧後<E7B9A7>縺ゅ↑縺溘<E7B8BA>繝代ャ繝√蜿励¢蜈・繧後繧後↑縺<E28691>→縺<E28692>≧縺薙→縺ァ
縺ッ *縺ゅj縺セ縺帙s*縲√◎縺励※縺ゅ↑縺溯<E7B8BA>霄ォ縺ォ蜿榊ッセ縺吶縺薙→繧呈э蜻ウ縺吶縺ョ縺ァ繧<EFBDA7> *縺ゅj縺セ
縺帙s*縲ょ腰縺ォ閾ェ蛻<EFBDAA><E89BBB>繝代ャ繝√↓蟇セ縺励※謖<E280BB>遭縺輔縺溷撫鬘後蜈ィ縺ヲ菫ョ豁」縺励※蜀埼€√☆繧後<E7B9A7>
-縺<>縺ョ縺ァ縺吶€<E590B6>
+濶ッ縺<EFBDAF><E7B8BA>縺ァ縺吶€<E590B6>
繧ォ繝シ繝阪Ν繧ウ繝溘Η繝九ユ繧」縺ィ莨∵・ュ邨<EFBDAD>ケ斐<EFBDB9>縺。縺後
-----------------------------------------------------------------
繧ォ繝シ繝阪Ν繧ウ繝溘Η繝九ユ繧」縺ッ螟ァ驛ィ蛻<EFBDA8><E89BBB>莨晉オア逧<EFBDB1>↑莨夂、セ縺ョ髢狗匱迺ー蠅<EFBDB0>→縺ッ逡ー縺」縺溘繧頑婿縺ァ
-蜍輔縺ヲ縺<EFBDA6>縺吶€ゆサ・荳九<E88DB3>蝠城。後驕ソ縺代縺溘縺ォ縺ァ縺阪縺ィ繧医縺薙→縺ョ縺ョ繝ェ繧ケ繝医〒縺<E38092>-
+蜍輔縺ヲ縺<EFBDA6>縺吶€ゆサ・荳九<E88DB3>蝠城。後驕ソ縺代縺溘縺ォ縺ァ縺阪縺ィ濶ッ縺<EFBDAF>縺ィ縺ョ繝ェ繧ケ繝医〒縺<E38092>-
縺ゅ↑縺溘<E7B8BA>謠先。医☆繧句、画峩縺ォ縺、縺<EFBDA4>※險€<C280>→縺阪<E7B8BA><EFBFBD><E288AA>€<C280>婿<EFBFBD><E5A9BF>
@@ -525,7 +531,7 @@ MAINTAINERS 繝輔ぃ繧、繝ォ縺ォ繝ェ繧ケ繝医縺ゅ縺セ縺吶<E7B8BA>縺ァ蜿ら<E89CBF>縺励※縺上□縺輔<E7B8BA>
- "莉・荳九<E88DB3>€騾」縺ョ蟆上縺ェ繝代ャ繝∫セ、縺ァ縺吶..."
- "縺薙縺ッ蜈ク蝙狗噪縺ェ繝槭す繝ウ縺ァ縺ョ諤ァ閭ス繧貞髄荳翫縺帙<E288AA>.."
- 繧<>縺滓婿縺後<EFBC9E>が縺<E3818C>€<C280>婿<EFBFBD><E5A9BF>
+ 繧<>縺滓婿縺瑚憶縺<E686B6>が縺<E3818C>€<C280>婿<EFBFBD><E5A9BF>
- 縺薙<E7B8BA><EFBFBD>譁ケ縺ァ AIX/ptx/Solaris 縺ァ縺ッ縺ァ縺阪◆縺ョ縺ァ縲√〒縺阪k縺ッ縺壹□
- 遘√<E98198>縺薙<EFBD8C>20蟷エ繧ゅ<E7B9A7>髢薙縺」縺ヲ縺阪◆縲√□縺九
@@ -575,10 +581,10 @@ Linux 繧ォ繝シ繝阪Ν繧ウ繝溘Η繝九ユ繧」縺ッ縲∽ク€蠎ヲ縺ォ螟ァ驥上<E9A9A5>繧ウ繝シ繝峨<E7B99D>蝪翫
1) 蟆上<EFBC86>ヱ繝<E383B1>メ縺ッ縺ゅ↑縺溘<E7B8BA>繝代ャ繝√驕ゥ逕ィ縺輔繧玖ヲ玖セシ縺ソ繧貞、ァ縺阪¥縺励縺吶€√き繝シ
繝阪Ν縺ョ莠コ驕斐<E9A995>繝代ャ繝√豁」縺励縺九←縺<E28690>°繧堤「コ隱阪☆繧区凾髢薙蜉エ蜉帙縺九¢縺ェ縺<EFBDAA>°
- 繧峨〒縺吶€<E590B6>5陦後<E999A6>繝代ャ繝√<E7B99D>繝。繝ウ繝<EFBDB3>リ縺後◆縺」縺<EFBDA3>1遘定ヲ九<EFBD8B>縺代〒驕ゥ逕ィ縺ァ縺阪縺吶€
- 縺九<EFBCA0>500陦後<E999A6>繝代ャ繝√<E7B99D>縲∵ュ」縺励縺薙→繧偵Ξ繝薙Η繝シ縺吶縺ョ縺ォ謨ー譎る俣縺九°繧九°繧<C2B0>
- 縺励l縺セ縺帙s(譎る俣縺ッ繝代ャ繝√<E7B99D>繧オ繧、繧コ縺ェ縺ゥ縺ォ繧医<EFBD8A>焚髢「謨ー縺ォ豈比セ九縺ヲ縺九°繧翫
- 縺<>)
+ 繧峨〒縺吶€<E590B6>5陦後<E999A6>繝代ャ繝√<E7B99D>繝。繝ウ繝<EFBDB3>リ縺後◆縺」縺<EFBDA3>1遘定ヲ九<EFBD8B>縺代〒驕ゥ逕ィ縺ァ縺阪縺吶€<E590B6>
+ 縺励°縺励€<E58AB1>500陦後<E999A6>繝代ャ繝√<E7B99D>縲∵ュ」縺励縺薙→繧偵Ξ繝薙Η繝シ縺吶縺ョ縺ォ謨ー譎る俣縺九°繧九°
+ 繧ゅ@繧後∪縺帙s(譎る俣縺ッ繝代ャ繝√<E7B99D>繧オ繧、繧コ縺ェ縺ゥ縺ォ繧医<EFBD8A>焚髢「謨ー縺ォ豈比セ九縺ヲ縺九°繧<C2B0>
+ 縺セ縺<EFBDBE>)
蟆上<EFBC86>ヱ繝<E383B1>メ縺ッ菴輔°縺ゅ▲縺溘→縺阪↓繝<E28693>ヰ繝<E383B0>げ繧ゅ→縺ヲ繧らー。蜊倥↓縺ェ繧翫縺吶€ゅヱ繝<E383B1>
繝√1蛟<31>1蛟句叙繧企勁縺上<E7B8BA>縺ッ縲√→縺ヲ繧ょ、ァ縺阪↑繝代ャ繝√蠖薙※縺溷セ後↓(縺九▽縲∽ス輔°縺<C2B0>
@@ -587,23 +593,23 @@ Linux 繧ォ繝シ繝阪Ν繧ウ繝溘Η繝九ユ繧」縺ッ縲∽ク€蠎ヲ縺ォ螟ァ驥上<E9A9A5>繧ウ繝シ繝峨<E7B99D>蝪翫
2) 蟆上<EFBC86>ヱ繝<E383B1>メ繧帝€<EFBD8B>縺代〒縺ェ縺上€<E4B88A>€縺セ縺医↓縲∵嶌縺咲峩縺励※縲√す繝ウ繝励Ν縺ォ縺<EFBDAB>
<>(繧ゅ縺上<E7B8BA>縲∝腰縺ォ鬆<EFBDAB>分繧貞、峨∴繧九□縺代〒繧<E38092>)縺薙→繧ゅ€√→縺ヲ繧る㍾隕√〒縺吶€<E590B6>
-莉・荳九<E88DB3>繧ォ繝シ繝阪Ν髢狗匱閠<E58CB1><E996A0> Al Viro 縺ョ縺溘→縺郁ゥア縺励〒縺呻シ<E591BB>
+莉・荳九<E88DB3>繧ォ繝シ繝阪Ν髢狗匱閠<E58CB1><E996A0> Al Viro 縺ョ縺溘→縺郁ゥア縺ァ縺呻シ<E591BB>
"逕溷セ偵<EFBDBE>謨ー蟄ヲ縺ョ螳ソ鬘後謗。轤ケ縺吶蜈育函縺ョ縺薙→繧定€<E5AE9A>∴縺ヲ縺ソ縺ヲ縺上□縺輔縲∝<E7B8B2>
- 逕溘<E98095>逕溷セ偵隗」縺ォ蛻ー驕斐☆繧九縺ァ縺ョ隧ヲ陦碁険隱、繧偵∩縺溘縺ィ縺ッ諤昴縺ェ縺<EFBDAA>〒縺励
- 縺<>€<C280>逕溘<E98095>邁。貎斐↑譛€鬮倥<E9ACAE>隗」繧偵∩縺溘縺ョ縺ァ縺吶€り憶縺<E686B6>函蠕偵<E8A095>縺薙繧堤衍縺」縺ヲ
+ 逕溘<E98095>逕溷セ偵隗」縺ォ蛻ー驕斐☆繧九縺ァ縺ョ隧ヲ陦碁険隱、繧定ヲ九◆縺<E29786>→縺ッ諤昴縺ェ縺<EFBDAA>〒縺励
+ 縺<>€<C280>逕溘<E98095>邁。貎斐↑譛€鬮倥<E9ACAE>隗」繧定ヲ九◆縺<E29786><E7B8BA>縺ァ縺吶€り憶縺<E686B6>函蠕偵<E8A095>縺薙繧堤衍縺」縺ヲ
縺翫縲√◎縺励※譛€邨りァ」縺ョ蜑阪<E89C91>荳ュ髢謎ス懈・ュ繧呈署蜃コ縺吶縺薙→縺ッ豎コ縺励※縺ェ縺<EFBDAA><E7B8BA>縺ァ
<>"
- 繧ォ繝シ繝阪Ν髢狗匱縺ァ繧ゅ繧後<E7B9A7>蜷後§縺ァ縺吶€ゅΓ繝ウ繝<EFBDB3>リ繝シ驕斐→繝ャ繝薙Η繝シ繧「驕斐<E9A995><EFBFBD>
- 蝠城。後隗」豎コ縺吶隗」縺ョ閭悟セ後↓縺ェ繧区€€<E69981><C280>繝ュ繧サ繧ケ繧偵∩縺溘縺ィ縺ッ諤昴縺セ縺帙<EFBD93>
- 蠖シ繧峨<E7B9A7>蜊倡エ斐〒縺ゅ<EFBC8A>°縺ェ隗」豎コ譁ケ豕輔縺ソ縺溘縺ョ縺ァ縺吶€<E590B6>
+ 繧ォ繝シ繝阪Ν髢狗匱縺ァ繧ゅ繧後<E7B9A7>蜷後§縺ァ縺吶€ゅΓ繝ウ繝<EFBDB3>リ驕斐→繝ャ繝薙Η繝シ繧「驕斐<E9A995><EFBFBD>
+ 蝠城。後隗」豎コ縺吶隗」縺ョ閭悟セ後↓縺ェ繧区€€<E69981><C280>繝ュ繧サ繧ケ繧定ヲ九◆縺<E29786>→縺ッ諤昴縺セ縺帙<EFBD93>
+ 蠖シ繧峨<E7B9A7>蜊倡エ斐〒縺ゅ<EFBC8A>°縺ェ隗」豎コ譁ケ豕輔隕九◆縺<E29786><E7B8BA>縺ァ縺吶€<E590B6>
縺ゅ<EFBC8A>°縺ェ隗」繧定ェャ譏弱☆繧九<E7B9A7>縺ィ縲√さ繝溘Η繝九ユ繧」縺ィ蜈ア縺ォ莉穂コ九縺励€∵悴隗」豎コ縺ョ莉穂コ九
隴ー隲悶☆繧九縺ィ縺ョ繝舌Λ繝ウ繧ケ繧偵く繝シ繝励☆繧九<E7B9A7>縺ッ髮」縺励縺九縺励縺セ縺帙<EFBD93>
縺ァ縺吶°繧峨€<E5B3A8>幕逋コ繝励Ο繧サ繧ケ縺ョ譌ゥ譛滓ョオ髫弱〒謾ケ蝟<EFBDB9><E89D9F>縺溘縺ョ繝輔ぅ繝シ繝峨ヰ繝<E383B0>け繧偵繧峨≧繧<E289A7>
-縺<>↓縺吶縺ョ繧ゅ<EFBC9E>〒縺吶縲∝、画峩轤ケ繧貞ー上<EFBC86>Κ<CE9A>↓蛻<E28693>牡縺励※蜈ィ菴薙〒縺ッ縺セ縺<EFBDBE>螳梧<E89EB3><EFBFBD>
-縺ヲ縺<EFBDA6>↑縺<E28691>サ穂コ九(驛ィ蛻<EFBDA8>噪縺ォ)蜿悶霎シ繧薙〒繧ゅ縺医繧医≧縺ォ縺吶縺薙→繧ゅ<EFBC9E>縺ィ縺ァ縺吶€<E590B6>
+縺<>↓縺吶縺ョ繧り憶縺<E686B6>〒縺吶縲∝、画峩轤ケ繧貞ー上<EFBC86>Κ<CE9A>↓蛻<E28693>牡縺励※蜈ィ菴薙〒縺ッ縺セ縺<EFBDBE>螳梧<E89EB3><EFBFBD>
+縺ヲ縺<EFBDA6>↑縺<E28691>サ穂コ九(驛ィ蛻<EFBDA8>噪縺ォ)蜿悶霎シ繧薙〒繧ゅ縺医繧医≧縺ォ縺吶縺薙→繧り憶縺<E686B6>縺ィ縺ァ縺吶€<E590B6>
縺セ縺溘€√〒縺堺ク翫縺」縺ヲ縺<EFBDA6>↑縺<E28691>縺ョ繧<EFBDAE>€<EFBFBD>"蟆<>擂逶エ縺<EFBDB4>" 繧医≧縺ェ繝代ャ繝√縲∵悽豬√↓蜷ォ繧<EFBDAB>
縺ヲ繧ゅ<EFBD89><EFBD88>↓騾√▲縺ヲ繧ゅ€√◎繧後<E7B9A7>蜿励¢莉倥¢繧峨縺ェ縺<EFBDAA>縺ィ繧堤炊隗」縺励※縺上□縺輔<EFBC9E>
@@ -629,7 +635,7 @@ Linux 繧ォ繝シ繝阪Ν繧ウ繝溘Η繝九ユ繧」縺ッ縲∽ク€蠎ヲ縺ォ螟ァ驥上<E9A9A5>繧ウ繝シ繝峨<E7B99D>蝪翫
- 繝<>せ繝育オ先棡
縺薙縺ォ縺、縺<EFBDA4>※蜈ィ縺ヲ縺後←縺ョ繧医≧縺ォ縺ゅ縺ケ縺阪°縺ォ縺、縺<EFBDA4>※縺ョ隧ウ邏ー縺ッ縲∽サ・荳九<E88DB3>繝峨く繝・繝。
-繝ウ繝医<E7B99D> ChangeLog 繧サ繧ッ繧キ繝ァ繝ウ繧偵∩縺ヲ縺上□縺輔>-
+繝ウ繝医<E7B99D> ChangeLog 繧サ繧ッ繧キ繝ァ繝ウ繧定ヲ九※縺上□縺輔>-
"The Perfect Patch"
http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt
diff --git a/Makefile b/Makefile
index c244a02..c6d545c 100644
diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c
index ed39313..026cf24 100644
--- a/block/ll_rw_blk.c
+++ b/block/ll_rw_blk.c
@@ -819,7 +819,6 @@ static int __blk_free_tags(struct blk_queue_tag *bqt)
retval = atomic_dec_and_test(&bqt->refcnt);
if (retval) {
BUG_ON(bqt->busy);
- BUG_ON(!list_empty(&bqt->busy_list));
kfree(bqt->tag_index);
bqt->tag_index = NULL;
@@ -931,7 +930,6 @@ static struct blk_queue_tag *__blk_queue_init_tags(struct request_queue *q,
if (init_tag_map(q, tags, depth))
goto fail;
- INIT_LIST_HEAD(&tags->busy_list);
tags->busy = 0;
atomic_set(&tags->refcnt, 1);
return tags;
@@ -982,6 +980,7 @@ int blk_queue_init_tags(struct request_queue *q, int depth,
*/
q->queue_tags = tags;
q->queue_flags |= (1 << QUEUE_FLAG_QUEUED);
+ INIT_LIST_HEAD(&q->tag_busy_list);
return 0;
fail:
kfree(tags);
@@ -1152,7 +1151,7 @@ int blk_queue_start_tag(struct request_queue *q, struct request *rq)
rq->tag = tag;
bqt->tag_index[tag] = rq;
blkdev_dequeue_request(rq);
- list_add(&rq->queuelist, &bqt->busy_list);
+ list_add(&rq->queuelist, &q->tag_busy_list);
bqt->busy++;
return 0;
}
@@ -1173,11 +1172,10 @@ EXPORT_SYMBOL(blk_queue_start_tag);
**/
void blk_queue_invalidate_tags(struct request_queue *q)
{
- struct blk_queue_tag *bqt = q->queue_tags;
struct list_head *tmp, *n;
struct request *rq;
- list_for_each_safe(tmp, n, &bqt->busy_list) {
+ list_for_each_safe(tmp, n, &q->tag_busy_list) {
rq = list_entry_rq(tmp);
if (rq->tag == -1) {
diff --git a/fs/locks.c b/fs/locks.c
index c795eaa..494f250 100644
--- a/fs/locks.c
+++ b/fs/locks.c
@@ -694,11 +694,20 @@ EXPORT_SYMBOL(posix_test_lock);
* Note: the above assumption may not be true when handling lock requests
* from a broken NFS client. But broken NFS clients have a lot more to
* worry about than proper deadlock detection anyway... --okir
+ *
+ * However, the failure of this assumption (also possible in the case of
+ * multiple tasks sharing the same open file table) also means there's no
+ * guarantee that the loop below will terminate. As a hack, we give up
+ * after a few iterations.
*/
+
+#define MAX_DEADLK_ITERATIONS 10
+
static int posix_locks_deadlock(struct file_lock *caller_fl,
struct file_lock *block_fl)
{
struct list_head *tmp;
+ int i = 0;
next_task:
if (posix_same_owner(caller_fl, block_fl))
@@ -706,6 +715,8 @@ next_task:
list_for_each(tmp, &blocked_list) {
struct file_lock *fl = list_entry(tmp, struct file_lock, fl_link);
if (posix_same_owner(fl, block_fl)) {
+ if (i++ > MAX_DEADLK_ITERATIONS)
+ return 0;
fl = fl->fl_next;
block_fl = fl;
goto next_task;
diff --git a/fs/proc/array.c b/fs/proc/array.c
index ee4814d..20d7ae4 100644
--- a/fs/proc/array.c
+++ b/fs/proc/array.c
@@ -351,7 +351,8 @@ static cputime_t task_utime(struct task_struct *p)
}
utime = (clock_t)temp;
- return clock_t_to_cputime(utime);
+ p->prev_utime = max(p->prev_utime, clock_t_to_cputime(utime));
+ return p->prev_utime;
}
static cputime_t task_stime(struct task_struct *p)
@@ -366,7 +367,8 @@ static cputime_t task_stime(struct task_struct *p)
stime = nsec_to_clock_t(p->se.sum_exec_runtime) -
cputime_to_clock_t(task_utime(p));
- return clock_t_to_cputime(stime);
+ p->prev_stime = max(p->prev_stime, clock_t_to_cputime(stime));
+ return p->prev_stime;
}
#endif
diff --git a/fs/splice.c b/fs/splice.c
index e95a362..02c39ae 100644
--- a/fs/splice.c
+++ b/fs/splice.c
@@ -1390,10 +1390,10 @@ static int pipe_to_user(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
if (copy_to_user(sd->u.userptr, src + buf->offset, sd->len))
ret = -EFAULT;
+ buf->ops->unmap(pipe, buf, src);
out:
if (ret > 0)
sd->u.userptr += ret;
- buf->ops->unmap(pipe, buf, src);
return ret;
}
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index b126c6f..d26bbb0 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -356,7 +356,6 @@ enum blk_queue_state {
struct blk_queue_tag {
struct request **tag_index; /* map of busy tags */
unsigned long *tag_map; /* bit map of free/busy tags */
- struct list_head busy_list; /* fifo list of busy tags */
int busy; /* current depth */
int max_depth; /* what we will send to device */
int real_max_depth; /* what the array can hold */
@@ -451,6 +450,7 @@ struct request_queue
unsigned int dma_alignment;
struct blk_queue_tag *queue_tags;
+ struct list_head tag_busy_list;
unsigned int nr_sorted;
unsigned int in_flight;
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 313c6b6..f509fbd 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1022,6 +1022,7 @@ struct task_struct {
unsigned int rt_priority;
cputime_t utime, stime;
+ cputime_t prev_utime, prev_stime;
unsigned long nvcsw, nivcsw; /* context switch counts */
struct timespec start_time; /* monotonic time */
struct timespec real_start_time; /* boot based time */
diff --git a/kernel/fork.c b/kernel/fork.c
index 33f12f4..f299d45 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -1045,6 +1045,8 @@ static struct task_struct *copy_process(unsigned long clone_flags,
p->utime = cputime_zero;
p->stime = cputime_zero;
+ p->prev_utime = cputime_zero;
+ p->prev_stime = cputime_zero;
#ifdef CONFIG_TASK_XACCT
p->rchar = 0; /* I/O counter: bytes read */
diff --git a/kernel/futex_compat.c b/kernel/futex_compat.c
index 2c2e295..f938c23 100644
--- a/kernel/futex_compat.c
+++ b/kernel/futex_compat.c
@@ -29,6 +29,15 @@ fetch_robust_entry(compat_uptr_t *uentry, struct robust_list __user **entry,
return 0;
}
+static void __user *futex_uaddr(struct robust_list *entry,
+ compat_long_t futex_offset)
+{
+ compat_uptr_t base = ptr_to_compat(entry);
+ void __user *uaddr = compat_ptr(base + futex_offset);
+
+ return uaddr;
+}
+
/*
* Walk curr->robust_list (very carefully, it's a userspace list!)
* and mark any locks found there dead, and notify any waiters.
@@ -75,11 +84,13 @@ void compat_exit_robust_list(struct task_struct *curr)
* A pending lock might already be on the list, so
* dont process it twice:
*/
- if (entry != pending)
- if (handle_futex_death((void __user *)entry + futex_offset,
- curr, pi))
- return;
+ if (entry != pending) {
+ void __user *uaddr = futex_uaddr(entry,
+ futex_offset);
+ if (handle_futex_death(uaddr, curr, pi))
+ return;
+ }
if (rc)
return;
uentry = next_uentry;
@@ -93,9 +104,11 @@ void compat_exit_robust_list(struct task_struct *curr)
cond_resched();
}
- if (pending)
- handle_futex_death((void __user *)pending + futex_offset,
- curr, pip);
+ if (pending) {
+ void __user *uaddr = futex_uaddr(pending, futex_offset);
+
+ handle_futex_death(uaddr, curr, pip);
+ }
}
asmlinkage long
diff --git a/kernel/lockdep.c b/kernel/lockdep.c
index 734da57..42ae4a5 100644
--- a/kernel/lockdep.c
+++ b/kernel/lockdep.c
@@ -1521,7 +1521,7 @@ cache_hit:
}
static int validate_chain(struct task_struct *curr, struct lockdep_map *lock,
- struct held_lock *hlock, int chain_head)
+ struct held_lock *hlock, int chain_head, u64 chain_key)
{
/*
* Trylock needs to maintain the stack of held locks, but it
@@ -1534,7 +1534,7 @@ static int validate_chain(struct task_struct *curr, struct lockdep_map *lock,
* graph_lock for us)
*/
if (!hlock->trylock && (hlock->check == 2) &&
- lookup_chain_cache(curr->curr_chain_key, hlock->class)) {
+ lookup_chain_cache(chain_key, hlock->class)) {
/*
* Check whether last held lock:
*
@@ -1576,7 +1576,7 @@ static int validate_chain(struct task_struct *curr, struct lockdep_map *lock,
#else
static inline int validate_chain(struct task_struct *curr,
struct lockdep_map *lock, struct held_lock *hlock,
- int chain_head)
+ int chain_head, u64 chain_key)
{
return 1;
}
@@ -2450,11 +2450,11 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass,
chain_head = 1;
}
chain_key = iterate_chain_key(chain_key, id);
- curr->curr_chain_key = chain_key;
- if (!validate_chain(curr, lock, hlock, chain_head))
+ if (!validate_chain(curr, lock, hlock, chain_head, chain_key))
return 0;
+ curr->curr_chain_key = chain_key;
curr->lockdep_depth++;
check_chain_key(curr);
#ifdef CONFIG_DEBUG_LOCKDEP
diff --git a/kernel/params.c b/kernel/params.c
index 4e57732..5e5651f 100644
--- a/kernel/params.c
+++ b/kernel/params.c
@@ -595,13 +595,16 @@ static void __init param_sysfs_builtin(void)
for (i=0; i < __stop___param - __start___param; i++) {
char *dot;
+ size_t max_name_len;
kp = &__start___param[i];
+ max_name_len =
+ min_t(size_t, MAX_KBUILD_MODNAME, strlen(kp->name));
- /* We do not handle args without periods. */
- dot = memchr(kp->name, '.', MAX_KBUILD_MODNAME);
+ dot = memchr(kp->name, '.', max_name_len);
if (!dot) {
- DEBUGP("couldn't find period in %s\n", kp->name);
+ DEBUGP("couldn't find period in first %d characters "
+ "of %s\n", MAX_KBUILD_MODNAME, kp->name);
continue;
}
name_len = dot - kp->name;
diff --git a/kernel/softlockup.c b/kernel/softlockup.c
index 708d488..e557c44 100644
--- a/kernel/softlockup.c
+++ b/kernel/softlockup.c
@@ -80,10 +80,11 @@ void softlockup_tick(void)
print_timestamp = per_cpu(print_timestamp, this_cpu);
/* report at most once a second */
- if (print_timestamp < (touch_timestamp + 1) ||
- did_panic ||
- !per_cpu(watchdog_task, this_cpu))
+ if ((print_timestamp >= touch_timestamp &&
+ print_timestamp < (touch_timestamp + 1)) ||
+ did_panic || !per_cpu(watchdog_task, this_cpu)) {
return;
+ }
/* do not print during early bootup: */
if (unlikely(system_state != SYSTEM_RUNNING)) {
diff --git a/mm/filemap.c b/mm/filemap.c
index 15c8413..14ca63f 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -1312,7 +1312,7 @@ int filemap_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
size = (i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
if (vmf->pgoff >= size)
- goto outside_data_content;
+ return VM_FAULT_SIGBUS;
/* If we don't want any read-ahead, don't bother */
if (VM_RandomReadHint(vma))
@@ -1389,7 +1389,7 @@ retry_find:
if (unlikely(vmf->pgoff >= size)) {
unlock_page(page);
page_cache_release(page);
- goto outside_data_content;
+ return VM_FAULT_SIGBUS;
}
/*
@@ -1400,15 +1400,6 @@ retry_find:
vmf->page = page;
return ret | VM_FAULT_LOCKED;
-outside_data_content:
- /*
- * An external ptracer can access pages that normally aren't
- * accessible..
- */
- if (vma->vm_mm == current->mm)
- return VM_FAULT_SIGBUS;
-
- /* Fall through to the non-read-ahead case */
no_cached_page:
/*
* We're only likely to ever get here if MADV_RANDOM is in
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index 4472036..97ddc58 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -672,8 +672,10 @@ retry:
ret = (*writepage)(page, wbc, data);
- if (unlikely(ret == AOP_WRITEPAGE_ACTIVATE))
+ if (unlikely(ret == AOP_WRITEPAGE_ACTIVATE)) {
unlock_page(page);
+ ret = 0;
+ }
if (ret || (--(wbc->nr_to_write) <= 0))
done = 1;
if (wbc->nonblocking && bdi_write_congested(bdi)) {
diff --git a/mm/shmem.c b/mm/shmem.c
index fcd19d3..95558e4 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -916,6 +916,21 @@ static int shmem_writepage(struct page *page, struct writeback_control *wbc)
struct inode *inode;
BUG_ON(!PageLocked(page));
+ /*
+ * shmem_backing_dev_info's capabilities prevent regular writeback or
+ * sync from ever calling shmem_writepage; but a stacking filesystem
+ * may use the ->writepage of its underlying filesystem, in which case
+ * we want to do nothing when that underlying filesystem is tmpfs
+ * (writing out to swap is useful as a response to memory pressure, but
+ * of no use to stabilize the data) - just redirty the page, unlock it
+ * and claim success in this case. AOP_WRITEPAGE_ACTIVATE, and the
+ * page_mapped check below, must be avoided unless we're in reclaim.
+ */
+ if (!wbc->for_reclaim) {
+ set_page_dirty(page);
+ unlock_page(page);
+ return 0;
+ }
BUG_ON(page_mapped(page));
mapping = page->mapping;
diff --git a/mm/slub.c b/mm/slub.c
index addb20a..c1f2fda 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -1501,28 +1501,8 @@ new_slab:
page = new_slab(s, gfpflags, node);
if (page) {
cpu = smp_processor_id();
- if (s->cpu_slab[cpu]) {
- /*
- * Someone else populated the cpu_slab while we
- * enabled interrupts, or we have gotten scheduled
- * on another cpu. The page may not be on the
- * requested node even if __GFP_THISNODE was
- * specified. So we need to recheck.
- */
- if (node == -1 ||
- page_to_nid(s->cpu_slab[cpu]) == node) {
- /*
- * Current cpuslab is acceptable and we
- * want the current one since its cache hot
- */
- discard_slab(s, page);
- page = s->cpu_slab[cpu];
- slab_lock(page);
- goto load_freelist;
- }
- /* New slab does not fit our expectations */
+ if (s->cpu_slab[cpu])
flush_slab(s, s->cpu_slab[cpu], cpu);
- }
slab_lock(page);
SetSlabFrozen(page);
s->cpu_slab[cpu] = page;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,875 @@
diff --git a/Makefile b/Makefile
index b0c2c32..0c34409 100644
diff --git a/include/linux/netlink.h b/include/linux/netlink.h
index 83d8239..63af986 100644
--- a/include/linux/netlink.h
+++ b/include/linux/netlink.h
@@ -175,7 +175,7 @@ extern int netlink_unregister_notifier(struct notifier_block *nb);
/* finegrained unicast helpers: */
struct sock *netlink_getsockbyfilp(struct file *filp);
int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock,
- long timeo, struct sock *ssk);
+ long *timeo, struct sock *ssk);
void netlink_detachskb(struct sock *sk, struct sk_buff *skb);
int netlink_sendskb(struct sock *sk, struct sk_buff *skb, int protocol);
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index a656cec..ed2c458 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -41,8 +41,7 @@
#define SKB_DATA_ALIGN(X) (((X) + (SMP_CACHE_BYTES - 1)) & \
~(SMP_CACHE_BYTES - 1))
#define SKB_WITH_OVERHEAD(X) \
- (((X) - sizeof(struct skb_shared_info)) & \
- ~(SMP_CACHE_BYTES - 1))
+ ((X) - SKB_DATA_ALIGN(sizeof(struct skb_shared_info)))
#define SKB_MAX_ORDER(X, ORDER) \
SKB_WITH_OVERHEAD((PAGE_SIZE << (ORDER)) - (X))
#define SKB_MAX_HEAD(X) (SKB_MAX_ORDER((X), 0))
diff --git a/include/net/9p/9p.h b/include/net/9p/9p.h
index 88884d3..7726ff4 100644
--- a/include/net/9p/9p.h
+++ b/include/net/9p/9p.h
@@ -412,6 +412,18 @@ int p9_idpool_check(int id, struct p9_idpool *p);
int p9_error_init(void);
int p9_errstr2errno(char *, int);
+
+#ifdef CONFIG_SYSCTL
int __init p9_sysctl_register(void);
void __exit p9_sysctl_unregister(void);
+#else
+static inline int p9_sysctl_register(void)
+{
+ return 0;
+}
+static inline void p9_sysctl_unregister(void)
+{
+}
+#endif
+
#endif /* NET_9P_H */
diff --git a/include/net/sock.h b/include/net/sock.h
index dfeb8b1..bdd9ebe 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -1199,14 +1199,16 @@ static inline struct sk_buff *sk_stream_alloc_pskb(struct sock *sk,
gfp_t gfp)
{
struct sk_buff *skb;
- int hdr_len;
- hdr_len = SKB_DATA_ALIGN(sk->sk_prot->max_header);
- skb = alloc_skb_fclone(size + hdr_len, gfp);
+ skb = alloc_skb_fclone(size + sk->sk_prot->max_header, gfp);
if (skb) {
skb->truesize += mem;
if (sk_stream_wmem_schedule(sk, skb->truesize)) {
- skb_reserve(skb, hdr_len);
+ /*
+ * Make sure that we have exactly size bytes
+ * available to the caller, no more, no less.
+ */
+ skb_reserve(skb, skb_tailroom(skb) - size);
return skb;
}
__kfree_skb(skb);
diff --git a/ipc/mqueue.c b/ipc/mqueue.c
index 145d5a0..1c0de2c 100644
--- a/ipc/mqueue.c
+++ b/ipc/mqueue.c
@@ -1014,6 +1014,8 @@ asmlinkage long sys_mq_notify(mqd_t mqdes,
return -EINVAL;
}
if (notification.sigev_notify == SIGEV_THREAD) {
+ long timeo;
+
/* create the notify skb */
nc = alloc_skb(NOTIFY_COOKIE_LEN, GFP_KERNEL);
ret = -ENOMEM;
@@ -1042,8 +1044,8 @@ retry:
goto out;
}
- ret = netlink_attachskb(sock, nc, 0,
- MAX_SCHEDULE_TIMEOUT, NULL);
+ timeo = MAX_SCHEDULE_TIMEOUT;
+ ret = netlink_attachskb(sock, nc, 0, &timeo, NULL);
if (ret == 1)
goto retry;
if (ret) {
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c
index 2a54691..ef3f789 100644
--- a/net/8021q/vlan.c
+++ b/net/8021q/vlan.c
@@ -629,6 +629,10 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
if (!vlandev)
continue;
+ flgs = vlandev->flags;
+ if (!(flgs & IFF_UP))
+ continue;
+
vlan_sync_address(dev, vlandev);
}
break;
@@ -740,6 +744,7 @@ static int vlan_ioctl_handler(void __user *arg)
vlan_dev_set_ingress_priority(dev,
args.u.skb_priority,
args.vlan_qos);
+ err = 0;
break;
case SET_VLAN_EGRESS_PRIORITY_CMD:
diff --git a/net/ieee80211/ieee80211_crypt_tkip.c b/net/ieee80211/ieee80211_crypt_tkip.c
index 5a48d8e..7f11dd9 100644
--- a/net/ieee80211/ieee80211_crypt_tkip.c
+++ b/net/ieee80211/ieee80211_crypt_tkip.c
@@ -584,7 +584,7 @@ static void michael_mic_hdr(struct sk_buff *skb, u8 * hdr)
if (stype & IEEE80211_STYPE_QOS_DATA) {
const struct ieee80211_hdr_3addrqos *qoshdr =
(struct ieee80211_hdr_3addrqos *)skb->data;
- hdr[12] = qoshdr->qos_ctl & cpu_to_le16(IEEE80211_QCTL_TID);
+ hdr[12] = le16_to_cpu(qoshdr->qos_ctl) & IEEE80211_QCTL_TID;
} else
hdr[12] = 0; /* priority */
diff --git a/net/ieee80211/softmac/ieee80211softmac_wx.c b/net/ieee80211/softmac/ieee80211softmac_wx.c
index 5742dc8..2b0b4c7 100644
--- a/net/ieee80211/softmac/ieee80211softmac_wx.c
+++ b/net/ieee80211/softmac/ieee80211softmac_wx.c
@@ -469,7 +469,7 @@ ieee80211softmac_wx_set_mlme(struct net_device *dev,
{
struct ieee80211softmac_device *mac = ieee80211_priv(dev);
struct iw_mlme *mlme = (struct iw_mlme *)extra;
- u16 reason = cpu_to_le16(mlme->reason_code);
+ u16 reason = mlme->reason_code;
struct ieee80211softmac_network *net;
int err = -EINVAL;
diff --git a/net/ipv4/ipcomp.c b/net/ipv4/ipcomp.c
index e787044..a8a9f13 100644
--- a/net/ipv4/ipcomp.c
+++ b/net/ipv4/ipcomp.c
@@ -17,6 +17,7 @@
#include <asm/scatterlist.h>
#include <asm/semaphore.h>
#include <linux/crypto.h>
+#include <linux/err.h>
#include <linux/pfkeyv2.h>
#include <linux/percpu.h>
#include <linux/smp.h>
@@ -355,7 +356,7 @@ static struct crypto_comp **ipcomp_alloc_tfms(const char *alg_name)
for_each_possible_cpu(cpu) {
struct crypto_comp *tfm = crypto_alloc_comp(alg_name, 0,
CRYPTO_ALG_ASYNC);
- if (!tfm)
+ if (IS_ERR(tfm))
goto error;
*per_cpu_ptr(tfms, cpu) = tfm;
}
diff --git a/net/ipv6/ipcomp6.c b/net/ipv6/ipcomp6.c
index 473f165..9dd1ebc 100644
--- a/net/ipv6/ipcomp6.c
+++ b/net/ipv6/ipcomp6.c
@@ -37,6 +37,7 @@
#include <asm/scatterlist.h>
#include <asm/semaphore.h>
#include <linux/crypto.h>
+#include <linux/err.h>
#include <linux/pfkeyv2.h>
#include <linux/random.h>
#include <linux/percpu.h>
@@ -366,7 +367,7 @@ static struct crypto_comp **ipcomp6_alloc_tfms(const char *alg_name)
for_each_possible_cpu(cpu) {
struct crypto_comp *tfm = crypto_alloc_comp(alg_name, 0,
CRYPTO_ALG_ASYNC);
- if (!tfm)
+ if (IS_ERR(tfm))
goto error;
*per_cpu_ptr(tfms, cpu) = tfm;
}
diff --git a/net/mac80211/ieee80211.c b/net/mac80211/ieee80211.c
index ff2172f..9e0da6e 100644
--- a/net/mac80211/ieee80211.c
+++ b/net/mac80211/ieee80211.c
@@ -350,7 +350,7 @@ static int ieee80211_get_radiotap_len(struct sk_buff *skb)
struct ieee80211_radiotap_header *hdr =
(struct ieee80211_radiotap_header *) skb->data;
- return le16_to_cpu(hdr->it_len);
+ return le16_to_cpu(get_unaligned(&hdr->it_len));
}
#ifdef CONFIG_MAC80211_LOWTX_FRAME_DUMP
@@ -1680,46 +1680,54 @@ int ieee80211_monitor_start_xmit(struct sk_buff *skb,
struct ieee80211_tx_packet_data *pkt_data;
struct ieee80211_radiotap_header *prthdr =
(struct ieee80211_radiotap_header *)skb->data;
- u16 len;
+ u16 len_rthdr;
- /*
- * there must be a radiotap header at the
- * start in this case
- */
- if (unlikely(prthdr->it_version)) {
- /* only version 0 is supported */
- dev_kfree_skb(skb);
- return NETDEV_TX_OK;
- }
+ /* check for not even having the fixed radiotap header part */
+ if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header)))
+ goto fail; /* too short to be possibly valid */
+
+ /* is it a header version we can trust to find length from? */
+ if (unlikely(prthdr->it_version))
+ goto fail; /* only version 0 is supported */
+
+ /* then there must be a radiotap header with a length we can use */
+ len_rthdr = ieee80211_get_radiotap_len(skb);
+
+ /* does the skb contain enough to deliver on the alleged length? */
+ if (unlikely(skb->len < len_rthdr))
+ goto fail; /* skb too short for claimed rt header extent */
skb->dev = local->mdev;
pkt_data = (struct ieee80211_tx_packet_data *)skb->cb;
memset(pkt_data, 0, sizeof(*pkt_data));
+ /* needed because we set skb device to master */
pkt_data->ifindex = dev->ifindex;
+
pkt_data->mgmt_iface = 0;
pkt_data->do_not_encrypt = 1;
- /* above needed because we set skb device to master */
-
/*
* fix up the pointers accounting for the radiotap
* header still being in there. We are being given
* a precooked IEEE80211 header so no need for
* normal processing
*/
- len = le16_to_cpu(get_unaligned(&prthdr->it_len));
- skb_set_mac_header(skb, len);
- skb_set_network_header(skb, len + sizeof(struct ieee80211_hdr));
- skb_set_transport_header(skb, len + sizeof(struct ieee80211_hdr));
-
+ skb_set_mac_header(skb, len_rthdr);
/*
- * pass the radiotap header up to
- * the next stage intact
+ * these are just fixed to the end of the rt area since we
+ * don't have any better information and at this point, nobody cares
*/
- dev_queue_xmit(skb);
+ skb_set_network_header(skb, len_rthdr);
+ skb_set_transport_header(skb, len_rthdr);
+ /* pass the radiotap header up to the next stage intact */
+ dev_queue_xmit(skb);
return NETDEV_TX_OK;
+
+fail:
+ dev_kfree_skb(skb);
+ return NETDEV_TX_OK; /* meaning, we dealt with the skb */
}
@@ -2836,9 +2844,10 @@ ieee80211_rx_h_data(struct ieee80211_txrx_data *rx)
memcpy(dst, hdr->addr1, ETH_ALEN);
memcpy(src, hdr->addr3, ETH_ALEN);
- if (sdata->type != IEEE80211_IF_TYPE_STA) {
+ if (sdata->type != IEEE80211_IF_TYPE_STA ||
+ (is_multicast_ether_addr(dst) &&
+ !compare_ether_addr(src, dev->dev_addr)))
return TXRX_DROP;
- }
break;
case 0:
/* DA SA BSSID */
diff --git a/net/mac80211/ieee80211_ioctl.c b/net/mac80211/ieee80211_ioctl.c
index e7904db..7b5b801 100644
--- a/net/mac80211/ieee80211_ioctl.c
+++ b/net/mac80211/ieee80211_ioctl.c
@@ -687,10 +687,11 @@ static int ieee80211_ioctl_giwap(struct net_device *dev,
static int ieee80211_ioctl_siwscan(struct net_device *dev,
struct iw_request_info *info,
- struct iw_point *data, char *extra)
+ union iwreq_data *wrqu, char *extra)
{
struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+ struct iw_scan_req *req = NULL;
u8 *ssid = NULL;
size_t ssid_len = 0;
@@ -715,6 +716,14 @@ static int ieee80211_ioctl_siwscan(struct net_device *dev,
return -EOPNOTSUPP;
}
+ /* if SSID was specified explicitly then use that */
+ if (wrqu->data.length == sizeof(struct iw_scan_req) &&
+ wrqu->data.flags & IW_SCAN_THIS_ESSID) {
+ req = (struct iw_scan_req *)extra;
+ ssid = req->essid;
+ ssid_len = req->essid_len;
+ }
+
return ieee80211_sta_req_scan(dev, ssid, ssid_len);
}
diff --git a/net/mac80211/ieee80211_sta.c b/net/mac80211/ieee80211_sta.c
index 0d99b68..73d39e1 100644
--- a/net/mac80211/ieee80211_sta.c
+++ b/net/mac80211/ieee80211_sta.c
@@ -12,7 +12,6 @@
*/
/* TODO:
- * BSS table: use <BSSID,SSID> as the key to support multi-SSID APs
* order BSS list by RSSI(?) ("quality of AP")
* scan result table filtering (by capability (privacy, IBSS/BSS, WPA/RSN IE,
* SSID)
@@ -61,7 +60,8 @@
static void ieee80211_send_probe_req(struct net_device *dev, u8 *dst,
u8 *ssid, size_t ssid_len);
static struct ieee80211_sta_bss *
-ieee80211_rx_bss_get(struct net_device *dev, u8 *bssid);
+ieee80211_rx_bss_get(struct net_device *dev, u8 *bssid, int channel,
+ u8 *ssid, u8 ssid_len);
static void ieee80211_rx_bss_put(struct net_device *dev,
struct ieee80211_sta_bss *bss);
static int ieee80211_sta_find_ibss(struct net_device *dev,
@@ -108,15 +108,11 @@ struct ieee802_11_elems {
u8 wmm_param_len;
};
-typedef enum { ParseOK = 0, ParseUnknown = 1, ParseFailed = -1 } ParseRes;
-
-
-static ParseRes ieee802_11_parse_elems(u8 *start, size_t len,
- struct ieee802_11_elems *elems)
+static void ieee802_11_parse_elems(u8 *start, size_t len,
+ struct ieee802_11_elems *elems)
{
size_t left = len;
u8 *pos = start;
- int unknown = 0;
memset(elems, 0, sizeof(*elems));
@@ -127,15 +123,8 @@ static ParseRes ieee802_11_parse_elems(u8 *start, size_t len,
elen = *pos++;
left -= 2;
- if (elen > left) {
-#if 0
- if (net_ratelimit())
- printk(KERN_DEBUG "IEEE 802.11 element parse "
- "failed (id=%d elen=%d left=%d)\n",
- id, elen, left);
-#endif
- return ParseFailed;
- }
+ if (elen > left)
+ return;
switch (id) {
case WLAN_EID_SSID:
@@ -202,28 +191,15 @@ static ParseRes ieee802_11_parse_elems(u8 *start, size_t len,
elems->ext_supp_rates_len = elen;
break;
default:
-#if 0
- printk(KERN_DEBUG "IEEE 802.11 element parse ignored "
- "unknown element (id=%d elen=%d)\n",
- id, elen);
-#endif
- unknown++;
break;
}
left -= elen;
pos += elen;
}
-
- /* Do not trigger error if left == 1 as Apple Airport base stations
- * send AssocResps that are one spurious byte too long. */
-
- return unknown ? ParseUnknown : ParseOK;
}
-
-
static int ecw2cw(int ecw)
{
int cw = 1;
@@ -387,6 +363,7 @@ static void ieee80211_set_associated(struct net_device *dev,
struct ieee80211_if_sta *ifsta, int assoc)
{
union iwreq_data wrqu;
+ struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
if (ifsta->associated == assoc)
@@ -401,7 +378,9 @@ static void ieee80211_set_associated(struct net_device *dev,
if (sdata->type != IEEE80211_IF_TYPE_STA)
return;
- bss = ieee80211_rx_bss_get(dev, ifsta->bssid);
+ bss = ieee80211_rx_bss_get(dev, ifsta->bssid,
+ local->hw.conf.channel,
+ ifsta->ssid, ifsta->ssid_len);
if (bss) {
if (bss->has_erp_value)
ieee80211_handle_erp_ie(dev, bss->erp_value);
@@ -543,7 +522,8 @@ static void ieee80211_send_assoc(struct net_device *dev,
capab |= WLAN_CAPABILITY_SHORT_SLOT_TIME |
WLAN_CAPABILITY_SHORT_PREAMBLE;
}
- bss = ieee80211_rx_bss_get(dev, ifsta->bssid);
+ bss = ieee80211_rx_bss_get(dev, ifsta->bssid, local->hw.conf.channel,
+ ifsta->ssid, ifsta->ssid_len);
if (bss) {
if (bss->capability & WLAN_CAPABILITY_PRIVACY)
capab |= WLAN_CAPABILITY_PRIVACY;
@@ -695,6 +675,7 @@ static void ieee80211_send_disassoc(struct net_device *dev,
static int ieee80211_privacy_mismatch(struct net_device *dev,
struct ieee80211_if_sta *ifsta)
{
+ struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
struct ieee80211_sta_bss *bss;
int res = 0;
@@ -702,7 +683,8 @@ static int ieee80211_privacy_mismatch(struct net_device *dev,
ifsta->key_mgmt != IEEE80211_KEY_MGMT_NONE)
return 0;
- bss = ieee80211_rx_bss_get(dev, ifsta->bssid);
+ bss = ieee80211_rx_bss_get(dev, ifsta->bssid, local->hw.conf.channel,
+ ifsta->ssid, ifsta->ssid_len);
if (!bss)
return 0;
@@ -901,12 +883,7 @@ static void ieee80211_auth_challenge(struct net_device *dev,
printk(KERN_DEBUG "%s: replying to auth challenge\n", dev->name);
pos = mgmt->u.auth.variable;
- if (ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), &elems)
- == ParseFailed) {
- printk(KERN_DEBUG "%s: failed to parse Auth(challenge)\n",
- dev->name);
- return;
- }
+ ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), &elems);
if (!elems.challenge) {
printk(KERN_DEBUG "%s: no challenge IE in shared key auth "
"frame\n", dev->name);
@@ -1174,15 +1151,11 @@ static void ieee80211_rx_mgmt_assoc_resp(struct net_device *dev,
capab_info = le16_to_cpu(mgmt->u.assoc_resp.capab_info);
status_code = le16_to_cpu(mgmt->u.assoc_resp.status_code);
aid = le16_to_cpu(mgmt->u.assoc_resp.aid);
- if ((aid & (BIT(15) | BIT(14))) != (BIT(15) | BIT(14)))
- printk(KERN_DEBUG "%s: invalid aid value %d; bits 15:14 not "
- "set\n", dev->name, aid);
- aid &= ~(BIT(15) | BIT(14));
printk(KERN_DEBUG "%s: RX %sssocResp from " MAC_FMT " (capab=0x%x "
"status=%d aid=%d)\n",
dev->name, reassoc ? "Rea" : "A", MAC_ARG(mgmt->sa),
- capab_info, status_code, aid);
+ capab_info, status_code, aid & ~(BIT(15) | BIT(14)));
if (status_code != WLAN_STATUS_SUCCESS) {
printk(KERN_DEBUG "%s: AP denied association (code=%d)\n",
@@ -1192,13 +1165,13 @@ static void ieee80211_rx_mgmt_assoc_resp(struct net_device *dev,
return;
}
+ if ((aid & (BIT(15) | BIT(14))) != (BIT(15) | BIT(14)))
+ printk(KERN_DEBUG "%s: invalid aid value %d; bits 15:14 not "
+ "set\n", dev->name, aid);
+ aid &= ~(BIT(15) | BIT(14));
+
pos = mgmt->u.assoc_resp.variable;
- if (ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), &elems)
- == ParseFailed) {
- printk(KERN_DEBUG "%s: failed to parse AssocResp\n",
- dev->name);
- return;
- }
+ ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), &elems);
if (!elems.supp_rates) {
printk(KERN_DEBUG "%s: no SuppRates element in AssocResp\n",
@@ -1210,7 +1183,9 @@ static void ieee80211_rx_mgmt_assoc_resp(struct net_device *dev,
* update our stored copy */
if (elems.erp_info && elems.erp_info_len >= 1) {
struct ieee80211_sta_bss *bss
- = ieee80211_rx_bss_get(dev, ifsta->bssid);
+ = ieee80211_rx_bss_get(dev, ifsta->bssid,
+ local->hw.conf.channel,
+ ifsta->ssid, ifsta->ssid_len);
if (bss) {
bss->erp_value = elems.erp_info[0];
bss->has_erp_value = 1;
@@ -1240,7 +1215,9 @@ static void ieee80211_rx_mgmt_assoc_resp(struct net_device *dev,
" AP\n", dev->name);
return;
}
- bss = ieee80211_rx_bss_get(dev, ifsta->bssid);
+ bss = ieee80211_rx_bss_get(dev, ifsta->bssid,
+ local->hw.conf.channel,
+ ifsta->ssid, ifsta->ssid_len);
if (bss) {
sta->last_rssi = bss->rssi;
sta->last_signal = bss->signal;
@@ -1321,7 +1298,8 @@ static void __ieee80211_rx_bss_hash_del(struct net_device *dev,
static struct ieee80211_sta_bss *
-ieee80211_rx_bss_add(struct net_device *dev, u8 *bssid)
+ieee80211_rx_bss_add(struct net_device *dev, u8 *bssid, int channel,
+ u8 *ssid, u8 ssid_len)
{
struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
struct ieee80211_sta_bss *bss;
@@ -1332,6 +1310,11 @@ ieee80211_rx_bss_add(struct net_device *dev, u8 *bssid)
atomic_inc(&bss->users);
atomic_inc(&bss->users);
memcpy(bss->bssid, bssid, ETH_ALEN);
+ bss->channel = channel;
+ if (ssid && ssid_len <= IEEE80211_MAX_SSID_LEN) {
+ memcpy(bss->ssid, ssid, ssid_len);
+ bss->ssid_len = ssid_len;
+ }
spin_lock_bh(&local->sta_bss_lock);
/* TODO: order by RSSI? */
@@ -1343,7 +1326,8 @@ ieee80211_rx_bss_add(struct net_device *dev, u8 *bssid)
static struct ieee80211_sta_bss *
-ieee80211_rx_bss_get(struct net_device *dev, u8 *bssid)
+ieee80211_rx_bss_get(struct net_device *dev, u8 *bssid, int channel,
+ u8 *ssid, u8 ssid_len)
{
struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
struct ieee80211_sta_bss *bss;
@@ -1351,7 +1335,10 @@ ieee80211_rx_bss_get(struct net_device *dev, u8 *bssid)
spin_lock_bh(&local->sta_bss_lock);
bss = local->sta_bss_hash[STA_HASH(bssid)];
while (bss) {
- if (memcmp(bss->bssid, bssid, ETH_ALEN) == 0) {
+ if (!memcmp(bss->bssid, bssid, ETH_ALEN) &&
+ bss->channel == channel &&
+ bss->ssid_len == ssid_len &&
+ (ssid_len == 0 || !memcmp(bss->ssid, ssid, ssid_len))) {
atomic_inc(&bss->users);
break;
}
@@ -1413,7 +1400,7 @@ static void ieee80211_rx_bss_info(struct net_device *dev,
struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
struct ieee802_11_elems elems;
size_t baselen;
- int channel, invalid = 0, clen;
+ int channel, clen;
struct ieee80211_sta_bss *bss;
struct sta_info *sta;
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
@@ -1457,9 +1444,7 @@ static void ieee80211_rx_bss_info(struct net_device *dev,
#endif /* CONFIG_MAC80211_IBSS_DEBUG */
}
- if (ieee802_11_parse_elems(mgmt->u.beacon.variable, len - baselen,
- &elems) == ParseFailed)
- invalid = 1;
+ ieee802_11_parse_elems(mgmt->u.beacon.variable, len - baselen, &elems);
if (sdata->type == IEEE80211_IF_TYPE_IBSS && elems.supp_rates &&
memcmp(mgmt->bssid, sdata->u.sta.bssid, ETH_ALEN) == 0 &&
@@ -1519,9 +1504,11 @@ static void ieee80211_rx_bss_info(struct net_device *dev,
else
channel = rx_status->channel;
- bss = ieee80211_rx_bss_get(dev, mgmt->bssid);
+ bss = ieee80211_rx_bss_get(dev, mgmt->bssid, channel,
+ elems.ssid, elems.ssid_len);
if (!bss) {
- bss = ieee80211_rx_bss_add(dev, mgmt->bssid);
+ bss = ieee80211_rx_bss_add(dev, mgmt->bssid, channel,
+ elems.ssid, elems.ssid_len);
if (!bss)
return;
} else {
@@ -1547,10 +1534,6 @@ static void ieee80211_rx_bss_info(struct net_device *dev,
bss->beacon_int = le16_to_cpu(mgmt->u.beacon.beacon_int);
bss->capability = le16_to_cpu(mgmt->u.beacon.capab_info);
- if (elems.ssid && elems.ssid_len <= IEEE80211_MAX_SSID_LEN) {
- memcpy(bss->ssid, elems.ssid, elems.ssid_len);
- bss->ssid_len = elems.ssid_len;
- }
bss->supp_rates_len = 0;
if (elems.supp_rates) {
@@ -1621,7 +1604,6 @@ static void ieee80211_rx_bss_info(struct net_device *dev,
bss->hw_mode = rx_status->phymode;
- bss->channel = channel;
bss->freq = rx_status->freq;
if (channel != rx_status->channel &&
(bss->hw_mode == MODE_IEEE80211G ||
@@ -1681,9 +1663,7 @@ static void ieee80211_rx_mgmt_beacon(struct net_device *dev,
if (baselen > len)
return;
- if (ieee802_11_parse_elems(mgmt->u.beacon.variable, len - baselen,
- &elems) == ParseFailed)
- return;
+ ieee802_11_parse_elems(mgmt->u.beacon.variable, len - baselen, &elems);
if (elems.erp_info && elems.erp_info_len >= 1)
ieee80211_handle_erp_ie(dev, elems.erp_info[0]);
@@ -2332,7 +2312,7 @@ static int ieee80211_sta_create_ibss(struct net_device *dev,
{
struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
struct ieee80211_sta_bss *bss;
- struct ieee80211_sub_if_data *sdata;
+ struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
struct ieee80211_hw_mode *mode;
u8 bssid[ETH_ALEN], *pos;
int i;
@@ -2354,18 +2334,17 @@ static int ieee80211_sta_create_ibss(struct net_device *dev,
printk(KERN_DEBUG "%s: Creating new IBSS network, BSSID " MAC_FMT "\n",
dev->name, MAC_ARG(bssid));
- bss = ieee80211_rx_bss_add(dev, bssid);
+ bss = ieee80211_rx_bss_add(dev, bssid, local->hw.conf.channel,
+ sdata->u.sta.ssid, sdata->u.sta.ssid_len);
if (!bss)
return -ENOMEM;
- sdata = IEEE80211_DEV_TO_SUB_IF(dev);
mode = local->oper_hw_mode;
if (local->hw.conf.beacon_int == 0)
local->hw.conf.beacon_int = 100;
bss->beacon_int = local->hw.conf.beacon_int;
bss->hw_mode = local->hw.conf.phymode;
- bss->channel = local->hw.conf.channel;
bss->freq = local->hw.conf.freq;
bss->last_update = jiffies;
bss->capability = WLAN_CAPABILITY_IBSS;
@@ -2425,7 +2404,8 @@ static int ieee80211_sta_find_ibss(struct net_device *dev,
MAC_FMT "\n", MAC_ARG(bssid), MAC_ARG(ifsta->bssid));
#endif /* CONFIG_MAC80211_IBSS_DEBUG */
if (found && memcmp(ifsta->bssid, bssid, ETH_ALEN) != 0 &&
- (bss = ieee80211_rx_bss_get(dev, bssid))) {
+ (bss = ieee80211_rx_bss_get(dev, bssid, local->hw.conf.channel,
+ ifsta->ssid, ifsta->ssid_len))) {
printk(KERN_DEBUG "%s: Selected IBSS BSSID " MAC_FMT
" based on configured SSID\n",
dev->name, MAC_ARG(bssid));
diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c
index eb3fe74..70c5b7d 100644
--- a/net/netfilter/nf_conntrack_proto_tcp.c
+++ b/net/netfilter/nf_conntrack_proto_tcp.c
@@ -831,6 +831,22 @@ static int tcp_packet(struct nf_conn *conntrack,
tuple = &conntrack->tuplehash[dir].tuple;
switch (new_state) {
+ case TCP_CONNTRACK_SYN_SENT:
+ if (old_state < TCP_CONNTRACK_TIME_WAIT)
+ break;
+ if ((conntrack->proto.tcp.seen[!dir].flags &
+ IP_CT_TCP_FLAG_CLOSE_INIT)
+ || (conntrack->proto.tcp.last_dir == dir
+ && conntrack->proto.tcp.last_index == TCP_RST_SET)) {
+ /* Attempt to reopen a closed/aborted connection.
+ * Delete this connection and look up again. */
+ write_unlock_bh(&tcp_lock);
+ if (del_timer(&conntrack->timeout))
+ conntrack->timeout.function((unsigned long)
+ conntrack);
+ return -NF_REPEAT;
+ }
+ /* Fall through */
case TCP_CONNTRACK_IGNORE:
/* Ignored packets:
*
@@ -879,27 +895,6 @@ static int tcp_packet(struct nf_conn *conntrack,
nf_log_packet(pf, 0, skb, NULL, NULL, NULL,
"nf_ct_tcp: invalid state ");
return -NF_ACCEPT;
- case TCP_CONNTRACK_SYN_SENT:
- if (old_state < TCP_CONNTRACK_TIME_WAIT)
- break;
- if ((conntrack->proto.tcp.seen[dir].flags &
- IP_CT_TCP_FLAG_CLOSE_INIT)
- || after(ntohl(th->seq),
- conntrack->proto.tcp.seen[dir].td_end)) {
- /* Attempt to reopen a closed connection.
- * Delete this connection and look up again. */
- write_unlock_bh(&tcp_lock);
- if (del_timer(&conntrack->timeout))
- conntrack->timeout.function((unsigned long)
- conntrack);
- return -NF_REPEAT;
- } else {
- write_unlock_bh(&tcp_lock);
- if (LOG_INVALID(IPPROTO_TCP))
- nf_log_packet(pf, 0, skb, NULL, NULL,
- NULL, "nf_ct_tcp: invalid SYN");
- return -NF_ACCEPT;
- }
case TCP_CONNTRACK_CLOSE:
if (index == TCP_RST_SET
&& ((test_bit(IPS_SEEN_REPLY_BIT, &conntrack->status)
@@ -932,6 +927,7 @@ static int tcp_packet(struct nf_conn *conntrack,
in_window:
/* From now on we have got in-window packets */
conntrack->proto.tcp.last_index = index;
+ conntrack->proto.tcp.last_dir = dir;
pr_debug("tcp_conntracks: ");
NF_CT_DUMP_TUPLE(tuple);
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index 5681ce3..1a0fcc5 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -744,7 +744,7 @@ struct sock *netlink_getsockbyfilp(struct file *filp)
* 1: repeat lookup - reference dropped while waiting for socket memory.
*/
int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock,
- long timeo, struct sock *ssk)
+ long *timeo, struct sock *ssk)
{
struct netlink_sock *nlk;
@@ -753,7 +753,7 @@ int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock,
if (atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf ||
test_bit(0, &nlk->state)) {
DECLARE_WAITQUEUE(wait, current);
- if (!timeo) {
+ if (!*timeo) {
if (!ssk || nlk_sk(ssk)->pid == 0)
netlink_overrun(sk);
sock_put(sk);
@@ -767,7 +767,7 @@ int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock,
if ((atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf ||
test_bit(0, &nlk->state)) &&
!sock_flag(sk, SOCK_DEAD))
- timeo = schedule_timeout(timeo);
+ *timeo = schedule_timeout(*timeo);
__set_current_state(TASK_RUNNING);
remove_wait_queue(&nlk->wait, &wait);
@@ -775,7 +775,7 @@ int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock,
if (signal_pending(current)) {
kfree_skb(skb);
- return sock_intr_errno(timeo);
+ return sock_intr_errno(*timeo);
}
return 1;
}
@@ -839,7 +839,7 @@ retry:
kfree_skb(skb);
return PTR_ERR(sk);
}
- err = netlink_attachskb(sk, skb, nonblock, timeo, ssk);
+ err = netlink_attachskb(sk, skb, nonblock, &timeo, ssk);
if (err == 1)
goto retry;
if (err)
diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c
index d4d5d2f..fceb75b 100644
--- a/net/sched/cls_u32.c
+++ b/net/sched/cls_u32.c
@@ -91,7 +91,7 @@ static struct tc_u_common *u32_list;
static __inline__ unsigned u32_hash_fold(u32 key, struct tc_u32_sel *sel, u8 fshift)
{
- unsigned h = (key & sel->hmask)>>fshift;
+ unsigned h = ntohl(key & sel->hmask)>>fshift;
return h;
}
@@ -615,7 +615,7 @@ static int u32_change(struct tcf_proto *tp, unsigned long base, u32 handle,
n->handle = handle;
{
u8 i = 0;
- u32 mask = s->hmask;
+ u32 mask = ntohl(s->hmask);
if (mask) {
while (!(mask & 1)) {
i++;
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
index dee0d5f..8f1bcf6 100644
--- a/net/sched/sch_api.c
+++ b/net/sched/sch_api.c
@@ -1225,10 +1225,13 @@ EXPORT_SYMBOL(tcf_destroy_chain);
#ifdef CONFIG_PROC_FS
static int psched_show(struct seq_file *seq, void *v)
{
+ struct timespec ts;
+
+ hrtimer_get_res(CLOCK_MONOTONIC, &ts);
seq_printf(seq, "%08x %08x %08x %08x\n",
(u32)NSEC_PER_USEC, (u32)PSCHED_US2NS(1),
1000000,
- (u32)NSEC_PER_SEC/(u32)ktime_to_ns(KTIME_MONOTONIC_RES));
+ (u32)NSEC_PER_SEC/(u32)ktime_to_ns(timespec_to_ktime(ts)));
return 0;
}
diff --git a/net/sched/sch_teql.c b/net/sched/sch_teql.c
index 0968184..cb5754b 100644
--- a/net/sched/sch_teql.c
+++ b/net/sched/sch_teql.c
@@ -249,6 +249,9 @@ __teql_resolve(struct sk_buff *skb, struct sk_buff *skb_res, struct net_device *
static __inline__ int
teql_resolve(struct sk_buff *skb, struct sk_buff *skb_res, struct net_device *dev)
{
+ if (dev->qdisc == &noop_qdisc)
+ return -ENODEV;
+
if (dev->hard_header == NULL ||
skb->dst == NULL ||
skb->dst->neighbour == NULL)
diff --git a/net/socket.c b/net/socket.c
index b09eb90..8e5be74 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1245,11 +1245,14 @@ asmlinkage long sys_socketpair(int family, int type, int protocol,
goto out_release_both;
fd1 = sock_alloc_fd(&newfile1);
- if (unlikely(fd1 < 0))
+ if (unlikely(fd1 < 0)) {
+ err = fd1;
goto out_release_both;
+ }
fd2 = sock_alloc_fd(&newfile2);
if (unlikely(fd2 < 0)) {
+ err = fd2;
put_filp(newfile1);
put_unused_fd(fd1);
goto out_release_both;
@@ -2230,6 +2233,7 @@ int kernel_accept(struct socket *sock, struct socket **newsock, int flags)
err = sock->ops->accept(sock, *newsock, flags);
if (err < 0) {
sock_release(*newsock);
+ *newsock = NULL;
goto done;
}

View File

@ -0,0 +1,951 @@
diff --git a/Makefile b/Makefile
index 0c34409..e11814e 100644
diff --git a/drivers/net/ehea/ehea_qmr.c b/drivers/net/ehea/ehea_qmr.c
index c82e245..329a252 100644
--- a/drivers/net/ehea/ehea_qmr.c
+++ b/drivers/net/ehea/ehea_qmr.c
@@ -563,8 +563,7 @@ int ehea_destroy_qp(struct ehea_qp *qp)
int ehea_create_busmap( void )
{
u64 vaddr = EHEA_BUSMAP_START;
- unsigned long abs_max_pfn = 0;
- unsigned long sec_max_pfn;
+ unsigned long high_section_index = 0;
int i;
/*
@@ -574,14 +573,10 @@ int ehea_create_busmap( void )
ehea_bmap.valid_sections = 0;
for (i = 0; i < NR_MEM_SECTIONS; i++)
- if (valid_section_nr(i)) {
- sec_max_pfn = section_nr_to_pfn(i);
- if (sec_max_pfn > abs_max_pfn)
- abs_max_pfn = sec_max_pfn;
- ehea_bmap.valid_sections++;
- }
+ if (valid_section_nr(i))
+ high_section_index = i;
- ehea_bmap.entries = abs_max_pfn / EHEA_PAGES_PER_SECTION + 1;
+ ehea_bmap.entries = high_section_index + 1;
ehea_bmap.vaddr = vmalloc(ehea_bmap.entries * sizeof(*ehea_bmap.vaddr));
if (!ehea_bmap.vaddr)
@@ -593,6 +588,7 @@ int ehea_create_busmap( void )
if (pfn_valid(pfn)) {
ehea_bmap.vaddr[i] = vaddr;
vaddr += EHEA_SECTSIZE;
+ ehea_bmap.valid_sections++;
} else
ehea_bmap.vaddr[i] = 0;
}
@@ -637,7 +633,7 @@ int ehea_reg_kernel_mr(struct ehea_adapter *adapter, struct ehea_mr *mr)
mr_len = ehea_bmap.valid_sections * EHEA_SECTSIZE;
- pt = kzalloc(EHEA_MAX_RPAGE * sizeof(u64), GFP_KERNEL);
+ pt = kzalloc(PAGE_SIZE, GFP_KERNEL);
if (!pt) {
ehea_error("no mem");
ret = -ENOMEM;
@@ -660,8 +656,8 @@ int ehea_reg_kernel_mr(struct ehea_adapter *adapter, struct ehea_mr *mr)
void *sectbase = __va(i << SECTION_SIZE_BITS);
unsigned long k = 0;
- for (j = 0; j < (PAGES_PER_SECTION / EHEA_MAX_RPAGE);
- j++) {
+ for (j = 0; j < (EHEA_PAGES_PER_SECTION /
+ EHEA_MAX_RPAGE); j++) {
for (m = 0; m < EHEA_MAX_RPAGE; m++) {
pg = sectbase + ((k++) * EHEA_PAGESIZE);
diff --git a/drivers/net/ehea/ehea_qmr.h b/drivers/net/ehea/ehea_qmr.h
index b71f845..352cb38 100644
--- a/drivers/net/ehea/ehea_qmr.h
+++ b/drivers/net/ehea/ehea_qmr.h
@@ -39,7 +39,7 @@
#define EHEA_PAGESHIFT 12
#define EHEA_PAGESIZE (1UL << EHEA_PAGESHIFT)
#define EHEA_SECTSIZE (1UL << 24)
-#define EHEA_PAGES_PER_SECTION (EHEA_SECTSIZE >> PAGE_SHIFT)
+#define EHEA_PAGES_PER_SECTION (EHEA_SECTSIZE >> EHEA_PAGESHIFT)
#if (1UL << SECTION_SIZE_BITS) < EHEA_SECTSIZE
#error eHEA module can't work if kernel sectionsize < ehea sectionsize
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c
index 1938d6d..d68796e 100644
--- a/drivers/net/forcedeth.c
+++ b/drivers/net/forcedeth.c
@@ -988,7 +988,7 @@ static void nv_enable_irq(struct net_device *dev)
if (np->msi_flags & NV_MSI_X_ENABLED)
enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector);
else
- enable_irq(dev->irq);
+ enable_irq(np->pci_dev->irq);
} else {
enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector);
enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector);
@@ -1004,7 +1004,7 @@ static void nv_disable_irq(struct net_device *dev)
if (np->msi_flags & NV_MSI_X_ENABLED)
disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector);
else
- disable_irq(dev->irq);
+ disable_irq(np->pci_dev->irq);
} else {
disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector);
disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector);
@@ -1601,7 +1601,7 @@ static void nv_do_rx_refill(unsigned long data)
if (np->msi_flags & NV_MSI_X_ENABLED)
disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector);
else
- disable_irq(dev->irq);
+ disable_irq(np->pci_dev->irq);
} else {
disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector);
}
@@ -1619,7 +1619,7 @@ static void nv_do_rx_refill(unsigned long data)
if (np->msi_flags & NV_MSI_X_ENABLED)
enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector);
else
- enable_irq(dev->irq);
+ enable_irq(np->pci_dev->irq);
} else {
enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector);
}
@@ -3557,10 +3557,12 @@ static int nv_request_irq(struct net_device *dev, int intr_test)
if (ret != 0 && np->msi_flags & NV_MSI_CAPABLE) {
if ((ret = pci_enable_msi(np->pci_dev)) == 0) {
np->msi_flags |= NV_MSI_ENABLED;
+ dev->irq = np->pci_dev->irq;
if (request_irq(np->pci_dev->irq, handler, IRQF_SHARED, dev->name, dev) != 0) {
printk(KERN_INFO "forcedeth: request_irq failed %d\n", ret);
pci_disable_msi(np->pci_dev);
np->msi_flags &= ~NV_MSI_ENABLED;
+ dev->irq = np->pci_dev->irq;
goto out_err;
}
@@ -3623,7 +3625,7 @@ static void nv_do_nic_poll(unsigned long data)
if (np->msi_flags & NV_MSI_X_ENABLED)
disable_irq_lockdep(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector);
else
- disable_irq_lockdep(dev->irq);
+ disable_irq_lockdep(np->pci_dev->irq);
mask = np->irqmask;
} else {
if (np->nic_poll_irq & NVREG_IRQ_RX_ALL) {
@@ -3641,6 +3643,8 @@ static void nv_do_nic_poll(unsigned long data)
}
np->nic_poll_irq = 0;
+ /* disable_irq() contains synchronize_irq, thus no irq handler can run now */
+
if (np->recover_error) {
np->recover_error = 0;
printk(KERN_INFO "forcedeth: MAC in recoverable error state\n");
@@ -3677,7 +3681,6 @@ static void nv_do_nic_poll(unsigned long data)
}
}
- /* FIXME: Do we need synchronize_irq(dev->irq) here? */
writel(mask, base + NvRegIrqMask);
pci_push(base);
@@ -3690,7 +3693,7 @@ static void nv_do_nic_poll(unsigned long data)
if (np->msi_flags & NV_MSI_X_ENABLED)
enable_irq_lockdep(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector);
else
- enable_irq_lockdep(dev->irq);
+ enable_irq_lockdep(np->pci_dev->irq);
} else {
if (np->nic_poll_irq & NVREG_IRQ_RX_ALL) {
nv_nic_irq_rx(0, dev);
@@ -4943,7 +4946,7 @@ static int nv_close(struct net_device *dev)
np->in_shutdown = 1;
spin_unlock_irq(&np->lock);
netif_poll_disable(dev);
- synchronize_irq(dev->irq);
+ synchronize_irq(np->pci_dev->irq);
del_timer_sync(&np->oom_kick);
del_timer_sync(&np->nic_poll);
@@ -5563,6 +5566,22 @@ static struct pci_device_id pci_tbl[] = {
PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_31),
.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR,
},
+ { /* MCP77 Ethernet Controller */
+ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_32),
+ .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
+ },
+ { /* MCP77 Ethernet Controller */
+ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_33),
+ .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
+ },
+ { /* MCP77 Ethernet Controller */
+ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_34),
+ .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
+ },
+ { /* MCP77 Ethernet Controller */
+ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_35),
+ .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
+ },
{0,},
};
diff --git a/drivers/net/pppol2tp.c b/drivers/net/pppol2tp.c
index abe91cb..7da0d07 100644
--- a/drivers/net/pppol2tp.c
+++ b/drivers/net/pppol2tp.c
@@ -487,7 +487,7 @@ static int pppol2tp_recv_core(struct sock *sock, struct sk_buff *skb)
{
struct pppol2tp_session *session = NULL;
struct pppol2tp_tunnel *tunnel;
- unsigned char *ptr;
+ unsigned char *ptr, *optr;
u16 hdrflags;
u16 tunnel_id, session_id;
int length;
@@ -495,7 +495,7 @@ static int pppol2tp_recv_core(struct sock *sock, struct sk_buff *skb)
tunnel = pppol2tp_sock_to_tunnel(sock);
if (tunnel == NULL)
- goto error;
+ goto no_tunnel;
/* UDP always verifies the packet length. */
__skb_pull(skb, sizeof(struct udphdr));
@@ -508,7 +508,7 @@ static int pppol2tp_recv_core(struct sock *sock, struct sk_buff *skb)
}
/* Point to L2TP header */
- ptr = skb->data;
+ optr = ptr = skb->data;
/* Get L2TP header flags */
hdrflags = ntohs(*(__be16*)ptr);
@@ -636,12 +636,14 @@ static int pppol2tp_recv_core(struct sock *sock, struct sk_buff *skb)
/* If offset bit set, skip it. */
if (hdrflags & L2TP_HDRFLAG_O) {
offset = ntohs(*(__be16 *)ptr);
- skb->transport_header += 2 + offset;
- if (!pskb_may_pull(skb, skb_transport_offset(skb) + 2))
- goto discard;
+ ptr += 2 + offset;
}
- __skb_pull(skb, skb_transport_offset(skb));
+ offset = ptr - optr;
+ if (!pskb_may_pull(skb, offset))
+ goto discard;
+
+ __skb_pull(skb, offset);
/* Skip PPP header, if present. In testing, Microsoft L2TP clients
* don't send the PPP header (PPP header compression enabled), but
@@ -651,6 +653,9 @@ static int pppol2tp_recv_core(struct sock *sock, struct sk_buff *skb)
* Note that skb->data[] isn't dereferenced from a u16 ptr here since
* the field may be unaligned.
*/
+ if (!pskb_may_pull(skb, 2))
+ goto discard;
+
if ((skb->data[0] == 0xff) && (skb->data[1] == 0x03))
skb_pull(skb, 2);
@@ -708,6 +713,10 @@ discard:
return 0;
error:
+ /* Put UDP header back */
+ __skb_push(skb, sizeof(struct udphdr));
+
+no_tunnel:
return 1;
}
@@ -1049,6 +1058,8 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb)
/* Get routing info from the tunnel socket */
dst_release(skb->dst);
skb->dst = sk_dst_get(sk_tun);
+ skb_orphan(skb);
+ skb->sk = sk_tun;
/* Queue the packet to IP for output */
len = skb->len;
diff --git a/drivers/net/skge.c b/drivers/net/skge.c
index e3d8520..b3d4728 100644
--- a/drivers/net/skge.c
+++ b/drivers/net/skge.c
@@ -57,7 +57,7 @@
#define TX_WATCHDOG (5 * HZ)
#define NAPI_WEIGHT 64
#define BLINK_MS 250
-#define LINK_HZ (HZ/2)
+#define LINK_HZ HZ
MODULE_DESCRIPTION("SysKonnect Gigabit Ethernet driver");
MODULE_AUTHOR("Stephen Hemminger <shemminger@linux-foundation.org>");
@@ -992,19 +992,15 @@ static void xm_link_down(struct skge_hw *hw, int port)
{
struct net_device *dev = hw->dev[port];
struct skge_port *skge = netdev_priv(dev);
- u16 cmd, msk;
+ u16 cmd = xm_read16(hw, port, XM_MMU_CMD);
- if (hw->phy_type == SK_PHY_XMAC) {
- msk = xm_read16(hw, port, XM_IMSK);
- msk |= XM_IS_INP_ASS | XM_IS_LIPA_RC | XM_IS_RX_PAGE | XM_IS_AND;
- xm_write16(hw, port, XM_IMSK, msk);
- }
+ xm_write16(hw, port, XM_IMSK, XM_IMSK_DISABLE);
- cmd = xm_read16(hw, port, XM_MMU_CMD);
cmd &= ~(XM_MMU_ENA_RX | XM_MMU_ENA_TX);
xm_write16(hw, port, XM_MMU_CMD, cmd);
+
/* dummy read to ensure writing */
- (void) xm_read16(hw, port, XM_MMU_CMD);
+ xm_read16(hw, port, XM_MMU_CMD);
if (netif_carrier_ok(dev))
skge_link_down(skge);
@@ -1100,7 +1096,7 @@ static void genesis_reset(struct skge_hw *hw, int port)
/* reset the statistics module */
xm_write32(hw, port, XM_GP_PORT, XM_GP_RES_STAT);
- xm_write16(hw, port, XM_IMSK, 0xffff); /* disable XMAC IRQs */
+ xm_write16(hw, port, XM_IMSK, XM_IMSK_DISABLE);
xm_write32(hw, port, XM_MODE, 0); /* clear Mode Reg */
xm_write16(hw, port, XM_TX_CMD, 0); /* reset TX CMD Reg */
xm_write16(hw, port, XM_RX_CMD, 0); /* reset RX CMD Reg */
@@ -1138,7 +1134,7 @@ static void bcom_check_link(struct skge_hw *hw, int port)
u16 status;
/* read twice because of latch */
- (void) xm_phy_read(hw, port, PHY_BCOM_STAT);
+ xm_phy_read(hw, port, PHY_BCOM_STAT);
status = xm_phy_read(hw, port, PHY_BCOM_STAT);
if ((status & PHY_ST_LSYNC) == 0) {
@@ -1339,7 +1335,7 @@ static void xm_phy_init(struct skge_port *skge)
mod_timer(&skge->link_timer, jiffies + LINK_HZ);
}
-static void xm_check_link(struct net_device *dev)
+static int xm_check_link(struct net_device *dev)
{
struct skge_port *skge = netdev_priv(dev);
struct skge_hw *hw = skge->hw;
@@ -1347,25 +1343,25 @@ static void xm_check_link(struct net_device *dev)
u16 status;
/* read twice because of latch */
- (void) xm_phy_read(hw, port, PHY_XMAC_STAT);
+ xm_phy_read(hw, port, PHY_XMAC_STAT);
status = xm_phy_read(hw, port, PHY_XMAC_STAT);
if ((status & PHY_ST_LSYNC) == 0) {
xm_link_down(hw, port);
- return;
+ return 0;
}
if (skge->autoneg == AUTONEG_ENABLE) {
u16 lpa, res;
if (!(status & PHY_ST_AN_OVER))
- return;
+ return 0;
lpa = xm_phy_read(hw, port, PHY_XMAC_AUNE_LP);
if (lpa & PHY_B_AN_RF) {
printk(KERN_NOTICE PFX "%s: remote fault\n",
dev->name);
- return;
+ return 0;
}
res = xm_phy_read(hw, port, PHY_XMAC_RES_ABI);
@@ -1381,7 +1377,7 @@ static void xm_check_link(struct net_device *dev)
default:
printk(KERN_NOTICE PFX "%s: duplex mismatch\n",
dev->name);
- return;
+ return 0;
}
/* We are using IEEE 802.3z/D5.0 Table 37-4 */
@@ -1405,11 +1401,14 @@ static void xm_check_link(struct net_device *dev)
if (!netif_carrier_ok(dev))
genesis_link_up(skge);
+ return 1;
}
/* Poll to check for link coming up.
+ *
* Since internal PHY is wired to a level triggered pin, can't
- * get an interrupt when carrier is detected.
+ * get an interrupt when carrier is detected, need to poll for
+ * link coming up.
*/
static void xm_link_timer(unsigned long arg)
{
@@ -1417,29 +1416,35 @@ static void xm_link_timer(unsigned long arg)
struct net_device *dev = skge->netdev;
struct skge_hw *hw = skge->hw;
int port = skge->port;
+ int i;
+ unsigned long flags;
if (!netif_running(dev))
return;
- if (netif_carrier_ok(dev)) {
+ spin_lock_irqsave(&hw->phy_lock, flags);
+
+ /*
+ * Verify that the link by checking GPIO register three times.
+ * This pin has the signal from the link_sync pin connected to it.
+ */
+ for (i = 0; i < 3; i++) {
+ if (xm_read16(hw, port, XM_GP_PORT) & XM_GP_INP_ASS)
+ goto link_down;
+ }
+
+ /* Re-enable interrupt to detect link down */
+ if (xm_check_link(dev)) {
+ u16 msk = xm_read16(hw, port, XM_IMSK);
+ msk &= ~XM_IS_INP_ASS;
+ xm_write16(hw, port, XM_IMSK, msk);
xm_read16(hw, port, XM_ISRC);
- if (!(xm_read16(hw, port, XM_ISRC) & XM_IS_INP_ASS))
- goto nochange;
} else {
- if (xm_read32(hw, port, XM_GP_PORT) & XM_GP_INP_ASS)
- goto nochange;
- xm_read16(hw, port, XM_ISRC);
- if (xm_read16(hw, port, XM_ISRC) & XM_IS_INP_ASS)
- goto nochange;
+link_down:
+ mod_timer(&skge->link_timer,
+ round_jiffies(jiffies + LINK_HZ));
}
-
- spin_lock(&hw->phy_lock);
- xm_check_link(dev);
- spin_unlock(&hw->phy_lock);
-
-nochange:
- if (netif_running(dev))
- mod_timer(&skge->link_timer, jiffies + LINK_HZ);
+ spin_unlock_irqrestore(&hw->phy_lock, flags);
}
static void genesis_mac_init(struct skge_hw *hw, int port)
@@ -1683,14 +1688,16 @@ static void genesis_mac_intr(struct skge_hw *hw, int port)
printk(KERN_DEBUG PFX "%s: mac interrupt status 0x%x\n",
skge->netdev->name, status);
- if (hw->phy_type == SK_PHY_XMAC &&
- (status & (XM_IS_INP_ASS | XM_IS_LIPA_RC)))
- xm_link_down(hw, port);
+ if (hw->phy_type == SK_PHY_XMAC && (status & XM_IS_INP_ASS)) {
+ xm_link_down(hw, port);
+ mod_timer(&skge->link_timer, jiffies + 1);
+ }
if (status & XM_IS_TXF_UR) {
xm_write32(hw, port, XM_MODE, XM_MD_FTF);
++skge->net_stats.tx_fifo_errors;
}
+
if (status & XM_IS_RXF_OV) {
xm_write32(hw, port, XM_MODE, XM_MD_FRF);
++skge->net_stats.rx_fifo_errors;
@@ -1750,11 +1757,12 @@ static void genesis_link_up(struct skge_port *skge)
}
xm_write32(hw, port, XM_MODE, mode);
- msk = XM_DEF_MSK;
- if (hw->phy_type != SK_PHY_XMAC)
- msk |= XM_IS_INP_ASS; /* disable GP0 interrupt bit */
+ /* Turn on detection of Tx underrun, Rx overrun */
+ msk = xm_read16(hw, port, XM_IMSK);
+ msk &= ~(XM_IS_RXF_OV | XM_IS_TXF_UR);
xm_write16(hw, port, XM_IMSK, msk);
+
xm_read16(hw, port, XM_ISRC);
/* get MMU Command Reg. */
@@ -2185,7 +2193,7 @@ static void yukon_mac_intr(struct skge_hw *hw, int port)
u8 status = skge_read8(hw, SK_REG(port, GMAC_IRQ_SRC));
if (netif_msg_intr(skge))
- printk(KERN_DEBUG PFX "%s: mac interrupt status 0x%x\n",
+ printk(KERN_DEBUG PFX "%s: yukon mac interrupt status 0x%x\n",
dev->name, status);
if (status & GM_IS_RX_FF_OR) {
diff --git a/drivers/net/skge.h b/drivers/net/skge.h
index edd7146..323d6c6 100644
--- a/drivers/net/skge.h
+++ b/drivers/net/skge.h
@@ -2193,11 +2193,9 @@ enum {
XM_IS_TXF_UR = 1<<2, /* Bit 2: Transmit FIFO Underrun */
XM_IS_TX_COMP = 1<<1, /* Bit 1: Frame Tx Complete */
XM_IS_RX_COMP = 1<<0, /* Bit 0: Frame Rx Complete */
-};
-
-#define XM_DEF_MSK (~(XM_IS_INP_ASS | XM_IS_LIPA_RC | \
- XM_IS_RXF_OV | XM_IS_TXF_UR))
+ XM_IMSK_DISABLE = 0xffff,
+};
/* XM_HW_CFG 16 bit r/w Hardware Config Register */
enum {
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
index ea117fc..2575077 100644
--- a/drivers/net/sky2.c
+++ b/drivers/net/sky2.c
@@ -603,21 +603,22 @@ static void sky2_phy_init(struct sky2_hw *hw, unsigned port)
static void sky2_phy_power(struct sky2_hw *hw, unsigned port, int onoff)
{
u32 reg1;
- static const u32 phy_power[]
- = { PCI_Y2_PHY1_POWD, PCI_Y2_PHY2_POWD };
-
- /* looks like this XL is back asswards .. */
- if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > 1)
- onoff = !onoff;
+ static const u32 phy_power[] = { PCI_Y2_PHY1_POWD, PCI_Y2_PHY2_POWD };
+ static const u32 coma_mode[] = { PCI_Y2_PHY1_COMA, PCI_Y2_PHY2_COMA };
sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON);
reg1 = sky2_pci_read32(hw, PCI_DEV_REG1);
+
if (onoff)
/* Turn off phy power saving */
reg1 &= ~phy_power[port];
else
reg1 |= phy_power[port];
+ if (onoff && hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > 1)
+ reg1 |= coma_mode[port];
+
+
sky2_pci_write32(hw, PCI_DEV_REG1, reg1);
sky2_pci_read32(hw, PCI_DEV_REG1);
sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
@@ -2246,20 +2247,26 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do)
while (hw->st_idx != hwidx) {
struct sky2_port *sky2;
struct sky2_status_le *le = hw->st_le + hw->st_idx;
- unsigned port = le->css & CSS_LINK_BIT;
+ unsigned port;
struct net_device *dev;
struct sk_buff *skb;
u32 status;
u16 length;
+ u8 opcode = le->opcode;
+
+ if (!(opcode & HW_OWNER))
+ break;
hw->st_idx = RING_NEXT(hw->st_idx, STATUS_RING_SIZE);
+ port = le->css & CSS_LINK_BIT;
dev = hw->dev[port];
sky2 = netdev_priv(dev);
length = le16_to_cpu(le->length);
status = le32_to_cpu(le->status);
- switch (le->opcode & ~HW_OWNER) {
+ le->opcode = 0;
+ switch (opcode & ~HW_OWNER) {
case OP_RXSTAT:
++rx[port];
skb = sky2_receive(dev, length, status);
@@ -2352,7 +2359,7 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do)
default:
if (net_ratelimit())
printk(KERN_WARNING PFX
- "unknown status opcode 0x%x\n", le->opcode);
+ "unknown status opcode 0x%x\n", opcode);
}
}
@@ -3564,20 +3571,64 @@ static void sky2_get_regs(struct net_device *dev, struct ethtool_regs *regs,
{
const struct sky2_port *sky2 = netdev_priv(dev);
const void __iomem *io = sky2->hw->regs;
+ unsigned int b;
regs->version = 1;
- memset(p, 0, regs->len);
- memcpy_fromio(p, io, B3_RAM_ADDR);
-
- /* skip diagnostic ram region */
- memcpy_fromio(p + B3_RI_WTO_R1, io + B3_RI_WTO_R1, 0x2000 - B3_RI_WTO_R1);
+ for (b = 0; b < 128; b++) {
+ /* This complicated switch statement is to make sure and
+ * only access regions that are unreserved.
+ * Some blocks are only valid on dual port cards.
+ * and block 3 has some special diagnostic registers that
+ * are poison.
+ */
+ switch (b) {
+ case 3:
+ /* skip diagnostic ram region */
+ memcpy_fromio(p + 0x10, io + 0x10, 128 - 0x10);
+ break;
- /* copy GMAC registers */
- memcpy_fromio(p + BASE_GMAC_1, io + BASE_GMAC_1, 0x1000);
- if (sky2->hw->ports > 1)
- memcpy_fromio(p + BASE_GMAC_2, io + BASE_GMAC_2, 0x1000);
+ /* dual port cards only */
+ case 5: /* Tx Arbiter 2 */
+ case 9: /* RX2 */
+ case 14 ... 15: /* TX2 */
+ case 17: case 19: /* Ram Buffer 2 */
+ case 22 ... 23: /* Tx Ram Buffer 2 */
+ case 25: /* Rx MAC Fifo 1 */
+ case 27: /* Tx MAC Fifo 2 */
+ case 31: /* GPHY 2 */
+ case 40 ... 47: /* Pattern Ram 2 */
+ case 52: case 54: /* TCP Segmentation 2 */
+ case 112 ... 116: /* GMAC 2 */
+ if (sky2->hw->ports == 1)
+ goto reserved;
+ /* fall through */
+ case 0: /* Control */
+ case 2: /* Mac address */
+ case 4: /* Tx Arbiter 1 */
+ case 7: /* PCI express reg */
+ case 8: /* RX1 */
+ case 12 ... 13: /* TX1 */
+ case 16: case 18:/* Rx Ram Buffer 1 */
+ case 20 ... 21: /* Tx Ram Buffer 1 */
+ case 24: /* Rx MAC Fifo 1 */
+ case 26: /* Tx MAC Fifo 1 */
+ case 28 ... 29: /* Descriptor and status unit */
+ case 30: /* GPHY 1*/
+ case 32 ... 39: /* Pattern Ram 1 */
+ case 48: case 50: /* TCP Segmentation 1 */
+ case 56 ... 60: /* PCI space */
+ case 80 ... 84: /* GMAC 1 */
+ memcpy_fromio(p, io, 128);
+ break;
+ default:
+reserved:
+ memset(p, 0, 128);
+ }
+ p += 128;
+ io += 128;
+ }
}
/* In order to do Jumbo packets on these chips, need to turn off the
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
index 9034a05..f80721e 100644
--- a/drivers/net/tg3.c
+++ b/drivers/net/tg3.c
@@ -64,8 +64,8 @@
#define DRV_MODULE_NAME "tg3"
#define PFX DRV_MODULE_NAME ": "
-#define DRV_MODULE_VERSION "3.81"
-#define DRV_MODULE_RELDATE "September 5, 2007"
+#define DRV_MODULE_VERSION "3.81.1"
+#define DRV_MODULE_RELDATE "October 18, 2007"
#define TG3_DEF_MAC_MODE 0
#define TG3_DEF_RX_MODE 0
@@ -4874,6 +4874,12 @@ static void tg3_restore_pci_state(struct tg3 *tp)
pci_write_config_dword(tp->pdev, TG3PCI_COMMAND, tp->pci_cmd);
+ if (!(tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS)) {
+ pci_write_config_byte(tp->pdev, PCI_CACHE_LINE_SIZE,
+ tp->pci_cacheline_sz);
+ pci_write_config_byte(tp->pdev, PCI_LATENCY_TIMER,
+ tp->pci_lat_timer);
+ }
/* Make sure PCI-X relaxed ordering bit is clear. */
pci_read_config_dword(tp->pdev, TG3PCI_X_CAPS, &val);
val &= ~PCIX_CAPS_RELAXED_ORDERING;
diff --git a/drivers/net/wireless/ipw2100.c b/drivers/net/wireless/ipw2100.c
index 8990585..e690609 100644
--- a/drivers/net/wireless/ipw2100.c
+++ b/drivers/net/wireless/ipw2100.c
@@ -2102,12 +2102,46 @@ static void isr_indicate_rf_kill(struct ipw2100_priv *priv, u32 status)
queue_delayed_work(priv->workqueue, &priv->rf_kill, round_jiffies(HZ));
}
+static void send_scan_event(void *data)
+{
+ struct ipw2100_priv *priv = data;
+ union iwreq_data wrqu;
+
+ wrqu.data.length = 0;
+ wrqu.data.flags = 0;
+ wireless_send_event(priv->net_dev, SIOCGIWSCAN, &wrqu, NULL);
+}
+
+static void ipw2100_scan_event_later(struct work_struct *work)
+{
+ send_scan_event(container_of(work, struct ipw2100_priv,
+ scan_event_later.work));
+}
+
+static void ipw2100_scan_event_now(struct work_struct *work)
+{
+ send_scan_event(container_of(work, struct ipw2100_priv,
+ scan_event_now));
+}
+
static void isr_scan_complete(struct ipw2100_priv *priv, u32 status)
{
IPW_DEBUG_SCAN("scan complete\n");
/* Age the scan results... */
priv->ieee->scans++;
priv->status &= ~STATUS_SCANNING;
+
+ /* Only userspace-requested scan completion events go out immediately */
+ if (!priv->user_requested_scan) {
+ if (!delayed_work_pending(&priv->scan_event_later))
+ queue_delayed_work(priv->workqueue,
+ &priv->scan_event_later,
+ round_jiffies(msecs_to_jiffies(4000)));
+ } else {
+ priv->user_requested_scan = 0;
+ cancel_delayed_work(&priv->scan_event_later);
+ queue_work(priv->workqueue, &priv->scan_event_now);
+ }
}
#ifdef CONFIG_IPW2100_DEBUG
@@ -4376,6 +4410,7 @@ static void ipw2100_kill_workqueue(struct ipw2100_priv *priv)
cancel_delayed_work(&priv->wx_event_work);
cancel_delayed_work(&priv->hang_check);
cancel_delayed_work(&priv->rf_kill);
+ cancel_delayed_work(&priv->scan_event_later);
destroy_workqueue(priv->workqueue);
priv->workqueue = NULL;
}
@@ -6118,6 +6153,8 @@ static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev,
INIT_DELAYED_WORK(&priv->wx_event_work, ipw2100_wx_event_work);
INIT_DELAYED_WORK(&priv->hang_check, ipw2100_hang_check);
INIT_DELAYED_WORK(&priv->rf_kill, ipw2100_rf_kill);
+ INIT_WORK(&priv->scan_event_now, ipw2100_scan_event_now);
+ INIT_DELAYED_WORK(&priv->scan_event_later, ipw2100_scan_event_later);
tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long))
ipw2100_irq_tasklet, (unsigned long)priv);
@@ -7427,6 +7464,8 @@ static int ipw2100_wx_set_scan(struct net_device *dev,
}
IPW_DEBUG_WX("Initiating scan...\n");
+
+ priv->user_requested_scan = 1;
if (ipw2100_set_scan_options(priv) || ipw2100_start_scan(priv)) {
IPW_DEBUG_WX("Start scan failed.\n");
diff --git a/drivers/net/wireless/ipw2100.h b/drivers/net/wireless/ipw2100.h
index de7d384..1ee3348 100644
--- a/drivers/net/wireless/ipw2100.h
+++ b/drivers/net/wireless/ipw2100.h
@@ -588,6 +588,10 @@ struct ipw2100_priv {
struct delayed_work wx_event_work;
struct delayed_work hang_check;
struct delayed_work rf_kill;
+ struct work_struct scan_event_now;
+ struct delayed_work scan_event_later;
+
+ int user_requested_scan;
u32 interrupts;
int tx_interrupts;
diff --git a/drivers/net/wireless/libertas/11d.c b/drivers/net/wireless/libertas/11d.c
index 4cf0ff7..0560270 100644
--- a/drivers/net/wireless/libertas/11d.c
+++ b/drivers/net/wireless/libertas/11d.c
@@ -562,7 +562,7 @@ int libertas_cmd_802_11d_domain_info(wlan_private * priv,
nr_subband * sizeof(struct ieeetypes_subbandset));
cmd->size = cpu_to_le16(sizeof(pdomaininfo->action) +
- domain->header.len +
+ le16_to_cpu(domain->header.len) +
sizeof(struct mrvlietypesheader) +
S_DS_GEN);
} else {
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 4a8f5dc..86fff8d 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -185,14 +185,12 @@ static int wlan_cmd_802_11_set_wep(wlan_private * priv,
switch (pkey->len) {
case KEY_LEN_WEP_40:
- wep->keytype[i] =
- cpu_to_le16(cmd_type_wep_40_bit);
+ wep->keytype[i] = cmd_type_wep_40_bit;
memmove(&wep->keymaterial[i], pkey->key,
pkey->len);
break;
case KEY_LEN_WEP_104:
- wep->keytype[i] =
- cpu_to_le16(cmd_type_wep_104_bit);
+ wep->keytype[i] = cmd_type_wep_104_bit;
memmove(&wep->keymaterial[i], pkey->key,
pkey->len);
break;
diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c
index 2fcc3bf..873c405 100644
--- a/drivers/net/wireless/libertas/wext.c
+++ b/drivers/net/wireless/libertas/wext.c
@@ -973,7 +973,7 @@ static struct iw_statistics *wlan_get_wireless_stats(struct net_device *dev)
/* Quality by TX errors */
priv->wstats.discard.retries = priv->stats.tx_errors;
- tx_retries = le16_to_cpu(adapter->logmsg.retry);
+ tx_retries = le32_to_cpu(adapter->logmsg.retry);
if (tx_retries > 75)
tx_qual = (90 - tx_retries) * POOR / 15;
@@ -989,10 +989,10 @@ static struct iw_statistics *wlan_get_wireless_stats(struct net_device *dev)
(PERFECT - VERY_GOOD) / 50 + VERY_GOOD;
quality = min(quality, tx_qual);
- priv->wstats.discard.code = le16_to_cpu(adapter->logmsg.wepundecryptable);
- priv->wstats.discard.fragment = le16_to_cpu(adapter->logmsg.rxfrag);
+ priv->wstats.discard.code = le32_to_cpu(adapter->logmsg.wepundecryptable);
+ priv->wstats.discard.fragment = le32_to_cpu(adapter->logmsg.rxfrag);
priv->wstats.discard.retries = tx_retries;
- priv->wstats.discard.misc = le16_to_cpu(adapter->logmsg.ackfailure);
+ priv->wstats.discard.misc = le32_to_cpu(adapter->logmsg.ackfailure);
/* Calculate quality */
priv->wstats.qual.qual = max(quality, (u32)100);
diff --git a/drivers/net/wireless/rtl8187_dev.c b/drivers/net/wireless/rtl8187_dev.c
index e61c6d5..66704b8 100644
--- a/drivers/net/wireless/rtl8187_dev.c
+++ b/drivers/net/wireless/rtl8187_dev.c
@@ -78,7 +78,8 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb,
struct rtl8187_tx_hdr *hdr;
struct rtl8187_tx_info *info;
struct urb *urb;
- u32 tmp;
+ __le16 rts_dur = 0;
+ u32 flags;
urb = usb_alloc_urb(0, GFP_ATOMIC);
if (!urb) {
@@ -86,24 +87,24 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb,
return 0;
}
- hdr = (struct rtl8187_tx_hdr *)skb_push(skb, sizeof(*hdr));
- tmp = skb->len - sizeof(*hdr);
- tmp |= RTL8187_TX_FLAG_NO_ENCRYPT;
- tmp |= control->rts_cts_rate << 19;
- tmp |= control->tx_rate << 24;
- if (ieee80211_get_morefrag((struct ieee80211_hdr *)skb))
- tmp |= RTL8187_TX_FLAG_MORE_FRAG;
+ flags = skb->len;
+ flags |= RTL8187_TX_FLAG_NO_ENCRYPT;
+ flags |= control->rts_cts_rate << 19;
+ flags |= control->tx_rate << 24;
+ if (ieee80211_get_morefrag((struct ieee80211_hdr *)skb->data))
+ flags |= RTL8187_TX_FLAG_MORE_FRAG;
if (control->flags & IEEE80211_TXCTL_USE_RTS_CTS) {
- tmp |= RTL8187_TX_FLAG_RTS;
- hdr->rts_duration =
- ieee80211_rts_duration(dev, skb->len, control);
+ flags |= RTL8187_TX_FLAG_RTS;
+ rts_dur = ieee80211_rts_duration(dev, skb->len, control);
}
if (control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT)
- tmp |= RTL8187_TX_FLAG_CTS;
- hdr->flags = cpu_to_le32(tmp);
+ flags |= RTL8187_TX_FLAG_CTS;
+
+ hdr = (struct rtl8187_tx_hdr *)skb_push(skb, sizeof(*hdr));
+ hdr->flags = cpu_to_le32(flags);
hdr->len = 0;
- tmp = control->retry_limit << 8;
- hdr->retry = cpu_to_le32(tmp);
+ hdr->rts_duration = rts_dur;
+ hdr->retry = cpu_to_le32(control->retry_limit << 8);
info = (struct rtl8187_tx_info *)skb->cb;
info->control = kmemdup(control, sizeof(*control), GFP_ATOMIC);
diff --git a/drivers/net/wireless/zd1201.c b/drivers/net/wireless/zd1201.c
index 935b144..d5c0c66 100644
--- a/drivers/net/wireless/zd1201.c
+++ b/drivers/net/wireless/zd1201.c
@@ -327,8 +327,8 @@ static void zd1201_usbrx(struct urb *urb)
memcpy(skb_put(skb, 6), &data[datalen-8], 6);
memcpy(skb_put(skb, 2), &data[datalen-24], 2);
memcpy(skb_put(skb, len), data, len);
- skb->dev->last_rx = jiffies;
skb->protocol = eth_type_trans(skb, zd->dev);
+ skb->dev->last_rx = jiffies;
zd->stats.rx_packets++;
zd->stats.rx_bytes += skb->len;
netif_rx(skb);
@@ -384,8 +384,8 @@ static void zd1201_usbrx(struct urb *urb)
memcpy(skb_put(skb, 2), &data[6], 2);
memcpy(skb_put(skb, len), data+8, len);
}
- skb->dev->last_rx = jiffies;
skb->protocol = eth_type_trans(skb, zd->dev);
+ skb->dev->last_rx = jiffies;
zd->stats.rx_packets++;
zd->stats.rx_bytes += skb->len;
netif_rx(skb);
diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c
index a9c339e..5326301 100644
--- a/drivers/net/wireless/zd1211rw/zd_usb.c
+++ b/drivers/net/wireless/zd1211rw/zd_usb.c
@@ -1041,14 +1041,17 @@ error:
static void disconnect(struct usb_interface *intf)
{
struct net_device *netdev = zd_intf_to_netdev(intf);
- struct zd_mac *mac = zd_netdev_mac(netdev);
- struct zd_usb *usb = &mac->chip.usb;
+ struct zd_mac *mac;
+ struct zd_usb *usb;
/* Either something really bad happened, or we're just dealing with
* a DEVICE_INSTALLER. */
if (netdev == NULL)
return;
+ mac = zd_netdev_mac(netdev);
+ usb = &mac->chip.usb;
+
dev_dbg_f(zd_usb_dev(usb), "\n");
zd_netdev_disconnect(netdev);
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
index 55f307f..85d434b 100644
--- a/include/linux/pci_ids.h
+++ b/include/linux/pci_ids.h
@@ -1233,6 +1233,10 @@
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE 0x0560
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_IDE 0x056C
#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE 0x0759
+#define PCI_DEVICE_ID_NVIDIA_NVENET_32 0x0760
+#define PCI_DEVICE_ID_NVIDIA_NVENET_33 0x0761
+#define PCI_DEVICE_ID_NVIDIA_NVENET_34 0x0762
+#define PCI_DEVICE_ID_NVIDIA_NVENET_35 0x0763
#define PCI_VENDOR_ID_IMS 0x10e0
#define PCI_DEVICE_ID_IMS_TT128 0x9128

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,137 @@
diff --git a/Makefile b/Makefile
index 798ffe9..c0feac2 100644
diff --git a/fs/minix/itree_v1.c b/fs/minix/itree_v1.c
index 1a5f3bf..82d6554 100644
--- a/fs/minix/itree_v1.c
+++ b/fs/minix/itree_v1.c
@@ -23,11 +23,16 @@ static inline block_t *i_data(struct inode *inode)
static int block_to_path(struct inode * inode, long block, int offsets[DEPTH])
{
int n = 0;
+ char b[BDEVNAME_SIZE];
if (block < 0) {
- printk("minix_bmap: block<0\n");
+ printk("MINIX-fs: block_to_path: block %ld < 0 on dev %s\n",
+ block, bdevname(inode->i_sb->s_bdev, b));
} else if (block >= (minix_sb(inode->i_sb)->s_max_size/BLOCK_SIZE)) {
- printk("minix_bmap: block>big\n");
+ if (printk_ratelimit())
+ printk("MINIX-fs: block_to_path: "
+ "block %ld too big on dev %s\n",
+ block, bdevname(inode->i_sb->s_bdev, b));
} else if (block < 7) {
offsets[n++] = block;
} else if ((block -= 7) < 512) {
diff --git a/fs/minix/itree_v2.c b/fs/minix/itree_v2.c
index ad8f0de..f230109 100644
--- a/fs/minix/itree_v2.c
+++ b/fs/minix/itree_v2.c
@@ -23,12 +23,17 @@ static inline block_t *i_data(struct inode *inode)
static int block_to_path(struct inode * inode, long block, int offsets[DEPTH])
{
int n = 0;
+ char b[BDEVNAME_SIZE];
struct super_block *sb = inode->i_sb;
if (block < 0) {
- printk("minix_bmap: block<0\n");
+ printk("MINIX-fs: block_to_path: block %ld < 0 on dev %s\n",
+ block, bdevname(sb->s_bdev, b));
} else if (block >= (minix_sb(inode->i_sb)->s_max_size/sb->s_blocksize)) {
- printk("minix_bmap: block>big\n");
+ if (printk_ratelimit())
+ printk("MINIX-fs: block_to_path: "
+ "block %ld too big on dev %s\n",
+ block, bdevname(sb->s_bdev, b));
} else if (block < 7) {
offsets[n++] = block;
} else if ((block -= 7) < 256) {
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 0d7a77c..a2a4865 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -167,8 +167,6 @@ static void nfs_mark_uptodate(struct page *page, unsigned int base, unsigned int
return;
if (count != nfs_page_length(page))
return;
- if (count != PAGE_CACHE_SIZE)
- zero_user_page(page, count, PAGE_CACHE_SIZE - count, KM_USER0);
SetPageUptodate(page);
}
@@ -643,7 +641,8 @@ static struct nfs_page * nfs_update_request(struct nfs_open_context* ctx,
return ERR_PTR(error);
}
spin_unlock(&inode->i_lock);
- return new;
+ req = new;
+ goto zero_page;
}
spin_unlock(&inode->i_lock);
@@ -671,13 +670,23 @@ static struct nfs_page * nfs_update_request(struct nfs_open_context* ctx,
if (offset < req->wb_offset) {
req->wb_offset = offset;
req->wb_pgbase = offset;
- req->wb_bytes = rqend - req->wb_offset;
+ req->wb_bytes = max(end, rqend) - req->wb_offset;
+ goto zero_page;
}
if (end > rqend)
req->wb_bytes = end - req->wb_offset;
return req;
+zero_page:
+ /* If this page might potentially be marked as up to date,
+ * then we need to zero any uninitalised data. */
+ if (req->wb_pgbase == 0 && req->wb_bytes != PAGE_CACHE_SIZE
+ && !PageUptodate(req->wb_page))
+ zero_user_page(req->wb_page, req->wb_bytes,
+ PAGE_CACHE_SIZE - req->wb_bytes,
+ KM_USER0);
+ return req;
}
int nfs_flush_incompatible(struct file *file, struct page *page)
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c
index f37f25c..0b5e35f 100644
--- a/fs/ocfs2/aops.c
+++ b/fs/ocfs2/aops.c
@@ -661,6 +661,27 @@ static void ocfs2_clear_page_regions(struct page *page,
}
/*
+ * Nonsparse file systems fully allocate before we get to the write
+ * code. This prevents ocfs2_write() from tagging the write as an
+ * allocating one, which means ocfs2_map_page_blocks() might try to
+ * read-in the blocks at the tail of our file. Avoid reading them by
+ * testing i_size against each block offset.
+ */
+static int ocfs2_should_read_blk(struct inode *inode, struct page *page,
+ unsigned int block_start)
+{
+ u64 offset = page_offset(page) + block_start;
+
+ if (ocfs2_sparse_alloc(OCFS2_SB(inode->i_sb)))
+ return 1;
+
+ if (i_size_read(inode) > offset)
+ return 1;
+
+ return 0;
+}
+
+/*
* Some of this taken from block_prepare_write(). We already have our
* mapping by now though, and the entire write will be allocating or
* it won't, so not much need to use BH_New.
@@ -713,6 +734,7 @@ int ocfs2_map_page_blocks(struct page *page, u64 *p_blkno,
set_buffer_uptodate(bh);
} else if (!buffer_uptodate(bh) && !buffer_delay(bh) &&
!buffer_new(bh) &&
+ ocfs2_should_read_blk(inode, page, block_start) &&
(block_start < from || block_end > to)) {
ll_rw_block(READ, 1, &bh);
*wait_bh++=bh;

View File

@ -0,0 +1,39 @@
diff --git a/Makefile b/Makefile
index c0feac2..435a3d7 100644
diff --git a/kernel/exit.c b/kernel/exit.c
index 993369e..096c27d 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -1362,8 +1362,7 @@ static int wait_task_stopped(struct task_struct *p, int delayed_group_leader,
int why = (p->ptrace & PT_PTRACED) ? CLD_TRAPPED : CLD_STOPPED;
exit_code = p->exit_code;
- if (unlikely(!exit_code) ||
- unlikely(p->state & TASK_TRACED))
+ if (unlikely(!exit_code) || unlikely(p->exit_state))
goto bail_ref;
return wait_noreap_copyout(p, pid, uid,
why, (exit_code << 8) | 0x7f,
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index f893e90..c9298a7 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -1012,6 +1012,9 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
if (before(TCP_SKB_CB(ack_skb)->ack_seq, prior_snd_una - tp->max_window))
return 0;
+ if (!tp->packets_out)
+ goto out;
+
/* SACK fastpath:
* if the only SACK change is the increase of the end_seq of
* the first block then only apply that SACK block
@@ -1280,6 +1283,8 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
(!tp->frto_highmark || after(tp->snd_una, tp->frto_highmark)))
tcp_update_reordering(sk, ((tp->fackets_out + 1) - reord), 0);
+out:
+
#if FASTRETRANS_DEBUG > 0
BUG_TRAP((int)tp->sacked_out >= 0);
BUG_TRAP((int)tp->lost_out >= 0);

View File

@ -50,3 +50,10 @@
+ features/all/e1000e-fixes.patch
+ bugfix/all/2.6.23.1
+ bugfix/arm/disable-scsi_acard.patch
+ bugfix/all/stable/2.6.23.2.patch
+ bugfix/all/stable/2.6.23.3.patch
+ bugfix/all/stable/2.6.23.4.patch
+ bugfix/all/stable/2.6.23.5.patch
+ bugfix/all/stable/2.6.23.6.patch
+ bugfix/all/stable/2.6.23.7.patch
+ bugfix/all/stable/2.6.23.8.patch