aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/ext4/page-io.c18
1 files changed, 1 insertions, 17 deletions
diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c
index a0290176ee75..3fb385cd9670 100644
--- a/fs/ext4/page-io.c
+++ b/fs/ext4/page-io.c
@@ -160,14 +160,11 @@ void ext4_add_complete_io(ext4_io_end_t *io_end)
160static int ext4_do_flush_completed_IO(struct inode *inode) 160static int ext4_do_flush_completed_IO(struct inode *inode)
161{ 161{
162 ext4_io_end_t *io; 162 ext4_io_end_t *io;
163 struct list_head unwritten, complete, to_free; 163 struct list_head unwritten;
164 unsigned long flags; 164 unsigned long flags;
165 struct ext4_inode_info *ei = EXT4_I(inode); 165 struct ext4_inode_info *ei = EXT4_I(inode);
166 int err, ret = 0; 166 int err, ret = 0;
167 167
168 INIT_LIST_HEAD(&complete);
169 INIT_LIST_HEAD(&to_free);
170
171 spin_lock_irqsave(&ei->i_completed_io_lock, flags); 168 spin_lock_irqsave(&ei->i_completed_io_lock, flags);
172 dump_completed_IO(inode); 169 dump_completed_IO(inode);
173 list_replace_init(&ei->i_completed_io_list, &unwritten); 170 list_replace_init(&ei->i_completed_io_list, &unwritten);
@@ -181,20 +178,7 @@ static int ext4_do_flush_completed_IO(struct inode *inode)
181 err = ext4_end_io(io); 178 err = ext4_end_io(io);
182 if (unlikely(!ret && err)) 179 if (unlikely(!ret && err))
183 ret = err; 180 ret = err;
184
185 list_add_tail(&io->list, &complete);
186 }
187 spin_lock_irqsave(&ei->i_completed_io_lock, flags);
188 while (!list_empty(&complete)) {
189 io = list_entry(complete.next, ext4_io_end_t, list);
190 io->flag &= ~EXT4_IO_END_UNWRITTEN; 181 io->flag &= ~EXT4_IO_END_UNWRITTEN;
191 list_move(&io->list, &to_free);
192 }
193 spin_unlock_irqrestore(&ei->i_completed_io_lock, flags);
194
195 while (!list_empty(&to_free)) {
196 io = list_entry(to_free.next, ext4_io_end_t, list);
197 list_del_init(&io->list);
198 ext4_free_io_end(io); 182 ext4_free_io_end(io);
199 } 183 }
200 return ret; 184 return ret;