Commit af7a6509 authored by Miao Xie's avatar Miao Xie Committed by Josef Bacik

Btrfs: wake up the tasks that wait for the io earlier

The tasks that wait for the IO_DONE flag just care about the io of the dirty
pages, so it is better to wake up them immediately after all the pages are
written, not the whole process of the io completes.
Signed-off-by: default avatarMiao Xie <miaox@cn.fujitsu.com>
Signed-off-by: default avatarJosef Bacik <jbacik@fb.com>
parent 8b9d83cd
...@@ -349,10 +349,13 @@ int btrfs_dec_test_first_ordered_pending(struct inode *inode, ...@@ -349,10 +349,13 @@ int btrfs_dec_test_first_ordered_pending(struct inode *inode,
if (!uptodate) if (!uptodate)
set_bit(BTRFS_ORDERED_IOERR, &entry->flags); set_bit(BTRFS_ORDERED_IOERR, &entry->flags);
if (entry->bytes_left == 0) if (entry->bytes_left == 0) {
ret = test_and_set_bit(BTRFS_ORDERED_IO_DONE, &entry->flags); ret = test_and_set_bit(BTRFS_ORDERED_IO_DONE, &entry->flags);
else if (waitqueue_active(&entry->wait))
wake_up(&entry->wait);
} else {
ret = 1; ret = 1;
}
out: out:
if (!ret && cached && entry) { if (!ret && cached && entry) {
*cached = entry; *cached = entry;
...@@ -410,10 +413,13 @@ int btrfs_dec_test_ordered_pending(struct inode *inode, ...@@ -410,10 +413,13 @@ int btrfs_dec_test_ordered_pending(struct inode *inode,
if (!uptodate) if (!uptodate)
set_bit(BTRFS_ORDERED_IOERR, &entry->flags); set_bit(BTRFS_ORDERED_IOERR, &entry->flags);
if (entry->bytes_left == 0) if (entry->bytes_left == 0) {
ret = test_and_set_bit(BTRFS_ORDERED_IO_DONE, &entry->flags); ret = test_and_set_bit(BTRFS_ORDERED_IO_DONE, &entry->flags);
else if (waitqueue_active(&entry->wait))
wake_up(&entry->wait);
} else {
ret = 1; ret = 1;
}
out: out:
if (!ret && cached && entry) { if (!ret && cached && entry) {
*cached = entry; *cached = entry;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment