git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
mm: don't call mark_page_accessed() in do_swap_page()
[safe/jmp/linux-2.6]
/
mm
/
truncate.c
diff --git
a/mm/truncate.c
b/mm/truncate.c
index
c35c49e
..
1229211
100644
(file)
--- a/
mm/truncate.c
+++ b/
mm/truncate.c
@@
-3,7
+3,7
@@
*
* Copyright (C) 2002, Linus Torvalds
*
*
* Copyright (C) 2002, Linus Torvalds
*
- * 10Sep2002
akpm@zip.com.au
+ * 10Sep2002
Andrew Morton
* Initial version.
*/
* Initial version.
*/
@@
-18,6
+18,7
@@
#include <linux/task_io_accounting_ops.h>
#include <linux/buffer_head.h> /* grr. try_to_release_page,
do_invalidatepage */
#include <linux/task_io_accounting_ops.h>
#include <linux/buffer_head.h> /* grr. try_to_release_page,
do_invalidatepage */
+#include "internal.h"
/**
/**
@@
-103,8
+104,8
@@
truncate_complete_page(struct address_space *mapping, struct page *page)
cancel_dirty_page(page, PAGE_CACHE_SIZE);
cancel_dirty_page(page, PAGE_CACHE_SIZE);
+ clear_page_mlock(page);
remove_from_page_cache(page);
remove_from_page_cache(page);
- ClearPageUptodate(page);
ClearPageMappedToDisk(page);
page_cache_release(page); /* pagecache ref */
}
ClearPageMappedToDisk(page);
page_cache_release(page); /* pagecache ref */
}
@@
-128,14
+129,14
@@
invalidate_complete_page(struct address_space *mapping, struct page *page)
if (PagePrivate(page) && !try_to_release_page(page, 0))
return 0;
if (PagePrivate(page) && !try_to_release_page(page, 0))
return 0;
+ clear_page_mlock(page);
ret = remove_mapping(mapping, page);
return ret;
}
/**
ret = remove_mapping(mapping, page);
return ret;
}
/**
- * truncate_inode_pages - truncate range of pages specified by start and
- * end byte offsets
+ * truncate_inode_pages - truncate range of pages specified by start & end byte offsets
* @mapping: mapping to truncate
* @lstart: offset from which to truncate
* @lend: offset to which to truncate
* @mapping: mapping to truncate
* @lstart: offset from which to truncate
* @lend: offset to which to truncate
@@
-189,7
+190,7
@@
void truncate_inode_pages_range(struct address_space *mapping,
if (page_index > next)
next = page_index;
next++;
if (page_index > next)
next = page_index;
next++;
- if (
TestSetPageLocked
(page))
+ if (
!trylock_page
(page))
continue;
if (PageWriteback(page)) {
unlock_page(page);
continue;
if (PageWriteback(page)) {
unlock_page(page);
@@
-282,7
+283,7
@@
unsigned long __invalidate_mapping_pages(struct address_space *mapping,
pgoff_t index;
int lock_failed;
pgoff_t index;
int lock_failed;
- lock_failed =
TestSetPageLocked
(page);
+ lock_failed =
!trylock_page
(page);
/*
* We really shouldn't be looking at the ->index of an
/*
* We really shouldn't be looking at the ->index of an
@@
-350,18
+351,18
@@
invalidate_complete_page2(struct address_space *mapping, struct page *page)
if (PagePrivate(page) && !try_to_release_page(page, GFP_KERNEL))
return 0;
if (PagePrivate(page) && !try_to_release_page(page, GFP_KERNEL))
return 0;
-
write
_lock_irq(&mapping->tree_lock);
+
spin
_lock_irq(&mapping->tree_lock);
if (PageDirty(page))
goto failed;
if (PageDirty(page))
goto failed;
+ clear_page_mlock(page);
BUG_ON(PagePrivate(page));
__remove_from_page_cache(page);
BUG_ON(PagePrivate(page));
__remove_from_page_cache(page);
- write_unlock_irq(&mapping->tree_lock);
- ClearPageUptodate(page);
+ spin_unlock_irq(&mapping->tree_lock);
page_cache_release(page); /* pagecache ref */
return 1;
failed:
page_cache_release(page); /* pagecache ref */
return 1;
failed:
-
write
_unlock_irq(&mapping->tree_lock);
+
spin
_unlock_irq(&mapping->tree_lock);
return 0;
}
return 0;
}
@@
-383,7
+384,7
@@
static int do_launder_page(struct address_space *mapping, struct page *page)
* Any pages which are found to be mapped into pagetables are unmapped prior to
* invalidation.
*
* Any pages which are found to be mapped into pagetables are unmapped prior to
* invalidation.
*
- * Returns -E
IO
if any pages could not be invalidated.
+ * Returns -E
BUSY
if any pages could not be invalidated.
*/
int invalidate_inode_pages2_range(struct address_space *mapping,
pgoff_t start, pgoff_t end)
*/
int invalidate_inode_pages2_range(struct address_space *mapping,
pgoff_t start, pgoff_t end)
@@
-392,6
+393,7
@@
int invalidate_inode_pages2_range(struct address_space *mapping,
pgoff_t next;
int i;
int ret = 0;
pgoff_t next;
int i;
int ret = 0;
+ int ret2 = 0;
int did_range_unmap = 0;
int wrapped = 0;
int did_range_unmap = 0;
int wrapped = 0;
@@
-439,9
+441,13
@@
int invalidate_inode_pages2_range(struct address_space *mapping,
}
}
BUG_ON(page_mapped(page));
}
}
BUG_ON(page_mapped(page));
- ret = do_launder_page(mapping, page);
- if (ret == 0 && !invalidate_complete_page2(mapping, page))
- ret = -EIO;
+ ret2 = do_launder_page(mapping, page);
+ if (ret2 == 0) {
+ if (!invalidate_complete_page2(mapping, page))
+ ret2 = -EBUSY;
+ }
+ if (ret2 < 0)
+ ret = ret2;
unlock_page(page);
}
pagevec_release(&pvec);
unlock_page(page);
}
pagevec_release(&pvec);