Linux 3.0.83
Greg KH
maintainerI'm announcing the release of the 3.0.83 kernel.
All users of the 3.0 kernel series must upgrade.
The updated 3.0.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-3.0.y
and can be browsed at the normal kernel.org git web browser:
http://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 +- arch/x86/kernel/relocate_kernel_64.S | 2 +- drivers/gpu/drm/i915/intel_sdvo.c | 10 ++++++---- drivers/net/wireless/ath/ath9k/init.c | 3 +-- drivers/net/wireless/b43/main.c | 2 +- fs/ceph/super.c | 7 ++++++- fs/ceph/super.h | 2 +- include/linux/swapops.h | 3 +++ mm/hugetlb.c | 2 +- mm/migrate.c | 23 ++++++++++++++++++----- mm/swap_state.c | 18 +++++++++++++++++- 11 files changed, 56 insertions(+), 18 deletions(-)
Daniel Vetter (1):
drm/i915: prefer VBT modes for SVDO-LVDS over EDID
Greg Kroah-Hartman (1):
Linux 3.0.83
Kees Cook (2):
b43: stop format string leaking into error msgs
x86: Fix typo in kexec register clearing
Naoya Horiguchi (1):
mm: migration: add migrate_entry_wait_huge()
Rafael Aquini (1):
swap: avoid read_swap_cache_async() race to deadlock while waiting on discard I/O completion
Sage Weil (1):
ceph: fix statvfs fr_size
Sujith Manoharan (1):
ath9k: Disable PowerSave by default
Greg KH
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 3 PATCHLEVEL = 0 -SUBLEVEL = 82 +SUBLEVEL = 83 EXTRAVERSION = NAME = Sneaky Weasel
arch/x86/kernel/relocate_kernel_64.S +1 -1
@@ -160,7 +160,7 @@ identity_mapped: xorq %rbp, %rbp xorq %r8, %r8 xorq %r9, %r9 - xorq %r10, %r9 + xorq %r10, %r10 xorq %r11, %r11 xorq %r12, %r12 xorq %r13, %r13
drivers/gpu/drm/i915/intel_sdvo.c +6 -4
@@ -1610,10 +1610,13 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector)* arranged in priority order. */ intel_ddc_get_modes (connector, &intel_sdvo->ddc); -if (list_empty (&connector->probed_modes) == false) - goto end; -/* Fetch modes from VBT */ +/* +* Fetch modes from VBT. For SDVO prefer the VBT mode since some +* SDVO->LVDS transcoders can't cope with the EDID mode. Since +* drm_mode_probed_add adds the mode at the head of the list we add it +* last. +*/ if (dev_priv->sdvo_lvds_vbt_mode !=NULL ) { newmode =drm_mode_duplicate (connector->dev, dev_priv->sdvo_lvds_vbt_mode);
@@ -1625,7 +1628,6 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector) } } -end:list_for_each_entry (newmode, &connector->probed_modes, head) {if (newmode->type &DRM_MODE_TYPE_PREFERRED ) { intel_sdvo->sdvo_lvds_fixed_mode =
drivers/net/wireless/ath/ath9k/init.c +1 -2
@@ -704,8 +704,7 @@ void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)BIT (NL80211_IFTYPE_ADHOC ) |BIT (NL80211_IFTYPE_MESH_POINT ); -if (AR_SREV_5416 (sc->sc_ah)) - hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT ; + hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT ; hw->wiphy->flags |=WIPHY_FLAG_IBSS_RSN ;
drivers/net/wireless/b43/main.c +1 -1
@@ -2309,7 +2309,7 @@ static int b43_request_firmware(struct b43_wldev *dev)for (i =0 ; i <B43_NR_FWTYPES ; i++) { errmsg = ctx->errors[i];if (strlen (errmsg)) -b43err (dev->wl, errmsg); +b43err (dev->wl,"%s" , errmsg); }b43_print_fw_helptext (dev->wl,1 ); err = -ENOENT ;
fs/ceph/super.c +6 -1
@@ -70,8 +70,14 @@ static int ceph_statfs(struct dentry *dentry, struct kstatfs *buf)/* * express utilization in terms of large blocks to avoid * overflow on 32-bit machines. +* +* NOTE: for the time being, we make bsize == frsize to humor +* not-yet-ancient versions of glibc that are broken. +* Someday, we will probably want to report a real block +* size... whatever that may mean for a network file system! */ buf->f_bsize =1 <<CEPH_BLOCK_SHIFT ; + buf->f_frsize =1 <<CEPH_BLOCK_SHIFT ; buf->f_blocks =le64_to_cpu (st.kb) >> (CEPH_BLOCK_SHIFT -10 ); buf->f_bfree = (le64_to_cpu (st.kb) -le64_to_cpu (st.kb_used)) >> (CEPH_BLOCK_SHIFT -10 );
@@ -80,7 +86,6 @@ static int ceph_statfs(struct dentry *dentry, struct kstatfs *buf) buf->f_files =le64_to_cpu (st.num_objects); buf->f_ffree =-1 ; buf->f_namelen =NAME_MAX ; - buf->f_frsize =PAGE_CACHE_SIZE ;/* leave fsid little-endian, regardless of host endianness */ fsid = *(u64 *)(&monmap->fsid) ^ *((u64 *)&monmap->fsid +1 );
fs/ceph/super.h +1 -1
@@ -21,7 +21,7 @@/* large granularity for statfs utilization stats to facilitate * large volume sizes on 32-bit machines. */ -#define CEPH_BLOCK_SHIFT 20/* 1 MB */ +#define CEPH_BLOCK_SHIFT 22/* 4 MB */ #define CEPH_BLOCK (1 << CEPH_BLOCK_SHIFT)#define CEPH_MOUNT_OPT_DIRSTAT (1<<4)/* `cat dirname` for stats */
include/linux/swapops.h +3 -0
@@ -113,6 +113,7 @@ static inline void make_migration_entry_read(swp_entry_t *entry)extern void migration_entry_wait (struct mm_struct *mm,pmd_t *pmd,unsigned long address); +extern void migration_entry_wait_huge (struct mm_struct *mm,pte_t *pte);#else #define make_migration_entry (page, write) swp_entry(0, 0)
@@ -124,6 +125,8 @@ static inline int is_migration_entry(swp_entry_t swp)static inline void make_migration_entry_read (swp_entry_t *entryp) { }static inline void migration_entry_wait (struct mm_struct *mm,pmd_t *pmd,unsigned long address) { } +static inline void migration_entry_wait_huge (struct mm_struct *mm, +pte_t *pte) { }static inline int is_write_migration_entry (swp_entry_t entry) {return 0 ;
mm/hugetlb.c +1 -1
@@ -2662,7 +2662,7 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,if (ptep) { entry =huge_ptep_get (ptep);if (unlikely (is_hugetlb_entry_migration (entry))) { -migration_entry_wait (mm, (pmd_t *)ptep, address); +migration_entry_wait_huge (mm, ptep);return 0 ; }else if (unlikely (is_hugetlb_entry_hwpoisoned (entry))) return VM_FAULT_HWPOISON_LARGE |
mm/migrate.c +18 -5
@@ -184,15 +184,14 @@ static void remove_migration_ptes(struct page *old, struct page *new)* * This function is called from do_swap_page(). */ -void migration_entry_wait (struct mm_struct *mm,pmd_t *pmd, -unsigned long address) +static void __migration_entry_wait (struct mm_struct *mm,pte_t *ptep, +spinlock_t *ptl) { -pte_t *ptep, pte; -spinlock_t *ptl; +pte_t pte;swp_entry_t entry;struct page *page; - ptep =pte_offset_map_lock (mm, pmd, address, &ptl); +spin_lock (ptl); pte = *ptep;if (!is_swap_pte (pte)) goto out;
@@ -220,6 +219,20 @@ out:pte_unmap_unlock (ptep, ptl); } +void migration_entry_wait (struct mm_struct *mm,pmd_t *pmd, +unsigned long address) +{ +spinlock_t *ptl =pte_lockptr (mm, pmd); +pte_t *ptep =pte_offset_map (pmd, address); +__migration_entry_wait (mm, ptep, ptl); +} + +void migration_entry_wait_huge (struct mm_struct *mm,pte_t *pte) +{ +spinlock_t *ptl = &(mm)->page_table_lock; +__migration_entry_wait (mm, pte, ptl); +} +#ifdef CONFIG_BLOCK /* Returns true if all buffers are successfully locked */ static bool buffer_migrate_lock_buffers(struct buffer_head *head,
mm/swap_state.c +17 -1
@@ -315,8 +315,24 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,* Swap entry may have been freed since our caller observed it. */ err =swapcache_prepare (entry); -if (err == -EEXIST ) {/* seems racy */ +if (err == -EEXIST ) {radix_tree_preload_end (); +/* +* We might race against get_swap_page() and stumble +* across a SWAP_HAS_CACHE swap_map entry whose page +* has not been brought into the swapcache yet, while +* the other end is scheduled away waiting on discard +* I/O completion at scan_swap_map(). +* +* In order to avoid turning this transitory state +* into a permanent loop around this -EEXIST case +* if !CONFIG_PREEMPT and the I/O completion happens +* to be waiting on the CPU waitqueue where we are now +* busy looping, we just conditionally invoke the +* scheduler here, if there are some more important +* tasks to run. +*/ +cond_resched ();continue ; }if (err) {/* swp entry is obsolete ? */