return bh;
newblock:
- bh = osd_ldiskfs_append(h, inode, b, e);
+ bh = osd_ldiskfs_append(h, inode, b);
+ if (IS_ERR(bh)) {
+ *e = PTR_ERR(bh);
+ bh = NULL;
+ }
+
return bh;
fail:
sb = obj->i_sb;
bsize = sb->s_blocksize;
- root_node = osd_ldiskfs_append(handle, obj, &blknr, &result);
- leaf_node = osd_ldiskfs_append(handle, obj, &blknr, &result);
- if (root_node != NULL && leaf_node != NULL) {
- lfix_root(root_node->b_data, bsize, keysize, ptrsize, recsize);
- lfix_leaf(leaf_node->b_data, bsize, keysize, ptrsize, recsize);
- ldiskfs_mark_inode_dirty(handle, obj);
- result = ldiskfs_handle_dirty_metadata(handle, NULL, root_node);
- if (result == 0)
- result = ldiskfs_handle_dirty_metadata(handle, NULL,
- leaf_node);
- if (result != 0)
- ldiskfs_std_error(sb, result);
- }
- brelse(leaf_node);
- brelse(root_node);
- return result;
+ root_node = osd_ldiskfs_append(handle, obj, &blknr);
+ if (IS_ERR(root_node))
+ GOTO(out, result = PTR_ERR(root_node));
+
+ leaf_node = osd_ldiskfs_append(handle, obj, &blknr);
+ if (IS_ERR(leaf_node))
+ GOTO(out_root, result = PTR_ERR(leaf_node));
+
+ lfix_root(root_node->b_data, bsize, keysize, ptrsize, recsize);
+ lfix_leaf(leaf_node->b_data, bsize, keysize, ptrsize, recsize);
+ ldiskfs_mark_inode_dirty(handle, obj);
+ result = ldiskfs_handle_dirty_metadata(handle, NULL, root_node);
+ if (result == 0)
+ result = ldiskfs_handle_dirty_metadata(handle, NULL, leaf_node);
+ if (result != 0)
+ ldiskfs_std_error(sb, result);
+
+ brelse(leaf_node);
+
+ GOTO(out_root, result);
+
+out_root:
+ brelse(root_node);
+out:
+ return result;
}
sb = obj->i_sb;
bsize = sb->s_blocksize;
- root_node = osd_ldiskfs_append(handle, obj, &blknr, &result);
- leaf_node = osd_ldiskfs_append(handle, obj, &blknr, &result);
- if (root_node != NULL && leaf_node != NULL) {
- lvar_root(root_node->b_data, bsize, keysize, ptrsize, recsize);
- lvar_leaf(leaf_node->b_data, bsize, keysize, ptrsize, recsize);
- ldiskfs_mark_inode_dirty(handle, obj);
- result = ldiskfs_handle_dirty_metadata(handle, NULL, root_node);
- if (result == 0)
- result = ldiskfs_handle_dirty_metadata(handle, NULL,
- leaf_node);
- if (result != 0)
- ldiskfs_std_error(sb, result);
- }
- brelse(leaf_node);
- brelse(root_node);
- return result;
+ root_node = osd_ldiskfs_append(handle, obj, &blknr);
+ if (IS_ERR(root_node))
+ GOTO(out, result = PTR_ERR(root_node));
+
+ leaf_node = osd_ldiskfs_append(handle, obj, &blknr);
+ if (IS_ERR(leaf_node))
+ GOTO(out_root, result = PTR_ERR(leaf_node));
+
+ lvar_root(root_node->b_data, bsize, keysize, ptrsize, recsize);
+ lvar_leaf(leaf_node->b_data, bsize, keysize, ptrsize, recsize);
+ ldiskfs_mark_inode_dirty(handle, obj);
+ result = ldiskfs_handle_dirty_metadata(handle, NULL, root_node);
+ if (result == 0)
+ result = ldiskfs_handle_dirty_metadata(handle, NULL, leaf_node);
+ if (result != 0)
+ ldiskfs_std_error(sb, result);
+
+ brelse(leaf_node);
+
+ GOTO(out_root, result);
+
+out_root:
+ brelse(root_node);
+out:
+ return result;
}
static struct iam_operations lvar_ops = {
#ifdef LDISKFS_HT_MISC
# define osd_journal_start_sb(sb, type, nblock) \
ldiskfs_journal_start_sb(sb, type, nblock)
-# define osd_ldiskfs_append(handle, inode, nblock, err) \
+# define osd_ldiskfs_append(handle, inode, nblock) \
ldiskfs_append(handle, inode, nblock)
# define osd_ldiskfs_find_entry(dir, name, de, inlined, lock) \
__ldiskfs_find_entry(dir, name, de, inlined, lock)
# define LDISKFS_HT_MISC 0
# define osd_journal_start_sb(sb, type, nblock) \
ldiskfs_journal_start_sb(sb, nblock)
-# define osd_ldiskfs_append(handle, inode, nblock, err) \
- ldiskfs_append(handle, inode, nblock, err)
+
+static inline struct buffer_head *osd_ldiskfs_append(handle_t *handle,
+ struct inode *inode,
+ ldiskfs_lblk_t *nblock)
+{
+ struct buffer_head *bh;
+ int err = 0;
+
+ bh = ldiskfs_append(handle, inode, nblock, &err);
+ if (bh == NULL)
+ bh = ERR_PTR(err);
+
+ return bh;
+}
+
# define osd_ldiskfs_find_entry(dir, name, de, inlined, lock) \
__ldiskfs_find_entry(dir, name, de, lock)
# define osd_journal_start(inode, type, nblocks) \