diff options
author | Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp> | 2009-11-13 10:09:47 -0500 |
---|---|---|
committer | Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp> | 2009-11-19 20:05:49 -0500 |
commit | b34a65069caa56b691ebab5ae0b8e54d16406d16 (patch) | |
tree | f2eacf08be4471cd1ca781c9d4c56bbb81448531 /fs | |
parent | ef7d4757a5b7b07a3a0d30d3ba6b587e574b28b9 (diff) |
nilfs2: avoid readahead on metadata file for create mode
This turns off readhead action of metadata file if nilfs_mdt_get_block
function was called with a create flag.
Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/nilfs2/mdt.c | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/fs/nilfs2/mdt.c b/fs/nilfs2/mdt.c index 3028e8f31be2..948b1f8bc505 100644 --- a/fs/nilfs2/mdt.c +++ b/fs/nilfs2/mdt.c | |||
@@ -186,7 +186,7 @@ nilfs_mdt_submit_block(struct inode *inode, unsigned long blkoff, | |||
186 | } | 186 | } |
187 | 187 | ||
188 | static int nilfs_mdt_read_block(struct inode *inode, unsigned long block, | 188 | static int nilfs_mdt_read_block(struct inode *inode, unsigned long block, |
189 | struct buffer_head **out_bh) | 189 | int readahead, struct buffer_head **out_bh) |
190 | { | 190 | { |
191 | struct buffer_head *first_bh, *bh; | 191 | struct buffer_head *first_bh, *bh; |
192 | unsigned long blkoff; | 192 | unsigned long blkoff; |
@@ -200,16 +200,18 @@ static int nilfs_mdt_read_block(struct inode *inode, unsigned long block, | |||
200 | if (unlikely(err)) | 200 | if (unlikely(err)) |
201 | goto failed; | 201 | goto failed; |
202 | 202 | ||
203 | blkoff = block + 1; | 203 | if (readahead) { |
204 | for (i = 0; i < nr_ra_blocks; i++, blkoff++) { | 204 | blkoff = block + 1; |
205 | err = nilfs_mdt_submit_block(inode, blkoff, READA, &bh); | 205 | for (i = 0; i < nr_ra_blocks; i++, blkoff++) { |
206 | if (likely(!err || err == -EEXIST)) | 206 | err = nilfs_mdt_submit_block(inode, blkoff, READA, &bh); |
207 | brelse(bh); | 207 | if (likely(!err || err == -EEXIST)) |
208 | else if (err != -EBUSY) | 208 | brelse(bh); |
209 | break; /* abort readahead if bmap lookup failed */ | 209 | else if (err != -EBUSY) |
210 | 210 | break; | |
211 | if (!buffer_locked(first_bh)) | 211 | /* abort readahead if bmap lookup failed */ |
212 | goto out_no_wait; | 212 | if (!buffer_locked(first_bh)) |
213 | goto out_no_wait; | ||
214 | } | ||
213 | } | 215 | } |
214 | 216 | ||
215 | wait_on_buffer(first_bh); | 217 | wait_on_buffer(first_bh); |
@@ -263,7 +265,7 @@ int nilfs_mdt_get_block(struct inode *inode, unsigned long blkoff, int create, | |||
263 | 265 | ||
264 | /* Should be rewritten with merging nilfs_mdt_read_block() */ | 266 | /* Should be rewritten with merging nilfs_mdt_read_block() */ |
265 | retry: | 267 | retry: |
266 | ret = nilfs_mdt_read_block(inode, blkoff, out_bh); | 268 | ret = nilfs_mdt_read_block(inode, blkoff, !create, out_bh); |
267 | if (!create || ret != -ENOENT) | 269 | if (!create || ret != -ENOENT) |
268 | return ret; | 270 | return ret; |
269 | 271 | ||
@@ -371,7 +373,7 @@ int nilfs_mdt_mark_block_dirty(struct inode *inode, unsigned long block) | |||
371 | struct buffer_head *bh; | 373 | struct buffer_head *bh; |
372 | int err; | 374 | int err; |
373 | 375 | ||
374 | err = nilfs_mdt_read_block(inode, block, &bh); | 376 | err = nilfs_mdt_read_block(inode, block, 0, &bh); |
375 | if (unlikely(err)) | 377 | if (unlikely(err)) |
376 | return err; | 378 | return err; |
377 | nilfs_mark_buffer_dirty(bh); | 379 | nilfs_mark_buffer_dirty(bh); |