|
@@ -734,11 +734,11 @@ int ext4_get_block(struct inode *inode, sector_t iblock,
|
|
|
* `handle' can be NULL if create is zero
|
|
|
*/
|
|
|
struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode,
|
|
|
- ext4_lblk_t block, int create, int *errp)
|
|
|
+ ext4_lblk_t block, int create)
|
|
|
{
|
|
|
struct ext4_map_blocks map;
|
|
|
struct buffer_head *bh;
|
|
|
- int fatal = 0, err;
|
|
|
+ int err;
|
|
|
|
|
|
J_ASSERT(handle != NULL || create == 0);
|
|
|
|
|
@@ -747,21 +747,14 @@ struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode,
|
|
|
err = ext4_map_blocks(handle, inode, &map,
|
|
|
create ? EXT4_GET_BLOCKS_CREATE : 0);
|
|
|
|
|
|
- /* ensure we send some value back into *errp */
|
|
|
- *errp = 0;
|
|
|
-
|
|
|
- if (create && err == 0)
|
|
|
- err = -ENOSPC; /* should never happen */
|
|
|
+ if (err == 0)
|
|
|
+ return create ? ERR_PTR(-ENOSPC) : NULL;
|
|
|
if (err < 0)
|
|
|
- *errp = err;
|
|
|
- if (err <= 0)
|
|
|
- return NULL;
|
|
|
+ return ERR_PTR(err);
|
|
|
|
|
|
bh = sb_getblk(inode->i_sb, map.m_pblk);
|
|
|
- if (unlikely(!bh)) {
|
|
|
- *errp = -ENOMEM;
|
|
|
- return NULL;
|
|
|
- }
|
|
|
+ if (unlikely(!bh))
|
|
|
+ return ERR_PTR(-ENOMEM);
|
|
|
if (map.m_flags & EXT4_MAP_NEW) {
|
|
|
J_ASSERT(create != 0);
|
|
|
J_ASSERT(handle != NULL);
|
|
@@ -775,25 +768,26 @@ struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode,
|
|
|
*/
|
|
|
lock_buffer(bh);
|
|
|
BUFFER_TRACE(bh, "call get_create_access");
|
|
|
- fatal = ext4_journal_get_create_access(handle, bh);
|
|
|
- if (!fatal && !buffer_uptodate(bh)) {
|
|
|
+ err = ext4_journal_get_create_access(handle, bh);
|
|
|
+ if (unlikely(err)) {
|
|
|
+ unlock_buffer(bh);
|
|
|
+ goto errout;
|
|
|
+ }
|
|
|
+ if (!buffer_uptodate(bh)) {
|
|
|
memset(bh->b_data, 0, inode->i_sb->s_blocksize);
|
|
|
set_buffer_uptodate(bh);
|
|
|
}
|
|
|
unlock_buffer(bh);
|
|
|
BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata");
|
|
|
err = ext4_handle_dirty_metadata(handle, inode, bh);
|
|
|
- if (!fatal)
|
|
|
- fatal = err;
|
|
|
- } else {
|
|
|
+ if (unlikely(err))
|
|
|
+ goto errout;
|
|
|
+ } else
|
|
|
BUFFER_TRACE(bh, "not a new buffer");
|
|
|
- }
|
|
|
- if (fatal) {
|
|
|
- *errp = fatal;
|
|
|
- brelse(bh);
|
|
|
- bh = NULL;
|
|
|
- }
|
|
|
return bh;
|
|
|
+errout:
|
|
|
+ brelse(bh);
|
|
|
+ return ERR_PTR(err);
|
|
|
}
|
|
|
|
|
|
struct buffer_head *ext4_bread(handle_t *handle, struct inode *inode,
|
|
@@ -801,7 +795,12 @@ struct buffer_head *ext4_bread(handle_t *handle, struct inode *inode,
|
|
|
{
|
|
|
struct buffer_head *bh;
|
|
|
|
|
|
- bh = ext4_getblk(handle, inode, block, create, err);
|
|
|
+ *err = 0;
|
|
|
+ bh = ext4_getblk(handle, inode, block, create);
|
|
|
+ if (IS_ERR(bh)) {
|
|
|
+ *err = PTR_ERR(bh);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
if (!bh)
|
|
|
return bh;
|
|
|
if (buffer_uptodate(bh))
|