diff options
| author | Frederic Weisbecker <fweisbec@gmail.com> | 2013-05-02 17:37:49 +0200 | 
|---|---|---|
| committer | Frederic Weisbecker <fweisbec@gmail.com> | 2013-05-02 17:54:19 +0200 | 
| commit | c032862fba51a3ca504752d3a25186b324c5ce83 (patch) | |
| tree | 955dc2ba4ab3df76ecc2bb780ee84aca04967e8d /mm/filemap.c | |
| parent | fda76e074c7737fc57855dd17c762e50ed526052 (diff) | |
| parent | 8700c95adb033843fc163d112b9d21d4fda78018 (diff) | |
| download | olio-linux-3.10-c032862fba51a3ca504752d3a25186b324c5ce83.tar.xz olio-linux-3.10-c032862fba51a3ca504752d3a25186b324c5ce83.zip  | |
Merge commit '8700c95adb03' into timers/nohz
The full dynticks tree needs the latest RCU and sched
upstream updates in order to fix some dependencies.
Merge a common upstream merge point that has these
updates.
Conflicts:
	include/linux/perf_event.h
	kernel/rcutree.h
	kernel/rcutree_plugin.h
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Diffstat (limited to 'mm/filemap.c')
| -rw-r--r-- | mm/filemap.c | 34 | 
1 files changed, 26 insertions, 8 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index e1979fdca80..e989fb1eaa7 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -35,6 +35,9 @@  #include <linux/cleancache.h>  #include "internal.h" +#define CREATE_TRACE_POINTS +#include <trace/events/filemap.h> +  /*   * FIXME: remove all knowledge of the buffer layer from the core VM   */ @@ -113,6 +116,7 @@ void __delete_from_page_cache(struct page *page)  {  	struct address_space *mapping = page->mapping; +	trace_mm_filemap_delete_from_page_cache(page);  	/*  	 * if we're uptodate, flush out into the cleancache, otherwise  	 * invalidate any existing cleancache entries.  We can't leave @@ -184,6 +188,17 @@ static int sleep_on_page_killable(void *word)  	return fatal_signal_pending(current) ? -EINTR : 0;  } +static int filemap_check_errors(struct address_space *mapping) +{ +	int ret = 0; +	/* Check for outstanding write errors */ +	if (test_and_clear_bit(AS_ENOSPC, &mapping->flags)) +		ret = -ENOSPC; +	if (test_and_clear_bit(AS_EIO, &mapping->flags)) +		ret = -EIO; +	return ret; +} +  /**   * __filemap_fdatawrite_range - start writeback on mapping dirty pages in range   * @mapping:	address space structure to write @@ -265,10 +280,10 @@ int filemap_fdatawait_range(struct address_space *mapping, loff_t start_byte,  	pgoff_t end = end_byte >> PAGE_CACHE_SHIFT;  	struct pagevec pvec;  	int nr_pages; -	int ret = 0; +	int ret2, ret = 0;  	if (end_byte < start_byte) -		return 0; +		goto out;  	pagevec_init(&pvec, 0);  	while ((index <= end) && @@ -291,12 +306,10 @@ int filemap_fdatawait_range(struct address_space *mapping, loff_t start_byte,  		pagevec_release(&pvec);  		cond_resched();  	} - -	/* Check for outstanding write errors */ -	if (test_and_clear_bit(AS_ENOSPC, &mapping->flags)) -		ret = -ENOSPC; -	if (test_and_clear_bit(AS_EIO, &mapping->flags)) -		ret = -EIO; +out: +	ret2 = filemap_check_errors(mapping); +	if (!ret) +		ret = ret2;  	return ret;  } @@ -337,6 +350,8 @@ int filemap_write_and_wait(struct address_space *mapping)  			if (!err)  				err = err2;  		} +	} else { +		err = filemap_check_errors(mapping);  	}  	return err;  } @@ -368,6 +383,8 @@ int filemap_write_and_wait_range(struct address_space *mapping,  			if (!err)  				err = err2;  		} +	} else { +		err = filemap_check_errors(mapping);  	}  	return err;  } @@ -464,6 +481,7 @@ int add_to_page_cache_locked(struct page *page, struct address_space *mapping,  			mapping->nrpages++;  			__inc_zone_page_state(page, NR_FILE_PAGES);  			spin_unlock_irq(&mapping->tree_lock); +			trace_mm_filemap_add_to_page_cache(page);  		} else {  			page->mapping = NULL;  			/* Leave page->index set: truncation relies upon it */  |