ext2: stop passing buffer_head to ext2_get_blocks

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Ross Zwisler <ross.zwisler@linux.intel.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
Christoph Hellwig 2016-09-19 11:28:39 +10:00 коммит произвёл Dave Chinner
Родитель 6c31f495d1
Коммит 6750ad7198
1 изменённых файлов: 24 добавлений и 15 удалений

Просмотреть файл

@ -618,7 +618,7 @@ static void ext2_splice_branch(struct inode *inode,
*/ */
static int ext2_get_blocks(struct inode *inode, static int ext2_get_blocks(struct inode *inode,
sector_t iblock, unsigned long maxblocks, sector_t iblock, unsigned long maxblocks,
struct buffer_head *bh_result, u32 *bno, bool *new, bool *boundary,
int create) int create)
{ {
int err = -EIO; int err = -EIO;
@ -644,7 +644,6 @@ static int ext2_get_blocks(struct inode *inode,
/* Simplest case - block found, no allocation needed */ /* Simplest case - block found, no allocation needed */
if (!partial) { if (!partial) {
first_block = le32_to_cpu(chain[depth - 1].key); first_block = le32_to_cpu(chain[depth - 1].key);
clear_buffer_new(bh_result); /* What's this do? */
count++; count++;
/*map more blocks*/ /*map more blocks*/
while (count < maxblocks && count <= blocks_to_boundary) { while (count < maxblocks && count <= blocks_to_boundary) {
@ -699,7 +698,6 @@ static int ext2_get_blocks(struct inode *inode,
mutex_unlock(&ei->truncate_mutex); mutex_unlock(&ei->truncate_mutex);
if (err) if (err)
goto cleanup; goto cleanup;
clear_buffer_new(bh_result);
goto got_it; goto got_it;
} }
} }
@ -745,15 +743,16 @@ static int ext2_get_blocks(struct inode *inode,
mutex_unlock(&ei->truncate_mutex); mutex_unlock(&ei->truncate_mutex);
goto cleanup; goto cleanup;
} }
} else } else {
set_buffer_new(bh_result); *new = true;
}
ext2_splice_branch(inode, iblock, partial, indirect_blks, count); ext2_splice_branch(inode, iblock, partial, indirect_blks, count);
mutex_unlock(&ei->truncate_mutex); mutex_unlock(&ei->truncate_mutex);
got_it: got_it:
map_bh(bh_result, inode->i_sb, le32_to_cpu(chain[depth-1].key)); *bno = le32_to_cpu(chain[depth-1].key);
if (count > blocks_to_boundary) if (count > blocks_to_boundary)
set_buffer_boundary(bh_result); *boundary = true;
err = count; err = count;
/* Clean up and exit */ /* Clean up and exit */
partial = chain + depth - 1; /* the whole chain */ partial = chain + depth - 1; /* the whole chain */
@ -765,17 +764,27 @@ cleanup:
return err; return err;
} }
int ext2_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create) int ext2_get_block(struct inode *inode, sector_t iblock,
struct buffer_head *bh_result, int create)
{ {
unsigned max_blocks = bh_result->b_size >> inode->i_blkbits; unsigned max_blocks = bh_result->b_size >> inode->i_blkbits;
int ret = ext2_get_blocks(inode, iblock, max_blocks, bool new = false, boundary = false;
bh_result, create); u32 bno;
if (ret > 0) { int ret;
bh_result->b_size = (ret << inode->i_blkbits);
ret = 0; ret = ext2_get_blocks(inode, iblock, max_blocks, &bno, &new, &boundary,
} create);
if (ret <= 0)
return ret; return ret;
map_bh(bh_result, inode->i_sb, bno);
bh_result->b_size = (ret << inode->i_blkbits);
if (new)
set_buffer_new(bh_result);
if (boundary)
set_buffer_boundary(bh_result);
return 0;
} }
int ext2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, int ext2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,