diff options
author | Dan Williams <dan.j.williams@intel.com> | 2017-08-30 12:43:34 -0400 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2017-08-31 12:33:30 -0400 |
commit | 8cf037a8b22f71c6659bd0246bfaba9e79766f64 (patch) | |
tree | 29488639a0421bfd6316beb79131630d43039009 /fs/ext2/inode.c | |
parent | 486aff5e04823bb1e60c4045226eb244024b8420 (diff) |
ext2: perform dax_device lookup at mount
The ->iomap_begin() operation is a hot path, so cache the
fs_dax_get_by_host() result at mount time to avoid the incurring the
hash lookup overhead on a per-i/o basis.
Cc: "Theodore Ts'o" <tytso@mit.edu>
Cc: Andreas Dilger <adilger.kernel@dilger.ca>
Reviewed-by: Jan Kara <jack@suse.cz>
Reported-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'fs/ext2/inode.c')
-rw-r--r-- | fs/ext2/inode.c | 11 |
1 files changed, 3 insertions, 8 deletions
diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 30163d007b2f..4dca6f348714 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c | |||
@@ -800,10 +800,10 @@ int ext2_get_block(struct inode *inode, sector_t iblock, | |||
800 | static int ext2_iomap_begin(struct inode *inode, loff_t offset, loff_t length, | 800 | static int ext2_iomap_begin(struct inode *inode, loff_t offset, loff_t length, |
801 | unsigned flags, struct iomap *iomap) | 801 | unsigned flags, struct iomap *iomap) |
802 | { | 802 | { |
803 | struct block_device *bdev; | ||
804 | unsigned int blkbits = inode->i_blkbits; | 803 | unsigned int blkbits = inode->i_blkbits; |
805 | unsigned long first_block = offset >> blkbits; | 804 | unsigned long first_block = offset >> blkbits; |
806 | unsigned long max_blocks = (length + (1 << blkbits) - 1) >> blkbits; | 805 | unsigned long max_blocks = (length + (1 << blkbits) - 1) >> blkbits; |
806 | struct ext2_sb_info *sbi = EXT2_SB(inode->i_sb); | ||
807 | bool new = false, boundary = false; | 807 | bool new = false, boundary = false; |
808 | u32 bno; | 808 | u32 bno; |
809 | int ret; | 809 | int ret; |
@@ -814,13 +814,9 @@ static int ext2_iomap_begin(struct inode *inode, loff_t offset, loff_t length, | |||
814 | return ret; | 814 | return ret; |
815 | 815 | ||
816 | iomap->flags = 0; | 816 | iomap->flags = 0; |
817 | bdev = inode->i_sb->s_bdev; | 817 | iomap->bdev = inode->i_sb->s_bdev; |
818 | iomap->bdev = bdev; | ||
819 | iomap->offset = (u64)first_block << blkbits; | 818 | iomap->offset = (u64)first_block << blkbits; |
820 | if (blk_queue_dax(bdev->bd_queue)) | 819 | iomap->dax_dev = sbi->s_daxdev; |
821 | iomap->dax_dev = fs_dax_get_by_host(bdev->bd_disk->disk_name); | ||
822 | else | ||
823 | iomap->dax_dev = NULL; | ||
824 | 820 | ||
825 | if (ret == 0) { | 821 | if (ret == 0) { |
826 | iomap->type = IOMAP_HOLE; | 822 | iomap->type = IOMAP_HOLE; |
@@ -842,7 +838,6 @@ static int | |||
842 | ext2_iomap_end(struct inode *inode, loff_t offset, loff_t length, | 838 | ext2_iomap_end(struct inode *inode, loff_t offset, loff_t length, |
843 | ssize_t written, unsigned flags, struct iomap *iomap) | 839 | ssize_t written, unsigned flags, struct iomap *iomap) |
844 | { | 840 | { |
845 | fs_put_dax(iomap->dax_dev); | ||
846 | if (iomap->type == IOMAP_MAPPED && | 841 | if (iomap->type == IOMAP_MAPPED && |
847 | written < length && | 842 | written < length && |
848 | (flags & IOMAP_WRITE)) | 843 | (flags & IOMAP_WRITE)) |