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
ALSA: hda - Unify capture mixer creation in realtek codes
[safe/jmp/linux-2.6]
/
mm
/
truncate.c
diff --git
a/mm/truncate.c
b/mm/truncate.c
index
ff78505
..
6650c1d
100644
(file)
--- a/
mm/truncate.c
+++ b/
mm/truncate.c
@@
-8,6
+8,7
@@
*/
#include <linux/kernel.h>
*/
#include <linux/kernel.h>
+#include <linux/backing-dev.h>
#include <linux/mm.h>
#include <linux/swap.h>
#include <linux/module.h>
#include <linux/mm.h>
#include <linux/swap.h>
#include <linux/module.h>
@@
-20,7
+21,7
@@
/**
/**
- * do_invalidatepage - invalidate part o
f
all of a page
+ * do_invalidatepage - invalidate part o
r
all of a page
* @page: the page which is affected
* @offset: the index of the truncation point
*
* @page: the page which is affected
* @offset: the index of the truncation point
*
@@
-47,7
+48,7
@@
void do_invalidatepage(struct page *page, unsigned long offset)
static inline void truncate_partial_page(struct page *page, unsigned partial)
{
static inline void truncate_partial_page(struct page *page, unsigned partial)
{
- zero_user_
page(page, partial, PAGE_CACHE_SIZE - partial, KM_USER0
);
+ zero_user_
segment(page, partial, PAGE_CACHE_SIZE
);
if (PagePrivate(page))
do_invalidatepage(page, partial);
}
if (PagePrivate(page))
do_invalidatepage(page, partial);
}
@@
-83,7
+84,7
@@
EXPORT_SYMBOL(cancel_dirty_page);
/*
* If truncate cannot remove the fs-private metadata from the page, the page
/*
* If truncate cannot remove the fs-private metadata from the page, the page
- * becomes
anonymous
. It will be left on the LRU and may even be mapped into
+ * becomes
orphaned
. It will be left on the LRU and may even be mapped into
* user pagetables if we're racing with filemap_fault().
*
* We need to bale out if page->mapping is no longer equal to the original
* user pagetables if we're racing with filemap_fault().
*
* We need to bale out if page->mapping is no longer equal to the original
@@
-97,13
+98,12
@@
truncate_complete_page(struct address_space *mapping, struct page *page)
if (page->mapping != mapping)
return;
if (page->mapping != mapping)
return;
- cancel_dirty_page(page, PAGE_CACHE_SIZE);
-
if (PagePrivate(page))
do_invalidatepage(page, 0);
if (PagePrivate(page))
do_invalidatepage(page, 0);
+ cancel_dirty_page(page, PAGE_CACHE_SIZE);
+
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 */
}
@@
-133,8
+133,7
@@
invalidate_complete_page(struct address_space *mapping, struct page *page)
}
/**
}
/**
- * 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
@@
-188,7
+187,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);
@@
-281,7
+280,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
@@
-349,18
+348,17
@@
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;
BUG_ON(PagePrivate(page));
__remove_from_page_cache(page);
if (PageDirty(page))
goto failed;
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;
}
@@
-382,7
+380,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)
@@
-391,6
+389,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;
@@
-438,9
+437,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);