|
@@ -100,7 +100,7 @@
|
|
|
* inode as:
|
|
|
*
|
|
|
* { page }
|
|
|
- * [ group 0 buddy][ group 0 bitmap] [group 1][ group 1]...
|
|
|
+ * [ group 0 bitmap][ group 0 buddy] [group 1][ group 1]...
|
|
|
*
|
|
|
*
|
|
|
* one block each for bitmap and buddy information. So for each group we
|
|
@@ -330,6 +330,16 @@
|
|
|
* object
|
|
|
*
|
|
|
*/
|
|
|
+static struct kmem_cache *ext4_pspace_cachep;
|
|
|
+static struct kmem_cache *ext4_ac_cachep;
|
|
|
+static struct kmem_cache *ext4_free_ext_cachep;
|
|
|
+static void ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap,
|
|
|
+ ext4_group_t group);
|
|
|
+static int ext4_mb_init_per_dev_proc(struct super_block *sb);
|
|
|
+static int ext4_mb_destroy_per_dev_proc(struct super_block *sb);
|
|
|
+static void release_blocks_on_commit(journal_t *journal, transaction_t *txn);
|
|
|
+
|
|
|
+
|
|
|
|
|
|
static inline void *mb_correct_addr_and_bit(int *bit, void *addr)
|
|
|
{
|
|
@@ -716,7 +726,7 @@ static void ext4_mb_generate_buddy(struct super_block *sb,
|
|
|
* stored in the inode as
|
|
|
*
|
|
|
* { page }
|
|
|
- * [ group 0 buddy][ group 0 bitmap] [group 1][ group 1]...
|
|
|
+ * [ group 0 bitmap][ group 0 buddy] [group 1][ group 1]...
|
|
|
*
|
|
|
*
|
|
|
* one block each for bitmap and buddy information.
|
|
@@ -1322,8 +1332,13 @@ static void ext4_mb_use_best_found(struct ext4_allocation_context *ac,
|
|
|
ac->ac_tail = ret & 0xffff;
|
|
|
ac->ac_buddy = ret >> 16;
|
|
|
|
|
|
- /* XXXXXXX: SUCH A HORRIBLE **CK */
|
|
|
- /*FIXME!! Why ? */
|
|
|
+ /*
|
|
|
+ * take the page reference. We want the page to be pinned
|
|
|
+ * so that we don't get a ext4_mb_init_cache_call for this
|
|
|
+ * group until we update the bitmap. That would mean we
|
|
|
+ * double allocate blocks. The reference is dropped
|
|
|
+ * in ext4_mb_release_context
|
|
|
+ */
|
|
|
ac->ac_bitmap_page = e4b->bd_bitmap_page;
|
|
|
get_page(ac->ac_bitmap_page);
|
|
|
ac->ac_buddy_page = e4b->bd_buddy_page;
|