浏览代码

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: Miao Xie <miaox@cn.fujitsu.com>
Signed-off-by: Josef Bacik <jbacik@fb.com>
Miao Xie 11 年之前
父节点
当前提交
af7a65097b
共有 1 个文件被更改,包括 10 次插入4 次删除
  1. 10 4
      fs/btrfs/ordered-data.c

+ 10 - 4
fs/btrfs/ordered-data.c

@@ -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 @@ have_entry:
 	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;