aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/disk-io.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r--fs/btrfs/disk-io.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index dcaf55695e6f..aa02eab8c40b 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -46,6 +46,10 @@
46#include "check-integrity.h" 46#include "check-integrity.h"
47#include "rcu-string.h" 47#include "rcu-string.h"
48 48
49#ifdef CONFIG_X86
50#include <asm/cpufeature.h>
51#endif
52
49static struct extent_io_ops btree_extent_io_ops; 53static struct extent_io_ops btree_extent_io_ops;
50static void end_workqueue_fn(struct btrfs_work *work); 54static void end_workqueue_fn(struct btrfs_work *work);
51static void free_fs_root(struct btrfs_root *root); 55static void free_fs_root(struct btrfs_root *root);
@@ -859,10 +863,22 @@ static int __btree_submit_bio_done(struct inode *inode, int rw, struct bio *bio,
859 return btrfs_map_bio(BTRFS_I(inode)->root, rw, bio, mirror_num, 1); 863 return btrfs_map_bio(BTRFS_I(inode)->root, rw, bio, mirror_num, 1);
860} 864}
861 865
866static int check_async_write(struct inode *inode, unsigned long bio_flags)
867{
868 if (bio_flags & EXTENT_BIO_TREE_LOG)
869 return 0;
870#ifdef CONFIG_X86
871 if (cpu_has_xmm4_2)
872 return 0;
873#endif
874 return 1;
875}
876
862static int btree_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, 877static int btree_submit_bio_hook(struct inode *inode, int rw, struct bio *bio,
863 int mirror_num, unsigned long bio_flags, 878 int mirror_num, unsigned long bio_flags,
864 u64 bio_offset) 879 u64 bio_offset)
865{ 880{
881 int async = check_async_write(inode, bio_flags);
866 int ret; 882 int ret;
867 883
868 if (!(rw & REQ_WRITE)) { 884 if (!(rw & REQ_WRITE)) {
@@ -877,6 +893,12 @@ static int btree_submit_bio_hook(struct inode *inode, int rw, struct bio *bio,
877 return ret; 893 return ret;
878 return btrfs_map_bio(BTRFS_I(inode)->root, rw, bio, 894 return btrfs_map_bio(BTRFS_I(inode)->root, rw, bio,
879 mirror_num, 0); 895 mirror_num, 0);
896 } else if (!async) {
897 ret = btree_csum_one_bio(bio);
898 if (ret)
899 return ret;
900 return btrfs_map_bio(BTRFS_I(inode)->root, rw, bio,
901 mirror_num, 0);
880 } 902 }
881 903
882 /* 904 /*