summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2016-03-08 23:08:10 -0500
committerTheodore Ts'o <tytso@mit.edu>2016-03-08 23:08:10 -0500
commit705965bd6dfadc3b2e0241da1423ef660bdd04c8 (patch)
treec29f27d3d461da8b36c7708ea5f21778b7df40c3
parente142d05263a4beedefd331d445c394f4397e9f03 (diff)
ext4: rename and split get blocks functions
Rename ext4_get_blocks_write() to ext4_get_blocks_unwritten() to better describe what it does. Also split out get blocks functions for direct IO. Later we move functionality from _ext4_get_blocks() there. There's no functional change in this patch. Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
-rw-r--r--fs/ext4/ext4.h8
-rw-r--r--fs/ext4/indirect.c10
-rw-r--r--fs/ext4/inline.c7
-rw-r--r--fs/ext4/inode.c96
4 files changed, 74 insertions, 47 deletions
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index f4e9521cb8e7..d60db18edb4a 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -2506,12 +2506,14 @@ extern int ext4_trim_fs(struct super_block *, struct fstrim_range *);
2506int ext4_inode_is_fast_symlink(struct inode *inode); 2506int ext4_inode_is_fast_symlink(struct inode *inode);
2507struct buffer_head *ext4_getblk(handle_t *, struct inode *, ext4_lblk_t, int); 2507struct buffer_head *ext4_getblk(handle_t *, struct inode *, ext4_lblk_t, int);
2508struct buffer_head *ext4_bread(handle_t *, struct inode *, ext4_lblk_t, int); 2508struct buffer_head *ext4_bread(handle_t *, struct inode *, ext4_lblk_t, int);
2509int ext4_get_block_write(struct inode *inode, sector_t iblock, 2509int ext4_get_block_unwritten(struct inode *inode, sector_t iblock,
2510 struct buffer_head *bh_result, int create); 2510 struct buffer_head *bh_result, int create);
2511int ext4_dax_mmap_get_block(struct inode *inode, sector_t iblock, 2511int ext4_dax_mmap_get_block(struct inode *inode, sector_t iblock,
2512 struct buffer_head *bh_result, int create); 2512 struct buffer_head *bh_result, int create);
2513int ext4_get_block(struct inode *inode, sector_t iblock, 2513int ext4_get_block(struct inode *inode, sector_t iblock,
2514 struct buffer_head *bh_result, int create); 2514 struct buffer_head *bh_result, int create);
2515int ext4_dio_get_block(struct inode *inode, sector_t iblock,
2516 struct buffer_head *bh_result, int create);
2515int ext4_da_get_block_prep(struct inode *inode, sector_t iblock, 2517int ext4_da_get_block_prep(struct inode *inode, sector_t iblock,
2516 struct buffer_head *bh, int create); 2518 struct buffer_head *bh, int create);
2517int ext4_walk_page_buffers(handle_t *handle, 2519int ext4_walk_page_buffers(handle_t *handle,
diff --git a/fs/ext4/indirect.c b/fs/ext4/indirect.c
index 355ef9c36c87..1655ff195e0e 100644
--- a/fs/ext4/indirect.c
+++ b/fs/ext4/indirect.c
@@ -693,21 +693,21 @@ retry:
693 } 693 }
694 if (IS_DAX(inode)) 694 if (IS_DAX(inode))
695 ret = dax_do_io(iocb, inode, iter, offset, 695 ret = dax_do_io(iocb, inode, iter, offset,
696 ext4_get_block, NULL, 0); 696 ext4_dio_get_block, NULL, 0);
697 else 697 else
698 ret = __blockdev_direct_IO(iocb, inode, 698 ret = __blockdev_direct_IO(iocb, inode,
699 inode->i_sb->s_bdev, iter, 699 inode->i_sb->s_bdev, iter,
700 offset, ext4_get_block, NULL, 700 offset, ext4_dio_get_block,
701 NULL, 0); 701 NULL, NULL, 0);
702 inode_dio_end(inode); 702 inode_dio_end(inode);
703 } else { 703 } else {
704locked: 704locked:
705 if (IS_DAX(inode)) 705 if (IS_DAX(inode))
706 ret = dax_do_io(iocb, inode, iter, offset, 706 ret = dax_do_io(iocb, inode, iter, offset,
707 ext4_get_block, NULL, DIO_LOCKING); 707 ext4_dio_get_block, NULL, DIO_LOCKING);
708 else 708 else
709 ret = blockdev_direct_IO(iocb, inode, iter, offset, 709 ret = blockdev_direct_IO(iocb, inode, iter, offset,
710 ext4_get_block); 710 ext4_dio_get_block);
711 711
712 if (unlikely(iov_iter_rw(iter) == WRITE && ret < 0)) { 712 if (unlikely(iov_iter_rw(iter) == WRITE && ret < 0)) {
713 loff_t isize = i_size_read(inode); 713 loff_t isize = i_size_read(inode);
diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c
index dfe3b9bafc0d..36d8cc9327f5 100644
--- a/fs/ext4/inline.c
+++ b/fs/ext4/inline.c
@@ -581,9 +581,10 @@ retry:
581 if (ret) 581 if (ret)
582 goto out; 582 goto out;
583 583
584 if (ext4_should_dioread_nolock(inode)) 584 if (ext4_should_dioread_nolock(inode)) {
585 ret = __block_write_begin(page, from, to, ext4_get_block_write); 585 ret = __block_write_begin(page, from, to,
586 else 586 ext4_get_block_unwritten);
587 } else
587 ret = __block_write_begin(page, from, to, ext4_get_block); 588 ret = __block_write_begin(page, from, to, ext4_get_block);
588 589
589 if (!ret && ext4_should_journal_data(inode)) { 590 if (!ret && ext4_should_journal_data(inode)) {
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 9cc57c3b4661..bf545d017210 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -769,6 +769,60 @@ int ext4_get_block(struct inode *inode, sector_t iblock,
769} 769}
770 770
771/* 771/*
772 * Get block function used when preparing for buffered write if we require
773 * creating an unwritten extent if blocks haven't been allocated. The extent
774 * will be converted to written after the IO is complete.
775 */
776int ext4_get_block_unwritten(struct inode *inode, sector_t iblock,
777 struct buffer_head *bh_result, int create)
778{
779 ext4_debug("ext4_get_block_unwritten: inode %lu, create flag %d\n",
780 inode->i_ino, create);
781 return _ext4_get_block(inode, iblock, bh_result,
782 EXT4_GET_BLOCKS_IO_CREATE_EXT);
783}
784
785/* Get block function for DIO reads and writes to inodes without extents */
786int ext4_dio_get_block(struct inode *inode, sector_t iblock,
787 struct buffer_head *bh, int create)
788{
789 return _ext4_get_block(inode, iblock, bh,
790 create ? EXT4_GET_BLOCKS_CREATE : 0);
791}
792
793/*
794 * Get block function for DIO writes when we create unwritten extent if
795 * blocks are not allocated yet. The extent will be converted to written
796 * after IO is complete.
797 */
798static int ext4_dio_get_block_unwritten(struct inode *inode, sector_t iblock,
799 struct buffer_head *bh_result, int create)
800{
801 ext4_debug("ext4_dio_get_block_unwritten: inode %lu, create flag %d\n",
802 inode->i_ino, create);
803 return _ext4_get_block(inode, iblock, bh_result,
804 EXT4_GET_BLOCKS_IO_CREATE_EXT);
805}
806
807static int ext4_dio_get_block_overwrite(struct inode *inode, sector_t iblock,
808 struct buffer_head *bh_result, int create)
809{
810 int ret;
811
812 ext4_debug("ext4_dio_get_block_overwrite: inode %lu, create flag %d\n",
813 inode->i_ino, create);
814 ret = _ext4_get_block(inode, iblock, bh_result, 0);
815 /*
816 * Blocks should have been preallocated! ext4_file_write_iter() checks
817 * that.
818 */
819 WARN_ON_ONCE(!buffer_mapped(bh_result));
820
821 return ret;
822}
823
824
825/*
772 * `handle' can be NULL if create is zero 826 * `handle' can be NULL if create is zero
773 */ 827 */
774struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode, 828struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode,
@@ -1079,13 +1133,14 @@ retry_journal:
1079#ifdef CONFIG_EXT4_FS_ENCRYPTION 1133#ifdef CONFIG_EXT4_FS_ENCRYPTION
1080 if (ext4_should_dioread_nolock(inode)) 1134 if (ext4_should_dioread_nolock(inode))
1081 ret = ext4_block_write_begin(page, pos, len, 1135 ret = ext4_block_write_begin(page, pos, len,
1082 ext4_get_block_write); 1136 ext4_get_block_unwritten);
1083 else 1137 else
1084 ret = ext4_block_write_begin(page, pos, len, 1138 ret = ext4_block_write_begin(page, pos, len,
1085 ext4_get_block); 1139 ext4_get_block);
1086#else 1140#else
1087 if (ext4_should_dioread_nolock(inode)) 1141 if (ext4_should_dioread_nolock(inode))
1088 ret = __block_write_begin(page, pos, len, ext4_get_block_write); 1142 ret = __block_write_begin(page, pos, len,
1143 ext4_get_block_unwritten);
1089 else 1144 else
1090 ret = __block_write_begin(page, pos, len, ext4_get_block); 1145 ret = __block_write_begin(page, pos, len, ext4_get_block);
1091#endif 1146#endif
@@ -3084,37 +3139,6 @@ static int ext4_releasepage(struct page *page, gfp_t wait)
3084 return try_to_free_buffers(page); 3139 return try_to_free_buffers(page);
3085} 3140}
3086 3141
3087/*
3088 * ext4_get_block used when preparing for a DIO write or buffer write.
3089 * We allocate an uinitialized extent if blocks haven't been allocated.
3090 * The extent will be converted to initialized after the IO is complete.
3091 */
3092int ext4_get_block_write(struct inode *inode, sector_t iblock,
3093 struct buffer_head *bh_result, int create)
3094{
3095 ext4_debug("ext4_get_block_write: inode %lu, create flag %d\n",
3096 inode->i_ino, create);
3097 return _ext4_get_block(inode, iblock, bh_result,
3098 EXT4_GET_BLOCKS_IO_CREATE_EXT);
3099}
3100
3101static int ext4_get_block_overwrite(struct inode *inode, sector_t iblock,
3102 struct buffer_head *bh_result, int create)
3103{
3104 int ret;
3105
3106 ext4_debug("ext4_get_block_overwrite: inode %lu, create flag %d\n",
3107 inode->i_ino, create);
3108 ret = _ext4_get_block(inode, iblock, bh_result, 0);
3109 /*
3110 * Blocks should have been preallocated! ext4_file_write_iter() checks
3111 * that.
3112 */
3113 WARN_ON_ONCE(!buffer_mapped(bh_result));
3114
3115 return ret;
3116}
3117
3118#ifdef CONFIG_FS_DAX 3142#ifdef CONFIG_FS_DAX
3119int ext4_dax_mmap_get_block(struct inode *inode, sector_t iblock, 3143int ext4_dax_mmap_get_block(struct inode *inode, sector_t iblock,
3120 struct buffer_head *bh_result, int create) 3144 struct buffer_head *bh_result, int create)
@@ -3282,7 +3306,7 @@ static ssize_t ext4_ext_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
3282 */ 3306 */
3283 iocb->private = NULL; 3307 iocb->private = NULL;
3284 if (overwrite) { 3308 if (overwrite) {
3285 get_block_func = ext4_get_block_overwrite; 3309 get_block_func = ext4_dio_get_block_overwrite;
3286 } else { 3310 } else {
3287 ext4_inode_aio_set(inode, NULL); 3311 ext4_inode_aio_set(inode, NULL);
3288 if (!is_sync_kiocb(iocb)) { 3312 if (!is_sync_kiocb(iocb)) {
@@ -3304,7 +3328,7 @@ static ssize_t ext4_ext_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
3304 */ 3328 */
3305 ext4_inode_aio_set(inode, io_end); 3329 ext4_inode_aio_set(inode, io_end);
3306 } 3330 }
3307 get_block_func = ext4_get_block_write; 3331 get_block_func = ext4_dio_get_block_unwritten;
3308 dio_flags = DIO_LOCKING; 3332 dio_flags = DIO_LOCKING;
3309 } 3333 }
3310#ifdef CONFIG_EXT4_FS_ENCRYPTION 3334#ifdef CONFIG_EXT4_FS_ENCRYPTION
@@ -5498,7 +5522,7 @@ int ext4_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
5498 unlock_page(page); 5522 unlock_page(page);
5499 /* OK, we need to fill the hole... */ 5523 /* OK, we need to fill the hole... */
5500 if (ext4_should_dioread_nolock(inode)) 5524 if (ext4_should_dioread_nolock(inode))
5501 get_block = ext4_get_block_write; 5525 get_block = ext4_get_block_unwritten;
5502 else 5526 else
5503 get_block = ext4_get_block; 5527 get_block = ext4_get_block;
5504retry_alloc: 5528retry_alloc: