aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2009-08-31 17:00:59 -0400
committerTheodore Ts'o <tytso@mit.edu>2009-08-31 17:00:59 -0400
commitde89de6e0cf4b1eb13f27137cf2aa40d287aabdf (patch)
treeb6429d327cb0a6985d3fd9bf11755353408ee44c /fs
parent98a56ab382079f777e261e14512cbd4fb2107af4 (diff)
ext4: Restore wbc->range_start in ext4_da_writepages()
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>
Diffstat (limited to 'fs')
-rw-r--r--fs/ext4/inode.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index d61fb523308f..ff659e757578 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -2749,6 +2749,7 @@ static int ext4_da_writepages(struct address_space *mapping,
2749 long pages_skipped; 2749 long pages_skipped;
2750 int range_cyclic, cycled = 1, io_done = 0; 2750 int range_cyclic, cycled = 1, io_done = 0;
2751 int needed_blocks, ret = 0, nr_to_writebump = 0; 2751 int needed_blocks, ret = 0, nr_to_writebump = 0;
2752 loff_t range_start = wbc->range_start;
2752 struct ext4_sb_info *sbi = EXT4_SB(mapping->host->i_sb); 2753 struct ext4_sb_info *sbi = EXT4_SB(mapping->host->i_sb);
2753 2754
2754 trace_ext4_da_writepages(inode, wbc); 2755 trace_ext4_da_writepages(inode, wbc);
@@ -2917,6 +2918,7 @@ out_writepages:
2917 if (!no_nrwrite_index_update) 2918 if (!no_nrwrite_index_update)
2918 wbc->no_nrwrite_index_update = 0; 2919 wbc->no_nrwrite_index_update = 0;
2919 wbc->nr_to_write -= nr_to_writebump; 2920 wbc->nr_to_write -= nr_to_writebump;
2921 wbc->range_start = range_start;
2920 trace_ext4_da_writepages_result(inode, wbc, ret, pages_written); 2922 trace_ext4_da_writepages_result(inode, wbc, ret, pages_written);
2921 return ret; 2923 return ret;
2922} 2924}