| From 2b208d0bb3de20ea09cdcfe51e44b242739b075d Mon Sep 17 00:00:00 2001 |
| From: Theodore Ts'o <tytso@mit.edu> |
| Date: Mon, 31 Aug 2009 17:00:59 -0400 |
| Subject: [PATCH 15/85] ext4: Restore wbc->range_start in ext4_da_writepages() |
| |
| (cherry picked from commit de89de6e0cf4b1eb13f27137cf2aa40d287aabdf) |
| |
| To solve a lock inversion problem, we implement part of the |
| range_cyclic algorithm in ext4_da_writepages(). (See commit 2acf2c26 |
| for more details.) |
| |
| As part of that change wbc->range_start was modified by ext4's |
| writepages function, which causes its callers to get confused since |
| they aren't expecting the filesystem to modify it. The simplest fix |
| is to save and restore wbc->range_start in ext4_da_writepages. |
| |
| Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> |
| --- |
| fs/ext4/inode.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- a/fs/ext4/inode.c |
| +++ b/fs/ext4/inode.c |
| @@ -2750,6 +2750,7 @@ static int ext4_da_writepages(struct add |
| long pages_skipped; |
| int range_cyclic, cycled = 1, io_done = 0; |
| int needed_blocks, ret = 0, nr_to_writebump = 0; |
| + loff_t range_start = wbc->range_start; |
| struct ext4_sb_info *sbi = EXT4_SB(mapping->host->i_sb); |
| |
| trace_ext4_da_writepages(inode, wbc); |
| @@ -2918,6 +2919,7 @@ out_writepages: |
| if (!no_nrwrite_index_update) |
| wbc->no_nrwrite_index_update = 0; |
| wbc->nr_to_write -= nr_to_writebump; |
| + wbc->range_start = range_start; |
| trace_ext4_da_writepages_result(inode, wbc, ret, pages_written); |
| return ret; |
| } |