diff options
author | Jan Kara <jack@suse.cz> | 2016-11-04 13:08:15 -0400 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2016-11-04 16:34:47 -0400 |
commit | e64855c6cfaa0a80c1b71c5f647cb792dc436668 (patch) | |
tree | 751d56f17914506a5e54a380f9a4d4519cadfa18 | |
parent | 69a9bea146b185be8ec50e80eaecd8e487e689f8 (diff) |
fs: Add helper to clean bdev aliases under a bh and use it
Add a helper function that clears buffer heads from a block device
aliasing passed bh. Use this helper function from filesystems instead of
the original unmap_underlying_metadata() to save some boiler plate code
and also have a better name for the functionalily since it is not
unmapping anything for a *long* time.
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r-- | fs/buffer.c | 8 | ||||
-rw-r--r-- | fs/ext4/inode.c | 3 | ||||
-rw-r--r-- | fs/ext4/page-io.c | 2 | ||||
-rw-r--r-- | fs/mpage.c | 3 | ||||
-rw-r--r-- | fs/ntfs/aops.c | 2 | ||||
-rw-r--r-- | fs/ntfs/file.c | 5 | ||||
-rw-r--r-- | fs/ocfs2/aops.c | 2 | ||||
-rw-r--r-- | fs/ufs/balloc.c | 3 | ||||
-rw-r--r-- | fs/ufs/inode.c | 3 | ||||
-rw-r--r-- | include/linux/buffer_head.h | 4 |
10 files changed, 16 insertions, 19 deletions
diff --git a/fs/buffer.c b/fs/buffer.c index f8beca55240a..912d70169fca 100644 --- a/fs/buffer.c +++ b/fs/buffer.c | |||
@@ -1821,8 +1821,7 @@ int __block_write_full_page(struct inode *inode, struct page *page, | |||
1821 | if (buffer_new(bh)) { | 1821 | if (buffer_new(bh)) { |
1822 | /* blockdev mappings never come here */ | 1822 | /* blockdev mappings never come here */ |
1823 | clear_buffer_new(bh); | 1823 | clear_buffer_new(bh); |
1824 | unmap_underlying_metadata(bh->b_bdev, | 1824 | clean_bdev_bh_alias(bh); |
1825 | bh->b_blocknr); | ||
1826 | } | 1825 | } |
1827 | } | 1826 | } |
1828 | bh = bh->b_this_page; | 1827 | bh = bh->b_this_page; |
@@ -2068,8 +2067,7 @@ int __block_write_begin_int(struct page *page, loff_t pos, unsigned len, | |||
2068 | } | 2067 | } |
2069 | 2068 | ||
2070 | if (buffer_new(bh)) { | 2069 | if (buffer_new(bh)) { |
2071 | unmap_underlying_metadata(bh->b_bdev, | 2070 | clean_bdev_bh_alias(bh); |
2072 | bh->b_blocknr); | ||
2073 | if (PageUptodate(page)) { | 2071 | if (PageUptodate(page)) { |
2074 | clear_buffer_new(bh); | 2072 | clear_buffer_new(bh); |
2075 | set_buffer_uptodate(bh); | 2073 | set_buffer_uptodate(bh); |
@@ -2709,7 +2707,7 @@ int nobh_write_begin(struct address_space *mapping, | |||
2709 | if (!buffer_mapped(bh)) | 2707 | if (!buffer_mapped(bh)) |
2710 | is_mapped_to_disk = 0; | 2708 | is_mapped_to_disk = 0; |
2711 | if (buffer_new(bh)) | 2709 | if (buffer_new(bh)) |
2712 | unmap_underlying_metadata(bh->b_bdev, bh->b_blocknr); | 2710 | clean_bdev_bh_alias(bh); |
2713 | if (PageUptodate(page)) { | 2711 | if (PageUptodate(page)) { |
2714 | set_buffer_uptodate(bh); | 2712 | set_buffer_uptodate(bh); |
2715 | continue; | 2713 | continue; |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 7c7cc4ae4b8e..2f8127601bef 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -1123,8 +1123,7 @@ static int ext4_block_write_begin(struct page *page, loff_t pos, unsigned len, | |||
1123 | if (err) | 1123 | if (err) |
1124 | break; | 1124 | break; |
1125 | if (buffer_new(bh)) { | 1125 | if (buffer_new(bh)) { |
1126 | unmap_underlying_metadata(bh->b_bdev, | 1126 | clean_bdev_bh_alias(bh); |
1127 | bh->b_blocknr); | ||
1128 | if (PageUptodate(page)) { | 1127 | if (PageUptodate(page)) { |
1129 | clear_buffer_new(bh); | 1128 | clear_buffer_new(bh); |
1130 | set_buffer_uptodate(bh); | 1129 | set_buffer_uptodate(bh); |
diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c index e0b3b54cdef3..f28fd6483e04 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c | |||
@@ -457,7 +457,7 @@ int ext4_bio_write_page(struct ext4_io_submit *io, | |||
457 | } | 457 | } |
458 | if (buffer_new(bh)) { | 458 | if (buffer_new(bh)) { |
459 | clear_buffer_new(bh); | 459 | clear_buffer_new(bh); |
460 | unmap_underlying_metadata(bh->b_bdev, bh->b_blocknr); | 460 | clean_bdev_bh_alias(bh); |
461 | } | 461 | } |
462 | set_buffer_async_write(bh); | 462 | set_buffer_async_write(bh); |
463 | nr_to_submit++; | 463 | nr_to_submit++; |
diff --git a/fs/mpage.c b/fs/mpage.c index 98fc11aa7e0b..28af984a3d96 100644 --- a/fs/mpage.c +++ b/fs/mpage.c | |||
@@ -555,8 +555,7 @@ static int __mpage_writepage(struct page *page, struct writeback_control *wbc, | |||
555 | if (mpd->get_block(inode, block_in_file, &map_bh, 1)) | 555 | if (mpd->get_block(inode, block_in_file, &map_bh, 1)) |
556 | goto confused; | 556 | goto confused; |
557 | if (buffer_new(&map_bh)) | 557 | if (buffer_new(&map_bh)) |
558 | unmap_underlying_metadata(map_bh.b_bdev, | 558 | clean_bdev_bh_alias(&map_bh); |
559 | map_bh.b_blocknr); | ||
560 | if (buffer_boundary(&map_bh)) { | 559 | if (buffer_boundary(&map_bh)) { |
561 | boundary_block = map_bh.b_blocknr; | 560 | boundary_block = map_bh.b_blocknr; |
562 | boundary_bdev = map_bh.b_bdev; | 561 | boundary_bdev = map_bh.b_bdev; |
diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c index d0cf6fee5c77..cc91856b5e2d 100644 --- a/fs/ntfs/aops.c +++ b/fs/ntfs/aops.c | |||
@@ -765,7 +765,7 @@ lock_retry_remap: | |||
765 | } | 765 | } |
766 | // TODO: Instantiate the hole. | 766 | // TODO: Instantiate the hole. |
767 | // clear_buffer_new(bh); | 767 | // clear_buffer_new(bh); |
768 | // unmap_underlying_metadata(bh->b_bdev, bh->b_blocknr); | 768 | // clean_bdev_bh_alias(bh); |
769 | ntfs_error(vol->sb, "Writing into sparse regions is " | 769 | ntfs_error(vol->sb, "Writing into sparse regions is " |
770 | "not supported yet. Sorry."); | 770 | "not supported yet. Sorry."); |
771 | err = -EOPNOTSUPP; | 771 | err = -EOPNOTSUPP; |
diff --git a/fs/ntfs/file.c b/fs/ntfs/file.c index bf72a2c58b75..99510d811a8c 100644 --- a/fs/ntfs/file.c +++ b/fs/ntfs/file.c | |||
@@ -740,8 +740,7 @@ map_buffer_cached: | |||
740 | set_buffer_uptodate(bh); | 740 | set_buffer_uptodate(bh); |
741 | if (unlikely(was_hole)) { | 741 | if (unlikely(was_hole)) { |
742 | /* We allocated the buffer. */ | 742 | /* We allocated the buffer. */ |
743 | unmap_underlying_metadata(bh->b_bdev, | 743 | clean_bdev_bh_alias(bh); |
744 | bh->b_blocknr); | ||
745 | if (bh_end <= pos || bh_pos >= end) | 744 | if (bh_end <= pos || bh_pos >= end) |
746 | mark_buffer_dirty(bh); | 745 | mark_buffer_dirty(bh); |
747 | else | 746 | else |
@@ -784,7 +783,7 @@ map_buffer_cached: | |||
784 | continue; | 783 | continue; |
785 | } | 784 | } |
786 | /* We allocated the buffer. */ | 785 | /* We allocated the buffer. */ |
787 | unmap_underlying_metadata(bh->b_bdev, bh->b_blocknr); | 786 | clean_bdev_bh_alias(bh); |
788 | /* | 787 | /* |
789 | * If the buffer is fully outside the write, zero it, | 788 | * If the buffer is fully outside the write, zero it, |
790 | * set it uptodate, and mark it dirty so it gets | 789 | * set it uptodate, and mark it dirty so it gets |
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index c5c5b9748ea3..e8f65eefffca 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c | |||
@@ -630,7 +630,7 @@ int ocfs2_map_page_blocks(struct page *page, u64 *p_blkno, | |||
630 | 630 | ||
631 | if (!buffer_mapped(bh)) { | 631 | if (!buffer_mapped(bh)) { |
632 | map_bh(bh, inode->i_sb, *p_blkno); | 632 | map_bh(bh, inode->i_sb, *p_blkno); |
633 | unmap_underlying_metadata(bh->b_bdev, bh->b_blocknr); | 633 | clean_bdev_bh_alias(bh); |
634 | } | 634 | } |
635 | 635 | ||
636 | if (PageUptodate(page)) { | 636 | if (PageUptodate(page)) { |
diff --git a/fs/ufs/balloc.c b/fs/ufs/balloc.c index b035af54f538..a0376a2c1c29 100644 --- a/fs/ufs/balloc.c +++ b/fs/ufs/balloc.c | |||
@@ -307,8 +307,7 @@ static void ufs_change_blocknr(struct inode *inode, sector_t beg, | |||
307 | (unsigned long long)(pos + newb), pos); | 307 | (unsigned long long)(pos + newb), pos); |
308 | 308 | ||
309 | bh->b_blocknr = newb + pos; | 309 | bh->b_blocknr = newb + pos; |
310 | unmap_underlying_metadata(bh->b_bdev, | 310 | clean_bdev_bh_alias(bh); |
311 | bh->b_blocknr); | ||
312 | mark_buffer_dirty(bh); | 311 | mark_buffer_dirty(bh); |
313 | ++j; | 312 | ++j; |
314 | bh = bh->b_this_page; | 313 | bh = bh->b_this_page; |
diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index 190d64be22ed..45ceb94e89e4 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c | |||
@@ -1070,8 +1070,7 @@ static int ufs_alloc_lastblock(struct inode *inode, loff_t size) | |||
1070 | 1070 | ||
1071 | if (buffer_new(bh)) { | 1071 | if (buffer_new(bh)) { |
1072 | clear_buffer_new(bh); | 1072 | clear_buffer_new(bh); |
1073 | unmap_underlying_metadata(bh->b_bdev, | 1073 | clean_bdev_bh_alias(bh); |
1074 | bh->b_blocknr); | ||
1075 | /* | 1074 | /* |
1076 | * we do not zeroize fragment, because of | 1075 | * we do not zeroize fragment, because of |
1077 | * if it maped to hole, it already contains zeroes | 1076 | * if it maped to hole, it already contains zeroes |
diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index 9c9c73ce7d4f..d1ab91fc6d43 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h | |||
@@ -171,6 +171,10 @@ int sync_mapping_buffers(struct address_space *mapping); | |||
171 | void unmap_underlying_metadata(struct block_device *bdev, sector_t block); | 171 | void unmap_underlying_metadata(struct block_device *bdev, sector_t block); |
172 | void clean_bdev_aliases(struct block_device *bdev, sector_t block, | 172 | void clean_bdev_aliases(struct block_device *bdev, sector_t block, |
173 | sector_t len); | 173 | sector_t len); |
174 | static inline void clean_bdev_bh_alias(struct buffer_head *bh) | ||
175 | { | ||
176 | clean_bdev_aliases(bh->b_bdev, bh->b_blocknr, 1); | ||
177 | } | ||
174 | 178 | ||
175 | void mark_buffer_async_write(struct buffer_head *bh); | 179 | void mark_buffer_async_write(struct buffer_head *bh); |
176 | void __wait_on_buffer(struct buffer_head *); | 180 | void __wait_on_buffer(struct buffer_head *); |