diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/fadvise.c | 2 | ||||
-rw-r--r-- | mm/filemap.c | 11 | ||||
-rw-r--r-- | mm/filemap_xip.c | 2 | ||||
-rw-r--r-- | mm/memory.c | 32 | ||||
-rw-r--r-- | mm/mempolicy.c | 2 | ||||
-rw-r--r-- | mm/mmap.c | 10 | ||||
-rw-r--r-- | mm/nommu.c | 12 | ||||
-rw-r--r-- | mm/page-writeback.c | 89 | ||||
-rw-r--r-- | mm/page_alloc.c | 93 | ||||
-rw-r--r-- | mm/readahead.c | 4 | ||||
-rw-r--r-- | mm/shmem.c | 20 | ||||
-rw-r--r-- | mm/slab.c | 88 | ||||
-rw-r--r-- | mm/swapfile.c | 4 | ||||
-rw-r--r-- | mm/tiny-shmem.c | 4 | ||||
-rw-r--r-- | mm/truncate.c | 4 |
15 files changed, 279 insertions, 98 deletions
diff --git a/mm/fadvise.c b/mm/fadvise.c index 168c78a121bb..0df4c899e979 100644 --- a/mm/fadvise.c +++ b/mm/fadvise.c | |||
@@ -38,7 +38,7 @@ asmlinkage long sys_fadvise64_64(int fd, loff_t offset, loff_t len, int advice) | |||
38 | if (!file) | 38 | if (!file) |
39 | return -EBADF; | 39 | return -EBADF; |
40 | 40 | ||
41 | if (S_ISFIFO(file->f_dentry->d_inode->i_mode)) { | 41 | if (S_ISFIFO(file->f_path.dentry->d_inode->i_mode)) { |
42 | ret = -ESPIPE; | 42 | ret = -ESPIPE; |
43 | goto out; | 43 | goto out; |
44 | } | 44 | } |
diff --git a/mm/filemap.c b/mm/filemap.c index af7e2f5caea9..8332c77b1bd1 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -1181,8 +1181,6 @@ generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov, | |||
1181 | if (pos < size) { | 1181 | if (pos < size) { |
1182 | retval = generic_file_direct_IO(READ, iocb, | 1182 | retval = generic_file_direct_IO(READ, iocb, |
1183 | iov, pos, nr_segs); | 1183 | iov, pos, nr_segs); |
1184 | if (retval > 0 && !is_sync_kiocb(iocb)) | ||
1185 | retval = -EIOCBQUEUED; | ||
1186 | if (retval > 0) | 1184 | if (retval > 0) |
1187 | *ppos = pos + retval; | 1185 | *ppos = pos + retval; |
1188 | } | 1186 | } |
@@ -2047,15 +2045,14 @@ generic_file_direct_write(struct kiocb *iocb, const struct iovec *iov, | |||
2047 | * Sync the fs metadata but not the minor inode changes and | 2045 | * Sync the fs metadata but not the minor inode changes and |
2048 | * of course not the data as we did direct DMA for the IO. | 2046 | * of course not the data as we did direct DMA for the IO. |
2049 | * i_mutex is held, which protects generic_osync_inode() from | 2047 | * i_mutex is held, which protects generic_osync_inode() from |
2050 | * livelocking. | 2048 | * livelocking. AIO O_DIRECT ops attempt to sync metadata here. |
2051 | */ | 2049 | */ |
2052 | if (written >= 0 && ((file->f_flags & O_SYNC) || IS_SYNC(inode))) { | 2050 | if ((written >= 0 || written == -EIOCBQUEUED) && |
2051 | ((file->f_flags & O_SYNC) || IS_SYNC(inode))) { | ||
2053 | int err = generic_osync_inode(inode, mapping, OSYNC_METADATA); | 2052 | int err = generic_osync_inode(inode, mapping, OSYNC_METADATA); |
2054 | if (err < 0) | 2053 | if (err < 0) |
2055 | written = err; | 2054 | written = err; |
2056 | } | 2055 | } |
2057 | if (written == count && !is_sync_kiocb(iocb)) | ||
2058 | written = -EIOCBQUEUED; | ||
2059 | return written; | 2056 | return written; |
2060 | } | 2057 | } |
2061 | EXPORT_SYMBOL(generic_file_direct_write); | 2058 | EXPORT_SYMBOL(generic_file_direct_write); |
@@ -2269,7 +2266,7 @@ __generic_file_aio_write_nolock(struct kiocb *iocb, const struct iovec *iov, | |||
2269 | if (count == 0) | 2266 | if (count == 0) |
2270 | goto out; | 2267 | goto out; |
2271 | 2268 | ||
2272 | err = remove_suid(file->f_dentry); | 2269 | err = remove_suid(file->f_path.dentry); |
2273 | if (err) | 2270 | if (err) |
2274 | goto out; | 2271 | goto out; |
2275 | 2272 | ||
diff --git a/mm/filemap_xip.c b/mm/filemap_xip.c index b4fd0d7c9bfb..8d667617f558 100644 --- a/mm/filemap_xip.c +++ b/mm/filemap_xip.c | |||
@@ -379,7 +379,7 @@ xip_file_write(struct file *filp, const char __user *buf, size_t len, | |||
379 | if (count == 0) | 379 | if (count == 0) |
380 | goto out_backing; | 380 | goto out_backing; |
381 | 381 | ||
382 | ret = remove_suid(filp->f_dentry); | 382 | ret = remove_suid(filp->f_path.dentry); |
383 | if (ret) | 383 | if (ret) |
384 | goto out_backing; | 384 | goto out_backing; |
385 | 385 | ||
diff --git a/mm/memory.c b/mm/memory.c index 4198df0dff1c..bf6100236e62 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -1110,23 +1110,29 @@ static int zeromap_pte_range(struct mm_struct *mm, pmd_t *pmd, | |||
1110 | { | 1110 | { |
1111 | pte_t *pte; | 1111 | pte_t *pte; |
1112 | spinlock_t *ptl; | 1112 | spinlock_t *ptl; |
1113 | int err = 0; | ||
1113 | 1114 | ||
1114 | pte = pte_alloc_map_lock(mm, pmd, addr, &ptl); | 1115 | pte = pte_alloc_map_lock(mm, pmd, addr, &ptl); |
1115 | if (!pte) | 1116 | if (!pte) |
1116 | return -ENOMEM; | 1117 | return -EAGAIN; |
1117 | arch_enter_lazy_mmu_mode(); | 1118 | arch_enter_lazy_mmu_mode(); |
1118 | do { | 1119 | do { |
1119 | struct page *page = ZERO_PAGE(addr); | 1120 | struct page *page = ZERO_PAGE(addr); |
1120 | pte_t zero_pte = pte_wrprotect(mk_pte(page, prot)); | 1121 | pte_t zero_pte = pte_wrprotect(mk_pte(page, prot)); |
1122 | |||
1123 | if (unlikely(!pte_none(*pte))) { | ||
1124 | err = -EEXIST; | ||
1125 | pte++; | ||
1126 | break; | ||
1127 | } | ||
1121 | page_cache_get(page); | 1128 | page_cache_get(page); |
1122 | page_add_file_rmap(page); | 1129 | page_add_file_rmap(page); |
1123 | inc_mm_counter(mm, file_rss); | 1130 | inc_mm_counter(mm, file_rss); |
1124 | BUG_ON(!pte_none(*pte)); | ||
1125 | set_pte_at(mm, addr, pte, zero_pte); | 1131 | set_pte_at(mm, addr, pte, zero_pte); |
1126 | } while (pte++, addr += PAGE_SIZE, addr != end); | 1132 | } while (pte++, addr += PAGE_SIZE, addr != end); |
1127 | arch_leave_lazy_mmu_mode(); | 1133 | arch_leave_lazy_mmu_mode(); |
1128 | pte_unmap_unlock(pte - 1, ptl); | 1134 | pte_unmap_unlock(pte - 1, ptl); |
1129 | return 0; | 1135 | return err; |
1130 | } | 1136 | } |
1131 | 1137 | ||
1132 | static inline int zeromap_pmd_range(struct mm_struct *mm, pud_t *pud, | 1138 | static inline int zeromap_pmd_range(struct mm_struct *mm, pud_t *pud, |
@@ -1134,16 +1140,18 @@ static inline int zeromap_pmd_range(struct mm_struct *mm, pud_t *pud, | |||
1134 | { | 1140 | { |
1135 | pmd_t *pmd; | 1141 | pmd_t *pmd; |
1136 | unsigned long next; | 1142 | unsigned long next; |
1143 | int err; | ||
1137 | 1144 | ||
1138 | pmd = pmd_alloc(mm, pud, addr); | 1145 | pmd = pmd_alloc(mm, pud, addr); |
1139 | if (!pmd) | 1146 | if (!pmd) |
1140 | return -ENOMEM; | 1147 | return -EAGAIN; |
1141 | do { | 1148 | do { |
1142 | next = pmd_addr_end(addr, end); | 1149 | next = pmd_addr_end(addr, end); |
1143 | if (zeromap_pte_range(mm, pmd, addr, next, prot)) | 1150 | err = zeromap_pte_range(mm, pmd, addr, next, prot); |
1144 | return -ENOMEM; | 1151 | if (err) |
1152 | break; | ||
1145 | } while (pmd++, addr = next, addr != end); | 1153 | } while (pmd++, addr = next, addr != end); |
1146 | return 0; | 1154 | return err; |
1147 | } | 1155 | } |
1148 | 1156 | ||
1149 | static inline int zeromap_pud_range(struct mm_struct *mm, pgd_t *pgd, | 1157 | static inline int zeromap_pud_range(struct mm_struct *mm, pgd_t *pgd, |
@@ -1151,16 +1159,18 @@ static inline int zeromap_pud_range(struct mm_struct *mm, pgd_t *pgd, | |||
1151 | { | 1159 | { |
1152 | pud_t *pud; | 1160 | pud_t *pud; |
1153 | unsigned long next; | 1161 | unsigned long next; |
1162 | int err; | ||
1154 | 1163 | ||
1155 | pud = pud_alloc(mm, pgd, addr); | 1164 | pud = pud_alloc(mm, pgd, addr); |
1156 | if (!pud) | 1165 | if (!pud) |
1157 | return -ENOMEM; | 1166 | return -EAGAIN; |
1158 | do { | 1167 | do { |
1159 | next = pud_addr_end(addr, end); | 1168 | next = pud_addr_end(addr, end); |
1160 | if (zeromap_pmd_range(mm, pud, addr, next, prot)) | 1169 | err = zeromap_pmd_range(mm, pud, addr, next, prot); |
1161 | return -ENOMEM; | 1170 | if (err) |
1171 | break; | ||
1162 | } while (pud++, addr = next, addr != end); | 1172 | } while (pud++, addr = next, addr != end); |
1163 | return 0; | 1173 | return err; |
1164 | } | 1174 | } |
1165 | 1175 | ||
1166 | int zeromap_page_range(struct vm_area_struct *vma, | 1176 | int zeromap_page_range(struct vm_area_struct *vma, |
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index b917d6fdc1bb..da9463946556 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
@@ -1857,7 +1857,7 @@ int show_numa_map(struct seq_file *m, void *v) | |||
1857 | 1857 | ||
1858 | if (file) { | 1858 | if (file) { |
1859 | seq_printf(m, " file="); | 1859 | seq_printf(m, " file="); |
1860 | seq_path(m, file->f_vfsmnt, file->f_dentry, "\n\t= "); | 1860 | seq_path(m, file->f_path.mnt, file->f_path.dentry, "\n\t= "); |
1861 | } else if (vma->vm_start <= mm->brk && vma->vm_end >= mm->start_brk) { | 1861 | } else if (vma->vm_start <= mm->brk && vma->vm_end >= mm->start_brk) { |
1862 | seq_printf(m, " heap"); | 1862 | seq_printf(m, " heap"); |
1863 | } else if (vma->vm_start <= mm->start_stack && | 1863 | } else if (vma->vm_start <= mm->start_stack && |
@@ -188,7 +188,7 @@ static void __remove_shared_vm_struct(struct vm_area_struct *vma, | |||
188 | struct file *file, struct address_space *mapping) | 188 | struct file *file, struct address_space *mapping) |
189 | { | 189 | { |
190 | if (vma->vm_flags & VM_DENYWRITE) | 190 | if (vma->vm_flags & VM_DENYWRITE) |
191 | atomic_inc(&file->f_dentry->d_inode->i_writecount); | 191 | atomic_inc(&file->f_path.dentry->d_inode->i_writecount); |
192 | if (vma->vm_flags & VM_SHARED) | 192 | if (vma->vm_flags & VM_SHARED) |
193 | mapping->i_mmap_writable--; | 193 | mapping->i_mmap_writable--; |
194 | 194 | ||
@@ -399,7 +399,7 @@ static inline void __vma_link_file(struct vm_area_struct *vma) | |||
399 | struct address_space *mapping = file->f_mapping; | 399 | struct address_space *mapping = file->f_mapping; |
400 | 400 | ||
401 | if (vma->vm_flags & VM_DENYWRITE) | 401 | if (vma->vm_flags & VM_DENYWRITE) |
402 | atomic_dec(&file->f_dentry->d_inode->i_writecount); | 402 | atomic_dec(&file->f_path.dentry->d_inode->i_writecount); |
403 | if (vma->vm_flags & VM_SHARED) | 403 | if (vma->vm_flags & VM_SHARED) |
404 | mapping->i_mmap_writable++; | 404 | mapping->i_mmap_writable++; |
405 | 405 | ||
@@ -907,7 +907,7 @@ unsigned long do_mmap_pgoff(struct file * file, unsigned long addr, | |||
907 | * mounted, in which case we dont add PROT_EXEC.) | 907 | * mounted, in which case we dont add PROT_EXEC.) |
908 | */ | 908 | */ |
909 | if ((prot & PROT_READ) && (current->personality & READ_IMPLIES_EXEC)) | 909 | if ((prot & PROT_READ) && (current->personality & READ_IMPLIES_EXEC)) |
910 | if (!(file && (file->f_vfsmnt->mnt_flags & MNT_NOEXEC))) | 910 | if (!(file && (file->f_path.mnt->mnt_flags & MNT_NOEXEC))) |
911 | prot |= PROT_EXEC; | 911 | prot |= PROT_EXEC; |
912 | 912 | ||
913 | if (!len) | 913 | if (!len) |
@@ -960,7 +960,7 @@ unsigned long do_mmap_pgoff(struct file * file, unsigned long addr, | |||
960 | return -EAGAIN; | 960 | return -EAGAIN; |
961 | } | 961 | } |
962 | 962 | ||
963 | inode = file ? file->f_dentry->d_inode : NULL; | 963 | inode = file ? file->f_path.dentry->d_inode : NULL; |
964 | 964 | ||
965 | if (file) { | 965 | if (file) { |
966 | switch (flags & MAP_TYPE) { | 966 | switch (flags & MAP_TYPE) { |
@@ -989,7 +989,7 @@ unsigned long do_mmap_pgoff(struct file * file, unsigned long addr, | |||
989 | case MAP_PRIVATE: | 989 | case MAP_PRIVATE: |
990 | if (!(file->f_mode & FMODE_READ)) | 990 | if (!(file->f_mode & FMODE_READ)) |
991 | return -EACCES; | 991 | return -EACCES; |
992 | if (file->f_vfsmnt->mnt_flags & MNT_NOEXEC) { | 992 | if (file->f_path.mnt->mnt_flags & MNT_NOEXEC) { |
993 | if (vm_flags & VM_EXEC) | 993 | if (vm_flags & VM_EXEC) |
994 | return -EPERM; | 994 | return -EPERM; |
995 | vm_flags &= ~VM_MAYEXEC; | 995 | vm_flags &= ~VM_MAYEXEC; |
diff --git a/mm/nommu.c b/mm/nommu.c index af874569d0f1..23fb033e596d 100644 --- a/mm/nommu.c +++ b/mm/nommu.c | |||
@@ -523,7 +523,7 @@ static int validate_mmap_request(struct file *file, | |||
523 | */ | 523 | */ |
524 | mapping = file->f_mapping; | 524 | mapping = file->f_mapping; |
525 | if (!mapping) | 525 | if (!mapping) |
526 | mapping = file->f_dentry->d_inode->i_mapping; | 526 | mapping = file->f_path.dentry->d_inode->i_mapping; |
527 | 527 | ||
528 | capabilities = 0; | 528 | capabilities = 0; |
529 | if (mapping && mapping->backing_dev_info) | 529 | if (mapping && mapping->backing_dev_info) |
@@ -532,7 +532,7 @@ static int validate_mmap_request(struct file *file, | |||
532 | if (!capabilities) { | 532 | if (!capabilities) { |
533 | /* no explicit capabilities set, so assume some | 533 | /* no explicit capabilities set, so assume some |
534 | * defaults */ | 534 | * defaults */ |
535 | switch (file->f_dentry->d_inode->i_mode & S_IFMT) { | 535 | switch (file->f_path.dentry->d_inode->i_mode & S_IFMT) { |
536 | case S_IFREG: | 536 | case S_IFREG: |
537 | case S_IFBLK: | 537 | case S_IFBLK: |
538 | capabilities = BDI_CAP_MAP_COPY; | 538 | capabilities = BDI_CAP_MAP_COPY; |
@@ -563,11 +563,11 @@ static int validate_mmap_request(struct file *file, | |||
563 | !(file->f_mode & FMODE_WRITE)) | 563 | !(file->f_mode & FMODE_WRITE)) |
564 | return -EACCES; | 564 | return -EACCES; |
565 | 565 | ||
566 | if (IS_APPEND(file->f_dentry->d_inode) && | 566 | if (IS_APPEND(file->f_path.dentry->d_inode) && |
567 | (file->f_mode & FMODE_WRITE)) | 567 | (file->f_mode & FMODE_WRITE)) |
568 | return -EACCES; | 568 | return -EACCES; |
569 | 569 | ||
570 | if (locks_verify_locked(file->f_dentry->d_inode)) | 570 | if (locks_verify_locked(file->f_path.dentry->d_inode)) |
571 | return -EAGAIN; | 571 | return -EAGAIN; |
572 | 572 | ||
573 | if (!(capabilities & BDI_CAP_MAP_DIRECT)) | 573 | if (!(capabilities & BDI_CAP_MAP_DIRECT)) |
@@ -598,7 +598,7 @@ static int validate_mmap_request(struct file *file, | |||
598 | 598 | ||
599 | /* handle executable mappings and implied executable | 599 | /* handle executable mappings and implied executable |
600 | * mappings */ | 600 | * mappings */ |
601 | if (file->f_vfsmnt->mnt_flags & MNT_NOEXEC) { | 601 | if (file->f_path.mnt->mnt_flags & MNT_NOEXEC) { |
602 | if (prot & PROT_EXEC) | 602 | if (prot & PROT_EXEC) |
603 | return -EPERM; | 603 | return -EPERM; |
604 | } | 604 | } |
@@ -833,7 +833,7 @@ unsigned long do_mmap_pgoff(struct file *file, | |||
833 | continue; | 833 | continue; |
834 | 834 | ||
835 | /* search for overlapping mappings on the same file */ | 835 | /* search for overlapping mappings on the same file */ |
836 | if (vma->vm_file->f_dentry->d_inode != file->f_dentry->d_inode) | 836 | if (vma->vm_file->f_path.dentry->d_inode != file->f_path.dentry->d_inode) |
837 | continue; | 837 | continue; |
838 | 838 | ||
839 | if (vma->vm_pgoff >= pgoff + pglen) | 839 | if (vma->vm_pgoff >= pgoff + pglen) |
diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 8d9b19f239c3..237107c1b084 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/writeback.h> | 21 | #include <linux/writeback.h> |
22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
23 | #include <linux/backing-dev.h> | 23 | #include <linux/backing-dev.h> |
24 | #include <linux/task_io_accounting_ops.h> | ||
24 | #include <linux/blkdev.h> | 25 | #include <linux/blkdev.h> |
25 | #include <linux/mpage.h> | 26 | #include <linux/mpage.h> |
26 | #include <linux/rmap.h> | 27 | #include <linux/rmap.h> |
@@ -761,23 +762,24 @@ int __set_page_dirty_nobuffers(struct page *page) | |||
761 | struct address_space *mapping = page_mapping(page); | 762 | struct address_space *mapping = page_mapping(page); |
762 | struct address_space *mapping2; | 763 | struct address_space *mapping2; |
763 | 764 | ||
764 | if (mapping) { | 765 | if (!mapping) |
765 | write_lock_irq(&mapping->tree_lock); | 766 | return 1; |
766 | mapping2 = page_mapping(page); | 767 | |
767 | if (mapping2) { /* Race with truncate? */ | 768 | write_lock_irq(&mapping->tree_lock); |
768 | BUG_ON(mapping2 != mapping); | 769 | mapping2 = page_mapping(page); |
769 | if (mapping_cap_account_dirty(mapping)) | 770 | if (mapping2) { /* Race with truncate? */ |
770 | __inc_zone_page_state(page, | 771 | BUG_ON(mapping2 != mapping); |
771 | NR_FILE_DIRTY); | 772 | if (mapping_cap_account_dirty(mapping)) { |
772 | radix_tree_tag_set(&mapping->page_tree, | 773 | __inc_zone_page_state(page, NR_FILE_DIRTY); |
773 | page_index(page), PAGECACHE_TAG_DIRTY); | 774 | task_io_account_write(PAGE_CACHE_SIZE); |
774 | } | ||
775 | write_unlock_irq(&mapping->tree_lock); | ||
776 | if (mapping->host) { | ||
777 | /* !PageAnon && !swapper_space */ | ||
778 | __mark_inode_dirty(mapping->host, | ||
779 | I_DIRTY_PAGES); | ||
780 | } | 775 | } |
776 | radix_tree_tag_set(&mapping->page_tree, | ||
777 | page_index(page), PAGECACHE_TAG_DIRTY); | ||
778 | } | ||
779 | write_unlock_irq(&mapping->tree_lock); | ||
780 | if (mapping->host) { | ||
781 | /* !PageAnon && !swapper_space */ | ||
782 | __mark_inode_dirty(mapping->host, I_DIRTY_PAGES); | ||
781 | } | 783 | } |
782 | return 1; | 784 | return 1; |
783 | } | 785 | } |
@@ -851,27 +853,26 @@ int test_clear_page_dirty(struct page *page) | |||
851 | struct address_space *mapping = page_mapping(page); | 853 | struct address_space *mapping = page_mapping(page); |
852 | unsigned long flags; | 854 | unsigned long flags; |
853 | 855 | ||
854 | if (mapping) { | 856 | if (!mapping) |
855 | write_lock_irqsave(&mapping->tree_lock, flags); | 857 | return TestClearPageDirty(page); |
856 | if (TestClearPageDirty(page)) { | 858 | |
857 | radix_tree_tag_clear(&mapping->page_tree, | 859 | write_lock_irqsave(&mapping->tree_lock, flags); |
858 | page_index(page), | 860 | if (TestClearPageDirty(page)) { |
859 | PAGECACHE_TAG_DIRTY); | 861 | radix_tree_tag_clear(&mapping->page_tree, |
860 | write_unlock_irqrestore(&mapping->tree_lock, flags); | 862 | page_index(page), PAGECACHE_TAG_DIRTY); |
861 | /* | ||
862 | * We can continue to use `mapping' here because the | ||
863 | * page is locked, which pins the address_space | ||
864 | */ | ||
865 | if (mapping_cap_account_dirty(mapping)) { | ||
866 | page_mkclean(page); | ||
867 | dec_zone_page_state(page, NR_FILE_DIRTY); | ||
868 | } | ||
869 | return 1; | ||
870 | } | ||
871 | write_unlock_irqrestore(&mapping->tree_lock, flags); | 863 | write_unlock_irqrestore(&mapping->tree_lock, flags); |
872 | return 0; | 864 | /* |
865 | * We can continue to use `mapping' here because the | ||
866 | * page is locked, which pins the address_space | ||
867 | */ | ||
868 | if (mapping_cap_account_dirty(mapping)) { | ||
869 | page_mkclean(page); | ||
870 | dec_zone_page_state(page, NR_FILE_DIRTY); | ||
871 | } | ||
872 | return 1; | ||
873 | } | 873 | } |
874 | return TestClearPageDirty(page); | 874 | write_unlock_irqrestore(&mapping->tree_lock, flags); |
875 | return 0; | ||
875 | } | 876 | } |
876 | EXPORT_SYMBOL(test_clear_page_dirty); | 877 | EXPORT_SYMBOL(test_clear_page_dirty); |
877 | 878 | ||
@@ -893,17 +894,17 @@ int clear_page_dirty_for_io(struct page *page) | |||
893 | { | 894 | { |
894 | struct address_space *mapping = page_mapping(page); | 895 | struct address_space *mapping = page_mapping(page); |
895 | 896 | ||
896 | if (mapping) { | 897 | if (!mapping) |
897 | if (TestClearPageDirty(page)) { | 898 | return TestClearPageDirty(page); |
898 | if (mapping_cap_account_dirty(mapping)) { | 899 | |
899 | page_mkclean(page); | 900 | if (TestClearPageDirty(page)) { |
900 | dec_zone_page_state(page, NR_FILE_DIRTY); | 901 | if (mapping_cap_account_dirty(mapping)) { |
901 | } | 902 | page_mkclean(page); |
902 | return 1; | 903 | dec_zone_page_state(page, NR_FILE_DIRTY); |
903 | } | 904 | } |
904 | return 0; | 905 | return 1; |
905 | } | 906 | } |
906 | return TestClearPageDirty(page); | 907 | return 0; |
907 | } | 908 | } |
908 | EXPORT_SYMBOL(clear_page_dirty_for_io); | 909 | EXPORT_SYMBOL(clear_page_dirty_for_io); |
909 | 910 | ||
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index cace22b3ac25..e6b17b2989e0 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -40,6 +40,7 @@ | |||
40 | #include <linux/sort.h> | 40 | #include <linux/sort.h> |
41 | #include <linux/pfn.h> | 41 | #include <linux/pfn.h> |
42 | #include <linux/backing-dev.h> | 42 | #include <linux/backing-dev.h> |
43 | #include <linux/fault-inject.h> | ||
43 | 44 | ||
44 | #include <asm/tlbflush.h> | 45 | #include <asm/tlbflush.h> |
45 | #include <asm/div64.h> | 46 | #include <asm/div64.h> |
@@ -892,6 +893,91 @@ failed: | |||
892 | #define ALLOC_HIGH 0x20 /* __GFP_HIGH set */ | 893 | #define ALLOC_HIGH 0x20 /* __GFP_HIGH set */ |
893 | #define ALLOC_CPUSET 0x40 /* check for correct cpuset */ | 894 | #define ALLOC_CPUSET 0x40 /* check for correct cpuset */ |
894 | 895 | ||
896 | #ifdef CONFIG_FAIL_PAGE_ALLOC | ||
897 | |||
898 | static struct fail_page_alloc_attr { | ||
899 | struct fault_attr attr; | ||
900 | |||
901 | u32 ignore_gfp_highmem; | ||
902 | u32 ignore_gfp_wait; | ||
903 | |||
904 | #ifdef CONFIG_FAULT_INJECTION_DEBUG_FS | ||
905 | |||
906 | struct dentry *ignore_gfp_highmem_file; | ||
907 | struct dentry *ignore_gfp_wait_file; | ||
908 | |||
909 | #endif /* CONFIG_FAULT_INJECTION_DEBUG_FS */ | ||
910 | |||
911 | } fail_page_alloc = { | ||
912 | .attr = FAULT_ATTR_INITIALIZER, | ||
913 | .ignore_gfp_wait = 1, | ||
914 | .ignore_gfp_highmem = 1, | ||
915 | }; | ||
916 | |||
917 | static int __init setup_fail_page_alloc(char *str) | ||
918 | { | ||
919 | return setup_fault_attr(&fail_page_alloc.attr, str); | ||
920 | } | ||
921 | __setup("fail_page_alloc=", setup_fail_page_alloc); | ||
922 | |||
923 | static int should_fail_alloc_page(gfp_t gfp_mask, unsigned int order) | ||
924 | { | ||
925 | if (gfp_mask & __GFP_NOFAIL) | ||
926 | return 0; | ||
927 | if (fail_page_alloc.ignore_gfp_highmem && (gfp_mask & __GFP_HIGHMEM)) | ||
928 | return 0; | ||
929 | if (fail_page_alloc.ignore_gfp_wait && (gfp_mask & __GFP_WAIT)) | ||
930 | return 0; | ||
931 | |||
932 | return should_fail(&fail_page_alloc.attr, 1 << order); | ||
933 | } | ||
934 | |||
935 | #ifdef CONFIG_FAULT_INJECTION_DEBUG_FS | ||
936 | |||
937 | static int __init fail_page_alloc_debugfs(void) | ||
938 | { | ||
939 | mode_t mode = S_IFREG | S_IRUSR | S_IWUSR; | ||
940 | struct dentry *dir; | ||
941 | int err; | ||
942 | |||
943 | err = init_fault_attr_dentries(&fail_page_alloc.attr, | ||
944 | "fail_page_alloc"); | ||
945 | if (err) | ||
946 | return err; | ||
947 | dir = fail_page_alloc.attr.dentries.dir; | ||
948 | |||
949 | fail_page_alloc.ignore_gfp_wait_file = | ||
950 | debugfs_create_bool("ignore-gfp-wait", mode, dir, | ||
951 | &fail_page_alloc.ignore_gfp_wait); | ||
952 | |||
953 | fail_page_alloc.ignore_gfp_highmem_file = | ||
954 | debugfs_create_bool("ignore-gfp-highmem", mode, dir, | ||
955 | &fail_page_alloc.ignore_gfp_highmem); | ||
956 | |||
957 | if (!fail_page_alloc.ignore_gfp_wait_file || | ||
958 | !fail_page_alloc.ignore_gfp_highmem_file) { | ||
959 | err = -ENOMEM; | ||
960 | debugfs_remove(fail_page_alloc.ignore_gfp_wait_file); | ||
961 | debugfs_remove(fail_page_alloc.ignore_gfp_highmem_file); | ||
962 | cleanup_fault_attr_dentries(&fail_page_alloc.attr); | ||
963 | } | ||
964 | |||
965 | return err; | ||
966 | } | ||
967 | |||
968 | late_initcall(fail_page_alloc_debugfs); | ||
969 | |||
970 | #endif /* CONFIG_FAULT_INJECTION_DEBUG_FS */ | ||
971 | |||
972 | #else /* CONFIG_FAIL_PAGE_ALLOC */ | ||
973 | |||
974 | static inline int should_fail_alloc_page(gfp_t gfp_mask, unsigned int order) | ||
975 | { | ||
976 | return 0; | ||
977 | } | ||
978 | |||
979 | #endif /* CONFIG_FAIL_PAGE_ALLOC */ | ||
980 | |||
895 | /* | 981 | /* |
896 | * Return 1 if free pages are above 'mark'. This takes into account the order | 982 | * Return 1 if free pages are above 'mark'. This takes into account the order |
897 | * of the allocation. | 983 | * of the allocation. |
@@ -1136,6 +1222,9 @@ __alloc_pages(gfp_t gfp_mask, unsigned int order, | |||
1136 | 1222 | ||
1137 | might_sleep_if(wait); | 1223 | might_sleep_if(wait); |
1138 | 1224 | ||
1225 | if (should_fail_alloc_page(gfp_mask, order)) | ||
1226 | return NULL; | ||
1227 | |||
1139 | restart: | 1228 | restart: |
1140 | z = zonelist->zones; /* the list of zones suitable for gfp_mask */ | 1229 | z = zonelist->zones; /* the list of zones suitable for gfp_mask */ |
1141 | 1230 | ||
@@ -3244,7 +3333,7 @@ void *__init alloc_large_system_hash(const char *tablename, | |||
3244 | if (numentries > max) | 3333 | if (numentries > max) |
3245 | numentries = max; | 3334 | numentries = max; |
3246 | 3335 | ||
3247 | log2qty = long_log2(numentries); | 3336 | log2qty = ilog2(numentries); |
3248 | 3337 | ||
3249 | do { | 3338 | do { |
3250 | size = bucketsize << log2qty; | 3339 | size = bucketsize << log2qty; |
@@ -3266,7 +3355,7 @@ void *__init alloc_large_system_hash(const char *tablename, | |||
3266 | printk("%s hash table entries: %d (order: %d, %lu bytes)\n", | 3355 | printk("%s hash table entries: %d (order: %d, %lu bytes)\n", |
3267 | tablename, | 3356 | tablename, |
3268 | (1U << log2qty), | 3357 | (1U << log2qty), |
3269 | long_log2(size) - PAGE_SHIFT, | 3358 | ilog2(size) - PAGE_SHIFT, |
3270 | size); | 3359 | size); |
3271 | 3360 | ||
3272 | if (_hash_shift) | 3361 | if (_hash_shift) |
diff --git a/mm/readahead.c b/mm/readahead.c index a386f2b6b335..0f539e8e827a 100644 --- a/mm/readahead.c +++ b/mm/readahead.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
14 | #include <linux/blkdev.h> | 14 | #include <linux/blkdev.h> |
15 | #include <linux/backing-dev.h> | 15 | #include <linux/backing-dev.h> |
16 | #include <linux/task_io_accounting_ops.h> | ||
16 | #include <linux/pagevec.h> | 17 | #include <linux/pagevec.h> |
17 | 18 | ||
18 | void default_unplug_io_fn(struct backing_dev_info *bdi, struct page *page) | 19 | void default_unplug_io_fn(struct backing_dev_info *bdi, struct page *page) |
@@ -151,6 +152,7 @@ int read_cache_pages(struct address_space *mapping, struct list_head *pages, | |||
151 | put_pages_list(pages); | 152 | put_pages_list(pages); |
152 | break; | 153 | break; |
153 | } | 154 | } |
155 | task_io_account_read(PAGE_CACHE_SIZE); | ||
154 | } | 156 | } |
155 | pagevec_lru_add(&lru_pvec); | 157 | pagevec_lru_add(&lru_pvec); |
156 | return ret; | 158 | return ret; |
@@ -450,7 +452,7 @@ static int make_ahead_window(struct address_space *mapping, struct file *filp, | |||
450 | * | 452 | * |
451 | * Note that @filp is purely used for passing on to the ->readpage[s]() | 453 | * Note that @filp is purely used for passing on to the ->readpage[s]() |
452 | * handler: it may refer to a different file from @mapping (so we may not use | 454 | * handler: it may refer to a different file from @mapping (so we may not use |
453 | * @filp->f_mapping or @filp->f_dentry->d_inode here). | 455 | * @filp->f_mapping or @filp->f_path.dentry->d_inode here). |
454 | * Also, @ra may not be equal to &@filp->f_ra. | 456 | * Also, @ra may not be equal to &@filp->f_ra. |
455 | * | 457 | * |
456 | */ | 458 | */ |
diff --git a/mm/shmem.c b/mm/shmem.c index c820b4f77b8d..4bb28d218eb5 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
@@ -1225,7 +1225,7 @@ failed: | |||
1225 | 1225 | ||
1226 | struct page *shmem_nopage(struct vm_area_struct *vma, unsigned long address, int *type) | 1226 | struct page *shmem_nopage(struct vm_area_struct *vma, unsigned long address, int *type) |
1227 | { | 1227 | { |
1228 | struct inode *inode = vma->vm_file->f_dentry->d_inode; | 1228 | struct inode *inode = vma->vm_file->f_path.dentry->d_inode; |
1229 | struct page *page = NULL; | 1229 | struct page *page = NULL; |
1230 | unsigned long idx; | 1230 | unsigned long idx; |
1231 | int error; | 1231 | int error; |
@@ -1248,7 +1248,7 @@ static int shmem_populate(struct vm_area_struct *vma, | |||
1248 | unsigned long addr, unsigned long len, | 1248 | unsigned long addr, unsigned long len, |
1249 | pgprot_t prot, unsigned long pgoff, int nonblock) | 1249 | pgprot_t prot, unsigned long pgoff, int nonblock) |
1250 | { | 1250 | { |
1251 | struct inode *inode = vma->vm_file->f_dentry->d_inode; | 1251 | struct inode *inode = vma->vm_file->f_path.dentry->d_inode; |
1252 | struct mm_struct *mm = vma->vm_mm; | 1252 | struct mm_struct *mm = vma->vm_mm; |
1253 | enum sgp_type sgp = nonblock? SGP_QUICK: SGP_CACHE; | 1253 | enum sgp_type sgp = nonblock? SGP_QUICK: SGP_CACHE; |
1254 | unsigned long size; | 1254 | unsigned long size; |
@@ -1293,14 +1293,14 @@ static int shmem_populate(struct vm_area_struct *vma, | |||
1293 | #ifdef CONFIG_NUMA | 1293 | #ifdef CONFIG_NUMA |
1294 | int shmem_set_policy(struct vm_area_struct *vma, struct mempolicy *new) | 1294 | int shmem_set_policy(struct vm_area_struct *vma, struct mempolicy *new) |
1295 | { | 1295 | { |
1296 | struct inode *i = vma->vm_file->f_dentry->d_inode; | 1296 | struct inode *i = vma->vm_file->f_path.dentry->d_inode; |
1297 | return mpol_set_shared_policy(&SHMEM_I(i)->policy, vma, new); | 1297 | return mpol_set_shared_policy(&SHMEM_I(i)->policy, vma, new); |
1298 | } | 1298 | } |
1299 | 1299 | ||
1300 | struct mempolicy * | 1300 | struct mempolicy * |
1301 | shmem_get_policy(struct vm_area_struct *vma, unsigned long addr) | 1301 | shmem_get_policy(struct vm_area_struct *vma, unsigned long addr) |
1302 | { | 1302 | { |
1303 | struct inode *i = vma->vm_file->f_dentry->d_inode; | 1303 | struct inode *i = vma->vm_file->f_path.dentry->d_inode; |
1304 | unsigned long idx; | 1304 | unsigned long idx; |
1305 | 1305 | ||
1306 | idx = ((addr - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff; | 1306 | idx = ((addr - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff; |
@@ -1310,7 +1310,7 @@ shmem_get_policy(struct vm_area_struct *vma, unsigned long addr) | |||
1310 | 1310 | ||
1311 | int shmem_lock(struct file *file, int lock, struct user_struct *user) | 1311 | int shmem_lock(struct file *file, int lock, struct user_struct *user) |
1312 | { | 1312 | { |
1313 | struct inode *inode = file->f_dentry->d_inode; | 1313 | struct inode *inode = file->f_path.dentry->d_inode; |
1314 | struct shmem_inode_info *info = SHMEM_I(inode); | 1314 | struct shmem_inode_info *info = SHMEM_I(inode); |
1315 | int retval = -ENOMEM; | 1315 | int retval = -ENOMEM; |
1316 | 1316 | ||
@@ -1422,7 +1422,7 @@ shmem_prepare_write(struct file *file, struct page *page, unsigned offset, unsig | |||
1422 | static ssize_t | 1422 | static ssize_t |
1423 | shmem_file_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) | 1423 | shmem_file_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) |
1424 | { | 1424 | { |
1425 | struct inode *inode = file->f_dentry->d_inode; | 1425 | struct inode *inode = file->f_path.dentry->d_inode; |
1426 | loff_t pos; | 1426 | loff_t pos; |
1427 | unsigned long written; | 1427 | unsigned long written; |
1428 | ssize_t err; | 1428 | ssize_t err; |
@@ -1442,7 +1442,7 @@ shmem_file_write(struct file *file, const char __user *buf, size_t count, loff_t | |||
1442 | if (err || !count) | 1442 | if (err || !count) |
1443 | goto out; | 1443 | goto out; |
1444 | 1444 | ||
1445 | err = remove_suid(file->f_dentry); | 1445 | err = remove_suid(file->f_path.dentry); |
1446 | if (err) | 1446 | if (err) |
1447 | goto out; | 1447 | goto out; |
1448 | 1448 | ||
@@ -1524,7 +1524,7 @@ out: | |||
1524 | 1524 | ||
1525 | static void do_shmem_file_read(struct file *filp, loff_t *ppos, read_descriptor_t *desc, read_actor_t actor) | 1525 | static void do_shmem_file_read(struct file *filp, loff_t *ppos, read_descriptor_t *desc, read_actor_t actor) |
1526 | { | 1526 | { |
1527 | struct inode *inode = filp->f_dentry->d_inode; | 1527 | struct inode *inode = filp->f_path.dentry->d_inode; |
1528 | struct address_space *mapping = inode->i_mapping; | 1528 | struct address_space *mapping = inode->i_mapping; |
1529 | unsigned long index, offset; | 1529 | unsigned long index, offset; |
1530 | 1530 | ||
@@ -2493,8 +2493,8 @@ struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags) | |||
2493 | d_instantiate(dentry, inode); | 2493 | d_instantiate(dentry, inode); |
2494 | inode->i_size = size; | 2494 | inode->i_size = size; |
2495 | inode->i_nlink = 0; /* It is unlinked */ | 2495 | inode->i_nlink = 0; /* It is unlinked */ |
2496 | file->f_vfsmnt = mntget(shm_mnt); | 2496 | file->f_path.mnt = mntget(shm_mnt); |
2497 | file->f_dentry = dentry; | 2497 | file->f_path.dentry = dentry; |
2498 | file->f_mapping = inode->i_mapping; | 2498 | file->f_mapping = inode->i_mapping; |
2499 | file->f_op = &shmem_file_operations; | 2499 | file->f_op = &shmem_file_operations; |
2500 | file->f_mode = FMODE_WRITE | FMODE_READ; | 2500 | file->f_mode = FMODE_WRITE | FMODE_READ; |
@@ -107,6 +107,7 @@ | |||
107 | #include <linux/nodemask.h> | 107 | #include <linux/nodemask.h> |
108 | #include <linux/mempolicy.h> | 108 | #include <linux/mempolicy.h> |
109 | #include <linux/mutex.h> | 109 | #include <linux/mutex.h> |
110 | #include <linux/fault-inject.h> | ||
110 | #include <linux/rtmutex.h> | 111 | #include <linux/rtmutex.h> |
111 | 112 | ||
112 | #include <asm/cacheflush.h> | 113 | #include <asm/cacheflush.h> |
@@ -945,7 +946,8 @@ static void __devinit start_cpu_timer(int cpu) | |||
945 | if (keventd_up() && reap_work->work.func == NULL) { | 946 | if (keventd_up() && reap_work->work.func == NULL) { |
946 | init_reap_node(cpu); | 947 | init_reap_node(cpu); |
947 | INIT_DELAYED_WORK(reap_work, cache_reap); | 948 | INIT_DELAYED_WORK(reap_work, cache_reap); |
948 | schedule_delayed_work_on(cpu, reap_work, HZ + 3 * cpu); | 949 | schedule_delayed_work_on(cpu, reap_work, |
950 | __round_jiffies_relative(HZ, cpu)); | ||
949 | } | 951 | } |
950 | } | 952 | } |
951 | 953 | ||
@@ -3088,12 +3090,89 @@ static void *cache_alloc_debugcheck_after(struct kmem_cache *cachep, | |||
3088 | #define cache_alloc_debugcheck_after(a,b,objp,d) (objp) | 3090 | #define cache_alloc_debugcheck_after(a,b,objp,d) (objp) |
3089 | #endif | 3091 | #endif |
3090 | 3092 | ||
3093 | #ifdef CONFIG_FAILSLAB | ||
3094 | |||
3095 | static struct failslab_attr { | ||
3096 | |||
3097 | struct fault_attr attr; | ||
3098 | |||
3099 | u32 ignore_gfp_wait; | ||
3100 | #ifdef CONFIG_FAULT_INJECTION_DEBUG_FS | ||
3101 | struct dentry *ignore_gfp_wait_file; | ||
3102 | #endif | ||
3103 | |||
3104 | } failslab = { | ||
3105 | .attr = FAULT_ATTR_INITIALIZER, | ||
3106 | .ignore_gfp_wait = 1, | ||
3107 | }; | ||
3108 | |||
3109 | static int __init setup_failslab(char *str) | ||
3110 | { | ||
3111 | return setup_fault_attr(&failslab.attr, str); | ||
3112 | } | ||
3113 | __setup("failslab=", setup_failslab); | ||
3114 | |||
3115 | static int should_failslab(struct kmem_cache *cachep, gfp_t flags) | ||
3116 | { | ||
3117 | if (cachep == &cache_cache) | ||
3118 | return 0; | ||
3119 | if (flags & __GFP_NOFAIL) | ||
3120 | return 0; | ||
3121 | if (failslab.ignore_gfp_wait && (flags & __GFP_WAIT)) | ||
3122 | return 0; | ||
3123 | |||
3124 | return should_fail(&failslab.attr, obj_size(cachep)); | ||
3125 | } | ||
3126 | |||
3127 | #ifdef CONFIG_FAULT_INJECTION_DEBUG_FS | ||
3128 | |||
3129 | static int __init failslab_debugfs(void) | ||
3130 | { | ||
3131 | mode_t mode = S_IFREG | S_IRUSR | S_IWUSR; | ||
3132 | struct dentry *dir; | ||
3133 | int err; | ||
3134 | |||
3135 | err = init_fault_attr_dentries(&failslab.attr, "failslab"); | ||
3136 | if (err) | ||
3137 | return err; | ||
3138 | dir = failslab.attr.dentries.dir; | ||
3139 | |||
3140 | failslab.ignore_gfp_wait_file = | ||
3141 | debugfs_create_bool("ignore-gfp-wait", mode, dir, | ||
3142 | &failslab.ignore_gfp_wait); | ||
3143 | |||
3144 | if (!failslab.ignore_gfp_wait_file) { | ||
3145 | err = -ENOMEM; | ||
3146 | debugfs_remove(failslab.ignore_gfp_wait_file); | ||
3147 | cleanup_fault_attr_dentries(&failslab.attr); | ||
3148 | } | ||
3149 | |||
3150 | return err; | ||
3151 | } | ||
3152 | |||
3153 | late_initcall(failslab_debugfs); | ||
3154 | |||
3155 | #endif /* CONFIG_FAULT_INJECTION_DEBUG_FS */ | ||
3156 | |||
3157 | #else /* CONFIG_FAILSLAB */ | ||
3158 | |||
3159 | static inline int should_failslab(struct kmem_cache *cachep, gfp_t flags) | ||
3160 | { | ||
3161 | return 0; | ||
3162 | } | ||
3163 | |||
3164 | #endif /* CONFIG_FAILSLAB */ | ||
3165 | |||
3091 | static inline void *____cache_alloc(struct kmem_cache *cachep, gfp_t flags) | 3166 | static inline void *____cache_alloc(struct kmem_cache *cachep, gfp_t flags) |
3092 | { | 3167 | { |
3093 | void *objp; | 3168 | void *objp; |
3094 | struct array_cache *ac; | 3169 | struct array_cache *ac; |
3095 | 3170 | ||
3096 | check_irq_off(); | 3171 | check_irq_off(); |
3172 | |||
3173 | if (should_failslab(cachep, flags)) | ||
3174 | return NULL; | ||
3175 | |||
3097 | ac = cpu_cache_get(cachep); | 3176 | ac = cpu_cache_get(cachep); |
3098 | if (likely(ac->avail)) { | 3177 | if (likely(ac->avail)) { |
3099 | STATS_INC_ALLOCHIT(cachep); | 3178 | STATS_INC_ALLOCHIT(cachep); |
@@ -3182,7 +3261,7 @@ retry: | |||
3182 | for (z = zonelist->zones; *z && !obj; z++) { | 3261 | for (z = zonelist->zones; *z && !obj; z++) { |
3183 | nid = zone_to_nid(*z); | 3262 | nid = zone_to_nid(*z); |
3184 | 3263 | ||
3185 | if (cpuset_zone_allowed(*z, flags) && | 3264 | if (cpuset_zone_allowed(*z, flags | __GFP_HARDWALL) && |
3186 | cache->nodelists[nid] && | 3265 | cache->nodelists[nid] && |
3187 | cache->nodelists[nid]->free_objects) | 3266 | cache->nodelists[nid]->free_objects) |
3188 | obj = ____cache_alloc_node(cache, | 3267 | obj = ____cache_alloc_node(cache, |
@@ -3928,7 +4007,7 @@ static void cache_reap(struct work_struct *unused) | |||
3928 | if (!mutex_trylock(&cache_chain_mutex)) { | 4007 | if (!mutex_trylock(&cache_chain_mutex)) { |
3929 | /* Give up. Setup the next iteration. */ | 4008 | /* Give up. Setup the next iteration. */ |
3930 | schedule_delayed_work(&__get_cpu_var(reap_work), | 4009 | schedule_delayed_work(&__get_cpu_var(reap_work), |
3931 | REAPTIMEOUT_CPUC); | 4010 | round_jiffies_relative(REAPTIMEOUT_CPUC)); |
3932 | return; | 4011 | return; |
3933 | } | 4012 | } |
3934 | 4013 | ||
@@ -3974,7 +4053,8 @@ next: | |||
3974 | next_reap_node(); | 4053 | next_reap_node(); |
3975 | refresh_cpu_vm_stats(smp_processor_id()); | 4054 | refresh_cpu_vm_stats(smp_processor_id()); |
3976 | /* Set up the next iteration */ | 4055 | /* Set up the next iteration */ |
3977 | schedule_delayed_work(&__get_cpu_var(reap_work), REAPTIMEOUT_CPUC); | 4056 | schedule_delayed_work(&__get_cpu_var(reap_work), |
4057 | round_jiffies_relative(REAPTIMEOUT_CPUC)); | ||
3978 | } | 4058 | } |
3979 | 4059 | ||
3980 | #ifdef CONFIG_PROC_FS | 4060 | #ifdef CONFIG_PROC_FS |
diff --git a/mm/swapfile.c b/mm/swapfile.c index c5431072f422..b9fc0e5de6d5 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c | |||
@@ -1357,10 +1357,10 @@ static int swap_show(struct seq_file *swap, void *v) | |||
1357 | } | 1357 | } |
1358 | 1358 | ||
1359 | file = ptr->swap_file; | 1359 | file = ptr->swap_file; |
1360 | len = seq_path(swap, file->f_vfsmnt, file->f_dentry, " \t\n\\"); | 1360 | len = seq_path(swap, file->f_path.mnt, file->f_path.dentry, " \t\n\\"); |
1361 | seq_printf(swap, "%*s%s\t%u\t%u\t%d\n", | 1361 | seq_printf(swap, "%*s%s\t%u\t%u\t%d\n", |
1362 | len < 40 ? 40 - len : 1, " ", | 1362 | len < 40 ? 40 - len : 1, " ", |
1363 | S_ISBLK(file->f_dentry->d_inode->i_mode) ? | 1363 | S_ISBLK(file->f_path.dentry->d_inode->i_mode) ? |
1364 | "partition" : "file\t", | 1364 | "partition" : "file\t", |
1365 | ptr->pages << (PAGE_SHIFT - 10), | 1365 | ptr->pages << (PAGE_SHIFT - 10), |
1366 | ptr->inuse_pages << (PAGE_SHIFT - 10), | 1366 | ptr->inuse_pages << (PAGE_SHIFT - 10), |
diff --git a/mm/tiny-shmem.c b/mm/tiny-shmem.c index 5f2cbf0f153c..c7f6e1914bc4 100644 --- a/mm/tiny-shmem.c +++ b/mm/tiny-shmem.c | |||
@@ -79,8 +79,8 @@ struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags) | |||
79 | d_instantiate(dentry, inode); | 79 | d_instantiate(dentry, inode); |
80 | inode->i_nlink = 0; /* It is unlinked */ | 80 | inode->i_nlink = 0; /* It is unlinked */ |
81 | 81 | ||
82 | file->f_vfsmnt = mntget(shm_mnt); | 82 | file->f_path.mnt = mntget(shm_mnt); |
83 | file->f_dentry = dentry; | 83 | file->f_path.dentry = dentry; |
84 | file->f_mapping = inode->i_mapping; | 84 | file->f_mapping = inode->i_mapping; |
85 | file->f_op = &ramfs_file_operations; | 85 | file->f_op = &ramfs_file_operations; |
86 | file->f_mode = FMODE_WRITE | FMODE_READ; | 86 | file->f_mode = FMODE_WRITE | FMODE_READ; |
diff --git a/mm/truncate.c b/mm/truncate.c index e07b1e682c38..9bfb8e853860 100644 --- a/mm/truncate.c +++ b/mm/truncate.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
14 | #include <linux/pagemap.h> | 14 | #include <linux/pagemap.h> |
15 | #include <linux/pagevec.h> | 15 | #include <linux/pagevec.h> |
16 | #include <linux/task_io_accounting_ops.h> | ||
16 | #include <linux/buffer_head.h> /* grr. try_to_release_page, | 17 | #include <linux/buffer_head.h> /* grr. try_to_release_page, |
17 | do_invalidatepage */ | 18 | do_invalidatepage */ |
18 | 19 | ||
@@ -69,7 +70,8 @@ truncate_complete_page(struct address_space *mapping, struct page *page) | |||
69 | if (PagePrivate(page)) | 70 | if (PagePrivate(page)) |
70 | do_invalidatepage(page, 0); | 71 | do_invalidatepage(page, 0); |
71 | 72 | ||
72 | clear_page_dirty(page); | 73 | if (test_clear_page_dirty(page)) |
74 | task_io_account_cancelled_write(PAGE_CACHE_SIZE); | ||
73 | ClearPageUptodate(page); | 75 | ClearPageUptodate(page); |
74 | ClearPageMappedToDisk(page); | 76 | ClearPageMappedToDisk(page); |
75 | remove_from_page_cache(page); | 77 | remove_from_page_cache(page); |