aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ext4')
-rw-r--r--fs/ext4/ext4.h2
-rw-r--r--fs/ext4/mballoc.c23
2 files changed, 12 insertions, 13 deletions
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index e267727cc62d..70aa951ecb3c 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -88,6 +88,8 @@ typedef unsigned int ext4_group_t;
88#define EXT4_MB_HINT_TRY_GOAL 0x0200 88#define EXT4_MB_HINT_TRY_GOAL 0x0200
89/* blocks already pre-reserved by delayed allocation */ 89/* blocks already pre-reserved by delayed allocation */
90#define EXT4_MB_DELALLOC_RESERVED 0x0400 90#define EXT4_MB_DELALLOC_RESERVED 0x0400
91/* We are doing stream allocation */
92#define EXT4_MB_STREAM_ALLOC 0x0800
91 93
92 94
93struct ext4_allocation_request { 95struct ext4_allocation_request {
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
index 3434c603432d..90a30ce822fc 100644
--- a/fs/ext4/mballoc.c
+++ b/fs/ext4/mballoc.c
@@ -1361,7 +1361,7 @@ static void ext4_mb_use_best_found(struct ext4_allocation_context *ac,
1361 ac->alloc_semp = e4b->alloc_semp; 1361 ac->alloc_semp = e4b->alloc_semp;
1362 e4b->alloc_semp = NULL; 1362 e4b->alloc_semp = NULL;
1363 /* store last allocated for subsequent stream allocation */ 1363 /* store last allocated for subsequent stream allocation */
1364 if ((ac->ac_flags & EXT4_MB_HINT_DATA)) { 1364 if (ac->ac_flags & EXT4_MB_STREAM_ALLOC) {
1365 spin_lock(&sbi->s_md_lock); 1365 spin_lock(&sbi->s_md_lock);
1366 sbi->s_mb_last_group = ac->ac_f_ex.fe_group; 1366 sbi->s_mb_last_group = ac->ac_f_ex.fe_group;
1367 sbi->s_mb_last_start = ac->ac_f_ex.fe_start; 1367 sbi->s_mb_last_start = ac->ac_f_ex.fe_start;
@@ -1939,7 +1939,6 @@ ext4_mb_regular_allocator(struct ext4_allocation_context *ac)
1939 struct ext4_sb_info *sbi; 1939 struct ext4_sb_info *sbi;
1940 struct super_block *sb; 1940 struct super_block *sb;
1941 struct ext4_buddy e4b; 1941 struct ext4_buddy e4b;
1942 loff_t size, isize;
1943 1942
1944 sb = ac->ac_sb; 1943 sb = ac->ac_sb;
1945 sbi = EXT4_SB(sb); 1944 sbi = EXT4_SB(sb);
@@ -1975,20 +1974,16 @@ ext4_mb_regular_allocator(struct ext4_allocation_context *ac)
1975 } 1974 }
1976 1975
1977 bsbits = ac->ac_sb->s_blocksize_bits; 1976 bsbits = ac->ac_sb->s_blocksize_bits;
1978 /* if stream allocation is enabled, use global goal */
1979 size = ac->ac_o_ex.fe_logical + ac->ac_o_ex.fe_len;
1980 isize = i_size_read(ac->ac_inode) >> bsbits;
1981 if (size < isize)
1982 size = isize;
1983 1977
1984 if (size < sbi->s_mb_stream_request && 1978 /* if stream allocation is enabled, use global goal */
1985 (ac->ac_flags & EXT4_MB_HINT_DATA)) { 1979 if (ac->ac_flags & EXT4_MB_STREAM_ALLOC) {
1986 /* TBD: may be hot point */ 1980 /* TBD: may be hot point */
1987 spin_lock(&sbi->s_md_lock); 1981 spin_lock(&sbi->s_md_lock);
1988 ac->ac_g_ex.fe_group = sbi->s_mb_last_group; 1982 ac->ac_g_ex.fe_group = sbi->s_mb_last_group;
1989 ac->ac_g_ex.fe_start = sbi->s_mb_last_start; 1983 ac->ac_g_ex.fe_start = sbi->s_mb_last_start;
1990 spin_unlock(&sbi->s_md_lock); 1984 spin_unlock(&sbi->s_md_lock);
1991 } 1985 }
1986
1992 /* Let's just scan groups to find more-less suitable blocks */ 1987 /* Let's just scan groups to find more-less suitable blocks */
1993 cr = ac->ac_2order ? 0 : 1; 1988 cr = ac->ac_2order ? 0 : 1;
1994 /* 1989 /*
@@ -4192,16 +4187,18 @@ static void ext4_mb_group_or_file(struct ext4_allocation_context *ac)
4192 if (!(ac->ac_flags & EXT4_MB_HINT_DATA)) 4187 if (!(ac->ac_flags & EXT4_MB_HINT_DATA))
4193 return; 4188 return;
4194 4189
4190 if (unlikely(ac->ac_flags & EXT4_MB_HINT_GOAL_ONLY))
4191 return;
4192
4195 size = ac->ac_o_ex.fe_logical + ac->ac_o_ex.fe_len; 4193 size = ac->ac_o_ex.fe_logical + ac->ac_o_ex.fe_len;
4196 isize = i_size_read(ac->ac_inode) >> bsbits; 4194 isize = i_size_read(ac->ac_inode) >> bsbits;
4197 size = max(size, isize); 4195 size = max(size, isize);
4198 4196
4199 /* don't use group allocation for large files */ 4197 /* don't use group allocation for large files */
4200 if (size >= sbi->s_mb_stream_request) 4198 if (size >= sbi->s_mb_stream_request) {
4201 return; 4199 ac->ac_flags |= EXT4_MB_STREAM_ALLOC;
4202
4203 if (unlikely(ac->ac_flags & EXT4_MB_HINT_GOAL_ONLY))
4204 return; 4200 return;
4201 }
4205 4202
4206 BUG_ON(ac->ac_lg != NULL); 4203 BUG_ON(ac->ac_lg != NULL);
4207 /* 4204 /*