|
@@ -220,25 +220,17 @@ static struct hfs_bnode *hfs_bmap_new_bmap(struct hfs_bnode *prev, u32 idx)
|
|
|
return node;
|
|
|
}
|
|
|
|
|
|
-struct hfs_bnode *hfs_bmap_alloc(struct hfs_btree *tree)
|
|
|
+/* Make sure @tree has enough space for the @rsvd_nodes */
|
|
|
+int hfs_bmap_reserve(struct hfs_btree *tree, int rsvd_nodes)
|
|
|
{
|
|
|
- struct hfs_bnode *node, *next_node;
|
|
|
- struct page **pagep;
|
|
|
- u32 nidx, idx;
|
|
|
- unsigned off;
|
|
|
- u16 off16;
|
|
|
- u16 len;
|
|
|
- u8 *data, byte, m;
|
|
|
- int i;
|
|
|
-
|
|
|
- while (!tree->free_nodes) {
|
|
|
- struct inode *inode = tree->inode;
|
|
|
- u32 count;
|
|
|
- int res;
|
|
|
+ struct inode *inode = tree->inode;
|
|
|
+ u32 count;
|
|
|
+ int res;
|
|
|
|
|
|
+ while (tree->free_nodes < rsvd_nodes) {
|
|
|
res = hfs_extend_file(inode);
|
|
|
if (res)
|
|
|
- return ERR_PTR(res);
|
|
|
+ return res;
|
|
|
HFS_I(inode)->phys_size = inode->i_size =
|
|
|
(loff_t)HFS_I(inode)->alloc_blocks *
|
|
|
HFS_SB(tree->sb)->alloc_blksz;
|
|
@@ -246,9 +238,26 @@ struct hfs_bnode *hfs_bmap_alloc(struct hfs_btree *tree)
|
|
|
tree->sb->s_blocksize_bits;
|
|
|
inode_set_bytes(inode, inode->i_size);
|
|
|
count = inode->i_size >> tree->node_size_shift;
|
|
|
- tree->free_nodes = count - tree->node_count;
|
|
|
+ tree->free_nodes += count - tree->node_count;
|
|
|
tree->node_count = count;
|
|
|
}
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+struct hfs_bnode *hfs_bmap_alloc(struct hfs_btree *tree)
|
|
|
+{
|
|
|
+ struct hfs_bnode *node, *next_node;
|
|
|
+ struct page **pagep;
|
|
|
+ u32 nidx, idx;
|
|
|
+ unsigned off;
|
|
|
+ u16 off16;
|
|
|
+ u16 len;
|
|
|
+ u8 *data, byte, m;
|
|
|
+ int i, res;
|
|
|
+
|
|
|
+ res = hfs_bmap_reserve(tree, 1);
|
|
|
+ if (res)
|
|
|
+ return ERR_PTR(res);
|
|
|
|
|
|
nidx = 0;
|
|
|
node = hfs_bnode_find(tree, nidx);
|