diff options
author | Curt Wohlgemuth <curtw@google.com> | 2010-05-16 15:00:00 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2010-05-16 15:00:00 -0400 |
commit | 8a57d9d61a6e361c7bb159dda797672c1df1a691 (patch) | |
tree | 39a01022ed2294f0acc94b45554c9a292db671dc /fs/ext4/ext4.h | |
parent | 6d19c42b7cf81c39632b6d4dbc514e8449bcd346 (diff) |
ext4: check for a good block group before loading buddy pages
This adds a new field in ext4_group_info to cache the largest available
block range in a block group; and don't load the buddy pages until *after*
we've done a sanity check on the block group.
With large allocation requests (e.g., fallocate(), 8MiB) and relatively full
partitions, it's easy to have no block groups with a block extent large
enough to satisfy the input request length. This currently causes the loop
during cr == 0 in ext4_mb_regular_allocator() to load the buddy bitmap pages
for EVERY block group. That can be a lot of pages. The patch below allows
us to call ext4_mb_good_group() BEFORE we load the buddy pages (although we
have check again after we lock the block group).
Addresses-Google-Bug: #2578108
Addresses-Google-Bug: #2704453
Signed-off-by: Curt Wohlgemuth <curtw@google.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/ext4.h')
-rw-r--r-- | fs/ext4/ext4.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index bf938cf7c5f0..d266003cac3e 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
@@ -1678,6 +1678,7 @@ struct ext4_group_info { | |||
1678 | ext4_grpblk_t bb_first_free; /* first free block */ | 1678 | ext4_grpblk_t bb_first_free; /* first free block */ |
1679 | ext4_grpblk_t bb_free; /* total free blocks */ | 1679 | ext4_grpblk_t bb_free; /* total free blocks */ |
1680 | ext4_grpblk_t bb_fragments; /* nr of freespace fragments */ | 1680 | ext4_grpblk_t bb_fragments; /* nr of freespace fragments */ |
1681 | ext4_grpblk_t bb_largest_free_order;/* order of largest frag in BG */ | ||
1681 | struct list_head bb_prealloc_list; | 1682 | struct list_head bb_prealloc_list; |
1682 | #ifdef DOUBLE_CHECK | 1683 | #ifdef DOUBLE_CHECK |
1683 | void *bb_bitmap; | 1684 | void *bb_bitmap; |