diff options
author | Theodore Ts'o <tytso@mit.edu> | 2010-05-16 20:00:00 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2010-05-16 20:00:00 -0400 |
commit | 2ed886852adfcb070bf350e66a0da0d98b2f3ab5 (patch) | |
tree | bcec0a1004f413b70087e2c43097892f87f21cc3 /fs/ext4/dir.c | |
parent | e35fd6609b2fee54484d520deccb8f18bf7d38f3 (diff) |
ext4: Convert callers of ext4_get_blocks() to use ext4_map_blocks()
This saves a huge amount of stack space by avoiding unnecesary struct
buffer_head's from being allocated on the stack.
In addition, to make the code easier to understand, collapse and
refactor ext4_get_block(), ext4_get_block_write(),
noalloc_get_block_write(), into a single function.
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/dir.c')
-rw-r--r-- | fs/ext4/dir.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c index 86cb6d86a048..e3f2700b8be7 100644 --- a/fs/ext4/dir.c +++ b/fs/ext4/dir.c | |||
@@ -128,14 +128,14 @@ static int ext4_readdir(struct file *filp, | |||
128 | offset = filp->f_pos & (sb->s_blocksize - 1); | 128 | offset = filp->f_pos & (sb->s_blocksize - 1); |
129 | 129 | ||
130 | while (!error && !stored && filp->f_pos < inode->i_size) { | 130 | while (!error && !stored && filp->f_pos < inode->i_size) { |
131 | ext4_lblk_t blk = filp->f_pos >> EXT4_BLOCK_SIZE_BITS(sb); | 131 | struct ext4_map_blocks map; |
132 | struct buffer_head map_bh; | ||
133 | struct buffer_head *bh = NULL; | 132 | struct buffer_head *bh = NULL; |
134 | 133 | ||
135 | map_bh.b_state = 0; | 134 | map.m_lblk = filp->f_pos >> EXT4_BLOCK_SIZE_BITS(sb); |
136 | err = ext4_get_blocks(NULL, inode, blk, 1, &map_bh, 0); | 135 | map.m_len = 1; |
136 | err = ext4_map_blocks(NULL, inode, &map, 0); | ||
137 | if (err > 0) { | 137 | if (err > 0) { |
138 | pgoff_t index = map_bh.b_blocknr >> | 138 | pgoff_t index = map.m_pblk >> |
139 | (PAGE_CACHE_SHIFT - inode->i_blkbits); | 139 | (PAGE_CACHE_SHIFT - inode->i_blkbits); |
140 | if (!ra_has_index(&filp->f_ra, index)) | 140 | if (!ra_has_index(&filp->f_ra, index)) |
141 | page_cache_sync_readahead( | 141 | page_cache_sync_readahead( |
@@ -143,7 +143,7 @@ static int ext4_readdir(struct file *filp, | |||
143 | &filp->f_ra, filp, | 143 | &filp->f_ra, filp, |
144 | index, 1); | 144 | index, 1); |
145 | filp->f_ra.prev_pos = (loff_t)index << PAGE_CACHE_SHIFT; | 145 | filp->f_ra.prev_pos = (loff_t)index << PAGE_CACHE_SHIFT; |
146 | bh = ext4_bread(NULL, inode, blk, 0, &err); | 146 | bh = ext4_bread(NULL, inode, map.m_lblk, 0, &err); |
147 | } | 147 | } |
148 | 148 | ||
149 | /* | 149 | /* |