Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'akpm' (patches from Andrew Morton)

Merge misc fixes from Andrew Morton:
"10 fixes"

* emailed patches from Andrew Morton <akpm@linux-foundation.org>:
slab: fix nodeid bounds check for non-contiguous node IDs
lib/genalloc.c: export devm_gen_pool_create() for modules
mm: fix anon_vma_clone() error treatment
mm: fix swapoff hang after page migration and fork
fat: fix oops on corrupted vfat fs
ipc/sem.c: fully initialize sem_array before making it visible
drivers/input/evdev.c: don't kfree() a vmalloc address
mm/vmpressure.c: fix race in vmpressure_work_fn()
mm: frontswap: invalidate expired data on a dup-store failure
mm: do not overwrite reserved pages counter at show_mem()

+55 -41
+1 -1
drivers/input/evdev.c
··· 421 421 422 422 err_free_client: 423 423 evdev_detach_client(evdev, client); 424 - kfree(client); 424 + kvfree(client); 425 425 return error; 426 426 } 427 427
+11 -9
fs/fat/namei_vfat.c
··· 736 736 } 737 737 738 738 alias = d_find_alias(inode); 739 - if (alias && !vfat_d_anon_disconn(alias)) { 739 + /* 740 + * Checking "alias->d_parent == dentry->d_parent" to make sure 741 + * FS is not corrupted (especially double linked dir). 742 + */ 743 + if (alias && alias->d_parent == dentry->d_parent && 744 + !vfat_d_anon_disconn(alias)) { 740 745 /* 741 746 * This inode has non anonymous-DCACHE_DISCONNECTED 742 747 * dentry. This means, the user did ->lookup() by an ··· 760 755 761 756 out: 762 757 mutex_unlock(&MSDOS_SB(sb)->s_lock); 763 - dentry->d_time = dentry->d_parent->d_inode->i_version; 764 - dentry = d_splice_alias(inode, dentry); 765 - if (dentry) 766 - dentry->d_time = dentry->d_parent->d_inode->i_version; 767 - return dentry; 768 - 758 + if (!inode) 759 + dentry->d_time = dir->i_version; 760 + return d_splice_alias(inode, dentry); 769 761 error: 770 762 mutex_unlock(&MSDOS_SB(sb)->s_lock); 771 763 return ERR_PTR(err); ··· 795 793 inode->i_mtime = inode->i_atime = inode->i_ctime = ts; 796 794 /* timestamp is already written, so mark_inode_dirty() is unneeded. */ 797 795 798 - dentry->d_time = dentry->d_parent->d_inode->i_version; 799 796 d_instantiate(dentry, inode); 800 797 out: 801 798 mutex_unlock(&MSDOS_SB(sb)->s_lock); ··· 825 824 clear_nlink(inode); 826 825 inode->i_mtime = inode->i_atime = CURRENT_TIME_SEC; 827 826 fat_detach(inode); 827 + dentry->d_time = dir->i_version; 828 828 out: 829 829 mutex_unlock(&MSDOS_SB(sb)->s_lock); 830 830 ··· 851 849 clear_nlink(inode); 852 850 inode->i_mtime = inode->i_atime = CURRENT_TIME_SEC; 853 851 fat_detach(inode); 852 + dentry->d_time = dir->i_version; 854 853 out: 855 854 mutex_unlock(&MSDOS_SB(sb)->s_lock); 856 855 ··· 892 889 inode->i_mtime = inode->i_atime = inode->i_ctime = ts; 893 890 /* timestamp is already written, so mark_inode_dirty() is unneeded. */ 894 891 895 - dentry->d_time = dentry->d_parent->d_inode->i_version; 896 892 d_instantiate(dentry, inode); 897 893 898 894 mutex_unlock(&MSDOS_SB(sb)->s_lock);
+8 -7
ipc/sem.c
··· 507 507 return retval; 508 508 } 509 509 510 - id = ipc_addid(&sem_ids(ns), &sma->sem_perm, ns->sc_semmni); 511 - if (id < 0) { 512 - ipc_rcu_putref(sma, sem_rcu_free); 513 - return id; 514 - } 515 - ns->used_sems += nsems; 516 - 517 510 sma->sem_base = (struct sem *) &sma[1]; 518 511 519 512 for (i = 0; i < nsems; i++) { ··· 521 528 INIT_LIST_HEAD(&sma->list_id); 522 529 sma->sem_nsems = nsems; 523 530 sma->sem_ctime = get_seconds(); 531 + 532 + id = ipc_addid(&sem_ids(ns), &sma->sem_perm, ns->sc_semmni); 533 + if (id < 0) { 534 + ipc_rcu_putref(sma, sem_rcu_free); 535 + return id; 536 + } 537 + ns->used_sems += nsems; 538 + 524 539 sem_unlock(sma, -1); 525 540 rcu_read_unlock(); 526 541
+1
lib/genalloc.c
··· 598 598 599 599 return pool; 600 600 } 601 + EXPORT_SYMBOL(devm_gen_pool_create); 601 602 602 603 /** 603 604 * dev_get_gen_pool - Obtain the gen_pool (if any) for a device
+1 -1
lib/show_mem.c
··· 28 28 continue; 29 29 30 30 total += zone->present_pages; 31 - reserved = zone->present_pages - zone->managed_pages; 31 + reserved += zone->present_pages - zone->managed_pages; 32 32 33 33 if (is_highmem_idx(zoneid)) 34 34 highmem += zone->present_pages;
+3 -1
mm/frontswap.c
··· 244 244 the (older) page from frontswap 245 245 */ 246 246 inc_frontswap_failed_stores(); 247 - if (dup) 247 + if (dup) { 248 248 __frontswap_clear(sis, offset); 249 + frontswap_ops->invalidate_page(type, offset); 250 + } 249 251 } 250 252 if (frontswap_writethrough_enabled) 251 253 /* report failure so swap also writes to swap device */
+12 -12
mm/memory.c
··· 815 815 if (!pte_file(pte)) { 816 816 swp_entry_t entry = pte_to_swp_entry(pte); 817 817 818 - if (swap_duplicate(entry) < 0) 819 - return entry.val; 818 + if (likely(!non_swap_entry(entry))) { 819 + if (swap_duplicate(entry) < 0) 820 + return entry.val; 820 821 821 - /* make sure dst_mm is on swapoff's mmlist. */ 822 - if (unlikely(list_empty(&dst_mm->mmlist))) { 823 - spin_lock(&mmlist_lock); 824 - if (list_empty(&dst_mm->mmlist)) 825 - list_add(&dst_mm->mmlist, 826 - &src_mm->mmlist); 827 - spin_unlock(&mmlist_lock); 828 - } 829 - if (likely(!non_swap_entry(entry))) 822 + /* make sure dst_mm is on swapoff's mmlist. */ 823 + if (unlikely(list_empty(&dst_mm->mmlist))) { 824 + spin_lock(&mmlist_lock); 825 + if (list_empty(&dst_mm->mmlist)) 826 + list_add(&dst_mm->mmlist, 827 + &src_mm->mmlist); 828 + spin_unlock(&mmlist_lock); 829 + } 830 830 rss[MM_SWAPENTS]++; 831 - else if (is_migration_entry(entry)) { 831 + } else if (is_migration_entry(entry)) { 832 832 page = migration_entry_to_page(entry); 833 833 834 834 if (PageAnon(page))
+7 -3
mm/mmap.c
··· 776 776 * shrinking vma had, to cover any anon pages imported. 777 777 */ 778 778 if (exporter && exporter->anon_vma && !importer->anon_vma) { 779 - if (anon_vma_clone(importer, exporter)) 780 - return -ENOMEM; 779 + int error; 780 + 781 + error = anon_vma_clone(importer, exporter); 782 + if (error) 783 + return error; 781 784 importer->anon_vma = exporter->anon_vma; 782 785 } 783 786 } ··· 2472 2469 if (err) 2473 2470 goto out_free_vma; 2474 2471 2475 - if (anon_vma_clone(new, vma)) 2472 + err = anon_vma_clone(new, vma); 2473 + if (err) 2476 2474 goto out_free_mpol; 2477 2475 2478 2476 if (new->vm_file)
+4 -2
mm/rmap.c
··· 274 274 { 275 275 struct anon_vma_chain *avc; 276 276 struct anon_vma *anon_vma; 277 + int error; 277 278 278 279 /* Don't bother if the parent process has no anon_vma here. */ 279 280 if (!pvma->anon_vma) ··· 284 283 * First, attach the new VMA to the parent VMA's anon_vmas, 285 284 * so rmap can find non-COWed pages in child processes. 286 285 */ 287 - if (anon_vma_clone(vma, pvma)) 288 - return -ENOMEM; 286 + error = anon_vma_clone(vma, pvma); 287 + if (error) 288 + return error; 289 289 290 290 /* Then add our own anon_vma. */ 291 291 anon_vma = anon_vma_alloc();
+1 -1
mm/slab.c
··· 3076 3076 void *obj; 3077 3077 int x; 3078 3078 3079 - VM_BUG_ON(nodeid > num_online_nodes()); 3079 + VM_BUG_ON(nodeid < 0 || nodeid >= MAX_NUMNODES); 3080 3080 n = get_node(cachep, nodeid); 3081 3081 BUG_ON(!n); 3082 3082
+6 -4
mm/vmpressure.c
··· 165 165 unsigned long scanned; 166 166 unsigned long reclaimed; 167 167 168 + spin_lock(&vmpr->sr_lock); 168 169 /* 169 170 * Several contexts might be calling vmpressure(), so it is 170 171 * possible that the work was rescheduled again before the old ··· 174 173 * here. No need for any locks here since we don't care if 175 174 * vmpr->reclaimed is in sync. 176 175 */ 177 - if (!vmpr->scanned) 178 - return; 179 - 180 - spin_lock(&vmpr->sr_lock); 181 176 scanned = vmpr->scanned; 177 + if (!scanned) { 178 + spin_unlock(&vmpr->sr_lock); 179 + return; 180 + } 181 + 182 182 reclaimed = vmpr->reclaimed; 183 183 vmpr->scanned = 0; 184 184 vmpr->reclaimed = 0;