diff options
author | Liu Bo <bo.liu@linux.alibaba.com> | 2018-08-25 07:47:09 +0200 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2018-10-15 17:23:29 +0200 |
commit | e49aabd973fd0b3e8e949bd9e7e05acbb9008244 (patch) | |
tree | a252d214b5e84393e8258286768935cede688be1 /fs/btrfs/inode.c | |
parent | Btrfs: fix alignment in declaration and prototype of btrfs_get_extent (diff) | |
download | linux-e49aabd973fd0b3e8e949bd9e7e05acbb9008244.tar.xz linux-e49aabd973fd0b3e8e949bd9e7e05acbb9008244.zip |
Btrfs: set leave_spinning in btrfs_get_extent
Unless it's going to read inline extents from btree leaf to page,
btrfs_get_extent won't sleep during the period of holding path lock.
This sets leave_spinning at first and sets path to blocking mode right
before reading inline extent if that's the case. The benefit is that a
path in spinning mode typically has lower impact (faster) on waiters
rather than that in the blocking mode.
Signed-off-by: Liu Bo <bo.liu@linux.alibaba.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to '')
-rw-r--r-- | fs/btrfs/inode.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 80e92c4448bb..e8a954c47f65 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -6827,6 +6827,12 @@ struct extent_map *btrfs_get_extent(struct btrfs_inode *inode, /* Chances are we'll be called again, so go ahead and do readahead */ path->reada = READA_FORWARD; + /* + * Unless we're going to uncompress the inline extent, no sleep would + * happen. + */ + path->leave_spinning = 1; + ret = btrfs_lookup_file_extent(NULL, root, path, objectid, start, 0); if (ret < 0) { err = ret; @@ -6929,6 +6935,8 @@ next: em->orig_block_len = em->len; em->orig_start = em->start; ptr = btrfs_file_extent_inline_start(item) + extent_offset; + + btrfs_set_path_blocking(path); if (!PageUptodate(page)) { if (btrfs_file_extent_compression(leaf, item) != BTRFS_COMPRESS_NONE) { |