提交 002bd7fa 编写于 作者: J Jan Kara 提交者: Theodore Ts'o

ext4: simplify list handling in ext4_do_flush_completed_IO()

The function splices i_completed_io_list to its private list
first.  From that moment on we don't need any lock for working with
io_end structures because all io_end structure on the list are only
our own. So we can remove the other two lists in the function and free
io_end immediately after we are done with it.

CC: Dmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: NJan Kara <jack@suse.cz>
Signed-off-by: N"Theodore Ts'o" <tytso@mit.edu>
上级 84c17543
...@@ -160,14 +160,11 @@ void ext4_add_complete_io(ext4_io_end_t *io_end) ...@@ -160,14 +160,11 @@ void ext4_add_complete_io(ext4_io_end_t *io_end)
static int ext4_do_flush_completed_IO(struct inode *inode) static int ext4_do_flush_completed_IO(struct inode *inode)
{ {
ext4_io_end_t *io; ext4_io_end_t *io;
struct list_head unwritten, complete, to_free; struct list_head unwritten;
unsigned long flags; unsigned long flags;
struct ext4_inode_info *ei = EXT4_I(inode); struct ext4_inode_info *ei = EXT4_I(inode);
int err, ret = 0; int err, ret = 0;
INIT_LIST_HEAD(&complete);
INIT_LIST_HEAD(&to_free);
spin_lock_irqsave(&ei->i_completed_io_lock, flags); spin_lock_irqsave(&ei->i_completed_io_lock, flags);
dump_completed_IO(inode); dump_completed_IO(inode);
list_replace_init(&ei->i_completed_io_list, &unwritten); list_replace_init(&ei->i_completed_io_list, &unwritten);
...@@ -181,20 +178,7 @@ static int ext4_do_flush_completed_IO(struct inode *inode) ...@@ -181,20 +178,7 @@ static int ext4_do_flush_completed_IO(struct inode *inode)
err = ext4_end_io(io); err = ext4_end_io(io);
if (unlikely(!ret && err)) if (unlikely(!ret && err))
ret = err; ret = err;
list_add_tail(&io->list, &complete);
}
spin_lock_irqsave(&ei->i_completed_io_lock, flags);
while (!list_empty(&complete)) {
io = list_entry(complete.next, ext4_io_end_t, list);
io->flag &= ~EXT4_IO_END_UNWRITTEN; io->flag &= ~EXT4_IO_END_UNWRITTEN;
list_move(&io->list, &to_free);
}
spin_unlock_irqrestore(&ei->i_completed_io_lock, flags);
while (!list_empty(&to_free)) {
io = list_entry(to_free.next, ext4_io_end_t, list);
list_del_init(&io->list);
ext4_free_io_end(io); ext4_free_io_end(io);
} }
return ret; return ret;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册