diff options
author | Joel Becker <joel.becker@oracle.com> | 2008-10-09 20:20:34 -0400 |
---|---|---|
committer | Mark Fasheh <mfasheh@suse.com> | 2008-10-14 14:58:22 -0400 |
commit | d4a8c93c8248534bdedb07f83c9aebd6f7d1d579 (patch) | |
tree | f978a7b36d515c29657f271ca5b70281c911a82f /fs | |
parent | 5e0b3dec0107540244ba343f983ef4f972db20de (diff) |
ocfs2: Make cached block reads the common case.
ocfs2_read_blocks() currently requires the CACHED flag for cached I/O.
However, that's the common case. Let's flip it around and provide an
IGNORE_CACHE flag for the special users. This has the added benefit of
cleaning up the code some (ignore_cache takes on its special meaning
earlier in the loop).
Signed-off-by: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Mark Fasheh <mfasheh@suse.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ocfs2/buffer_head_io.c | 19 | ||||
-rw-r--r-- | fs/ocfs2/buffer_head_io.h | 4 | ||||
-rw-r--r-- | fs/ocfs2/dir.c | 2 | ||||
-rw-r--r-- | fs/ocfs2/inode.c | 3 | ||||
-rw-r--r-- | fs/ocfs2/journal.c | 3 | ||||
-rw-r--r-- | fs/ocfs2/localalloc.c | 4 | ||||
-rw-r--r-- | fs/ocfs2/slot_map.c | 6 |
7 files changed, 24 insertions, 17 deletions
diff --git a/fs/ocfs2/buffer_head_io.c b/fs/ocfs2/buffer_head_io.c index 718dbe5607ca..7e947c672469 100644 --- a/fs/ocfs2/buffer_head_io.c +++ b/fs/ocfs2/buffer_head_io.c | |||
@@ -181,7 +181,8 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr, | |||
181 | inode, (unsigned long long)block, nr, flags); | 181 | inode, (unsigned long long)block, nr, flags); |
182 | 182 | ||
183 | BUG_ON(!inode); | 183 | BUG_ON(!inode); |
184 | BUG_ON((flags & OCFS2_BH_READAHEAD) && !(flags & OCFS2_BH_CACHED)); | 184 | BUG_ON((flags & OCFS2_BH_READAHEAD) && |
185 | (flags & OCFS2_BH_IGNORE_CACHE)); | ||
185 | 186 | ||
186 | if (bhs == NULL) { | 187 | if (bhs == NULL) { |
187 | status = -EINVAL; | 188 | status = -EINVAL; |
@@ -214,7 +215,7 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr, | |||
214 | } | 215 | } |
215 | } | 216 | } |
216 | bh = bhs[i]; | 217 | bh = bhs[i]; |
217 | ignore_cache = 0; | 218 | ignore_cache = (flags & OCFS2_BH_IGNORE_CACHE); |
218 | 219 | ||
219 | /* There are three read-ahead cases here which we need to | 220 | /* There are three read-ahead cases here which we need to |
220 | * be concerned with. All three assume a buffer has | 221 | * be concerned with. All three assume a buffer has |
@@ -240,26 +241,27 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr, | |||
240 | * before our is-it-in-flight check. | 241 | * before our is-it-in-flight check. |
241 | */ | 242 | */ |
242 | 243 | ||
243 | if (flags & OCFS2_BH_CACHED && | 244 | if (!ignore_cache && !ocfs2_buffer_uptodate(inode, bh)) { |
244 | !ocfs2_buffer_uptodate(inode, bh)) { | ||
245 | mlog(ML_UPTODATE, | 245 | mlog(ML_UPTODATE, |
246 | "bh (%llu), inode %llu not uptodate\n", | 246 | "bh (%llu), inode %llu not uptodate\n", |
247 | (unsigned long long)bh->b_blocknr, | 247 | (unsigned long long)bh->b_blocknr, |
248 | (unsigned long long)OCFS2_I(inode)->ip_blkno); | 248 | (unsigned long long)OCFS2_I(inode)->ip_blkno); |
249 | /* We're using ignore_cache here to say | ||
250 | * "go to disk" */ | ||
249 | ignore_cache = 1; | 251 | ignore_cache = 1; |
250 | } | 252 | } |
251 | 253 | ||
252 | /* XXX: Can we ever get this and *not* have the cached | 254 | /* XXX: Can we ever get this and *not* have the cached |
253 | * flag set? */ | 255 | * flag set? */ |
254 | if (buffer_jbd(bh)) { | 256 | if (buffer_jbd(bh)) { |
255 | if (!(flags & OCFS2_BH_CACHED) || ignore_cache) | 257 | if (ignore_cache) |
256 | mlog(ML_BH_IO, "trying to sync read a jbd " | 258 | mlog(ML_BH_IO, "trying to sync read a jbd " |
257 | "managed bh (blocknr = %llu)\n", | 259 | "managed bh (blocknr = %llu)\n", |
258 | (unsigned long long)bh->b_blocknr); | 260 | (unsigned long long)bh->b_blocknr); |
259 | continue; | 261 | continue; |
260 | } | 262 | } |
261 | 263 | ||
262 | if (!(flags & OCFS2_BH_CACHED) || ignore_cache) { | 264 | if (ignore_cache) { |
263 | if (buffer_dirty(bh)) { | 265 | if (buffer_dirty(bh)) { |
264 | /* This should probably be a BUG, or | 266 | /* This should probably be a BUG, or |
265 | * at least return an error. */ | 267 | * at least return an error. */ |
@@ -294,7 +296,7 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr, | |||
294 | * previously read-ahead buffer may have | 296 | * previously read-ahead buffer may have |
295 | * completed I/O while we were waiting for the | 297 | * completed I/O while we were waiting for the |
296 | * buffer lock. */ | 298 | * buffer lock. */ |
297 | if ((flags & OCFS2_BH_CACHED) | 299 | if (!(flags & OCFS2_BH_IGNORE_CACHE) |
298 | && !(flags & OCFS2_BH_READAHEAD) | 300 | && !(flags & OCFS2_BH_READAHEAD) |
299 | && ocfs2_buffer_uptodate(inode, bh)) { | 301 | && ocfs2_buffer_uptodate(inode, bh)) { |
300 | unlock_buffer(bh); | 302 | unlock_buffer(bh); |
@@ -344,7 +346,8 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr, | |||
344 | 346 | ||
345 | mlog(ML_BH_IO, "block=(%llu), nr=(%d), cached=%s, flags=0x%x\n", | 347 | mlog(ML_BH_IO, "block=(%llu), nr=(%d), cached=%s, flags=0x%x\n", |
346 | (unsigned long long)block, nr, | 348 | (unsigned long long)block, nr, |
347 | (!(flags & OCFS2_BH_CACHED) || ignore_cache) ? "no" : "yes", flags); | 349 | ((flags & OCFS2_BH_IGNORE_CACHE) || ignore_cache) ? "no" : "yes", |
350 | flags); | ||
348 | 351 | ||
349 | bail: | 352 | bail: |
350 | 353 | ||
diff --git a/fs/ocfs2/buffer_head_io.h b/fs/ocfs2/buffer_head_io.h index a2ef9e5f8bfe..75e1dcb1ade7 100644 --- a/fs/ocfs2/buffer_head_io.h +++ b/fs/ocfs2/buffer_head_io.h | |||
@@ -49,7 +49,7 @@ int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block, | |||
49 | int ocfs2_write_super_or_backup(struct ocfs2_super *osb, | 49 | int ocfs2_write_super_or_backup(struct ocfs2_super *osb, |
50 | struct buffer_head *bh); | 50 | struct buffer_head *bh); |
51 | 51 | ||
52 | #define OCFS2_BH_CACHED 1 | 52 | #define OCFS2_BH_IGNORE_CACHE 1 |
53 | #define OCFS2_BH_READAHEAD 8 | 53 | #define OCFS2_BH_READAHEAD 8 |
54 | 54 | ||
55 | static inline int ocfs2_read_block(struct inode *inode, u64 off, | 55 | static inline int ocfs2_read_block(struct inode *inode, u64 off, |
@@ -63,7 +63,7 @@ static inline int ocfs2_read_block(struct inode *inode, u64 off, | |||
63 | goto bail; | 63 | goto bail; |
64 | } | 64 | } |
65 | 65 | ||
66 | status = ocfs2_read_blocks(inode, off, 1, bh, OCFS2_BH_CACHED); | 66 | status = ocfs2_read_blocks(inode, off, 1, bh, 0); |
67 | 67 | ||
68 | bail: | 68 | bail: |
69 | return status; | 69 | return status; |
diff --git a/fs/ocfs2/dir.c b/fs/ocfs2/dir.c index 60be3ba1f5dc..026e6eb85187 100644 --- a/fs/ocfs2/dir.c +++ b/fs/ocfs2/dir.c | |||
@@ -88,7 +88,7 @@ static struct buffer_head *ocfs2_bread(struct inode *inode, | |||
88 | struct buffer_head *bh = NULL; | 88 | struct buffer_head *bh = NULL; |
89 | int tmperr; | 89 | int tmperr; |
90 | u64 p_blkno; | 90 | u64 p_blkno; |
91 | int readflags = OCFS2_BH_CACHED; | 91 | int readflags = 0; |
92 | 92 | ||
93 | if (reada) | 93 | if (reada) |
94 | readflags |= OCFS2_BH_READAHEAD; | 94 | readflags |= OCFS2_BH_READAHEAD; |
diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c index 8381c26b21a8..4903688f72a9 100644 --- a/fs/ocfs2/inode.c +++ b/fs/ocfs2/inode.c | |||
@@ -461,7 +461,8 @@ static int ocfs2_read_locked_inode(struct inode *inode, | |||
461 | } | 461 | } |
462 | 462 | ||
463 | if (can_lock) | 463 | if (can_lock) |
464 | status = ocfs2_read_blocks(inode, args->fi_blkno, 1, &bh, 0); | 464 | status = ocfs2_read_blocks(inode, args->fi_blkno, 1, &bh, |
465 | OCFS2_BH_IGNORE_CACHE); | ||
465 | else | 466 | else |
466 | status = ocfs2_read_blocks_sync(osb, args->fi_blkno, 1, &bh); | 467 | status = ocfs2_read_blocks_sync(osb, args->fi_blkno, 1, &bh); |
467 | if (status < 0) { | 468 | if (status < 0) { |
diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c index d161fe5e3bde..81e40677eecb 100644 --- a/fs/ocfs2/journal.c +++ b/fs/ocfs2/journal.c | |||
@@ -1134,7 +1134,8 @@ static int ocfs2_read_journal_inode(struct ocfs2_super *osb, | |||
1134 | } | 1134 | } |
1135 | SET_INODE_JOURNAL(inode); | 1135 | SET_INODE_JOURNAL(inode); |
1136 | 1136 | ||
1137 | status = ocfs2_read_blocks(inode, OCFS2_I(inode)->ip_blkno, 1, bh, 0); | 1137 | status = ocfs2_read_blocks(inode, OCFS2_I(inode)->ip_blkno, 1, bh, |
1138 | OCFS2_BH_IGNORE_CACHE); | ||
1138 | if (status < 0) { | 1139 | if (status < 0) { |
1139 | mlog_errno(status); | 1140 | mlog_errno(status); |
1140 | goto bail; | 1141 | goto bail; |
diff --git a/fs/ocfs2/localalloc.c b/fs/ocfs2/localalloc.c index 3ea740d15feb..687b28713c32 100644 --- a/fs/ocfs2/localalloc.c +++ b/fs/ocfs2/localalloc.c | |||
@@ -249,7 +249,7 @@ int ocfs2_load_local_alloc(struct ocfs2_super *osb) | |||
249 | } | 249 | } |
250 | 250 | ||
251 | status = ocfs2_read_blocks(inode, OCFS2_I(inode)->ip_blkno, 1, | 251 | status = ocfs2_read_blocks(inode, OCFS2_I(inode)->ip_blkno, 1, |
252 | &alloc_bh, 0); | 252 | &alloc_bh, OCFS2_BH_IGNORE_CACHE); |
253 | if (status < 0) { | 253 | if (status < 0) { |
254 | mlog_errno(status); | 254 | mlog_errno(status); |
255 | goto bail; | 255 | goto bail; |
@@ -460,7 +460,7 @@ int ocfs2_begin_local_alloc_recovery(struct ocfs2_super *osb, | |||
460 | mutex_lock(&inode->i_mutex); | 460 | mutex_lock(&inode->i_mutex); |
461 | 461 | ||
462 | status = ocfs2_read_blocks(inode, OCFS2_I(inode)->ip_blkno, 1, | 462 | status = ocfs2_read_blocks(inode, OCFS2_I(inode)->ip_blkno, 1, |
463 | &alloc_bh, 0); | 463 | &alloc_bh, OCFS2_BH_IGNORE_CACHE); |
464 | if (status < 0) { | 464 | if (status < 0) { |
465 | mlog_errno(status); | 465 | mlog_errno(status); |
466 | goto bail; | 466 | goto bail; |
diff --git a/fs/ocfs2/slot_map.c b/fs/ocfs2/slot_map.c index 357d3fe18c3f..bdda2d8f8508 100644 --- a/fs/ocfs2/slot_map.c +++ b/fs/ocfs2/slot_map.c | |||
@@ -150,7 +150,8 @@ int ocfs2_refresh_slot_info(struct ocfs2_super *osb) | |||
150 | * be !NULL. Thus, ocfs2_read_blocks() will ignore blocknr. If | 150 | * be !NULL. Thus, ocfs2_read_blocks() will ignore blocknr. If |
151 | * this is not true, the read of -1 (UINT64_MAX) will fail. | 151 | * this is not true, the read of -1 (UINT64_MAX) will fail. |
152 | */ | 152 | */ |
153 | ret = ocfs2_read_blocks(si->si_inode, -1, si->si_blocks, si->si_bh, 0); | 153 | ret = ocfs2_read_blocks(si->si_inode, -1, si->si_blocks, si->si_bh, |
154 | OCFS2_BH_IGNORE_CACHE); | ||
154 | if (ret == 0) { | 155 | if (ret == 0) { |
155 | spin_lock(&osb->osb_lock); | 156 | spin_lock(&osb->osb_lock); |
156 | ocfs2_update_slot_info(si); | 157 | ocfs2_update_slot_info(si); |
@@ -403,7 +404,8 @@ static int ocfs2_map_slot_buffers(struct ocfs2_super *osb, | |||
403 | (unsigned long long)blkno); | 404 | (unsigned long long)blkno); |
404 | 405 | ||
405 | bh = NULL; /* Acquire a fresh bh */ | 406 | bh = NULL; /* Acquire a fresh bh */ |
406 | status = ocfs2_read_blocks(si->si_inode, blkno, 1, &bh, 0); | 407 | status = ocfs2_read_blocks(si->si_inode, blkno, 1, &bh, |
408 | OCFS2_BH_IGNORE_CACHE); | ||
407 | if (status < 0) { | 409 | if (status < 0) { |
408 | mlog_errno(status); | 410 | mlog_errno(status); |
409 | goto bail; | 411 | goto bail; |