Commit d4a8c93c authored by Joel Becker's avatar Joel Becker Committed by Mark Fasheh

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: default avatarJoel Becker <joel.becker@oracle.com>
Signed-off-by: default avatarMark Fasheh <mfasheh@suse.com>
parent 5e0b3dec
...@@ -181,7 +181,8 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr, ...@@ -181,7 +181,8 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr,
inode, (unsigned long long)block, nr, flags); inode, (unsigned long long)block, nr, flags);
BUG_ON(!inode); BUG_ON(!inode);
BUG_ON((flags & OCFS2_BH_READAHEAD) && !(flags & OCFS2_BH_CACHED)); BUG_ON((flags & OCFS2_BH_READAHEAD) &&
(flags & OCFS2_BH_IGNORE_CACHE));
if (bhs == NULL) { if (bhs == NULL) {
status = -EINVAL; status = -EINVAL;
...@@ -214,7 +215,7 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr, ...@@ -214,7 +215,7 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr,
} }
} }
bh = bhs[i]; bh = bhs[i];
ignore_cache = 0; ignore_cache = (flags & OCFS2_BH_IGNORE_CACHE);
/* There are three read-ahead cases here which we need to /* There are three read-ahead cases here which we need to
* be concerned with. All three assume a buffer has * 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,26 +241,27 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr,
* before our is-it-in-flight check. * before our is-it-in-flight check.
*/ */
if (flags & OCFS2_BH_CACHED && if (!ignore_cache && !ocfs2_buffer_uptodate(inode, bh)) {
!ocfs2_buffer_uptodate(inode, bh)) {
mlog(ML_UPTODATE, mlog(ML_UPTODATE,
"bh (%llu), inode %llu not uptodate\n", "bh (%llu), inode %llu not uptodate\n",
(unsigned long long)bh->b_blocknr, (unsigned long long)bh->b_blocknr,
(unsigned long long)OCFS2_I(inode)->ip_blkno); (unsigned long long)OCFS2_I(inode)->ip_blkno);
/* We're using ignore_cache here to say
* "go to disk" */
ignore_cache = 1; ignore_cache = 1;
} }
/* XXX: Can we ever get this and *not* have the cached /* XXX: Can we ever get this and *not* have the cached
* flag set? */ * flag set? */
if (buffer_jbd(bh)) { if (buffer_jbd(bh)) {
if (!(flags & OCFS2_BH_CACHED) || ignore_cache) if (ignore_cache)
mlog(ML_BH_IO, "trying to sync read a jbd " mlog(ML_BH_IO, "trying to sync read a jbd "
"managed bh (blocknr = %llu)\n", "managed bh (blocknr = %llu)\n",
(unsigned long long)bh->b_blocknr); (unsigned long long)bh->b_blocknr);
continue; continue;
} }
if (!(flags & OCFS2_BH_CACHED) || ignore_cache) { if (ignore_cache) {
if (buffer_dirty(bh)) { if (buffer_dirty(bh)) {
/* This should probably be a BUG, or /* This should probably be a BUG, or
* at least return an error. */ * at least return an error. */
...@@ -294,7 +296,7 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr, ...@@ -294,7 +296,7 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr,
* previously read-ahead buffer may have * previously read-ahead buffer may have
* completed I/O while we were waiting for the * completed I/O while we were waiting for the
* buffer lock. */ * buffer lock. */
if ((flags & OCFS2_BH_CACHED) if (!(flags & OCFS2_BH_IGNORE_CACHE)
&& !(flags & OCFS2_BH_READAHEAD) && !(flags & OCFS2_BH_READAHEAD)
&& ocfs2_buffer_uptodate(inode, bh)) { && ocfs2_buffer_uptodate(inode, bh)) {
unlock_buffer(bh); unlock_buffer(bh);
...@@ -344,7 +346,8 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr, ...@@ -344,7 +346,8 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr,
mlog(ML_BH_IO, "block=(%llu), nr=(%d), cached=%s, flags=0x%x\n", mlog(ML_BH_IO, "block=(%llu), nr=(%d), cached=%s, flags=0x%x\n",
(unsigned long long)block, nr, (unsigned long long)block, nr,
(!(flags & OCFS2_BH_CACHED) || ignore_cache) ? "no" : "yes", flags); ((flags & OCFS2_BH_IGNORE_CACHE) || ignore_cache) ? "no" : "yes",
flags);
bail: bail:
......
...@@ -49,7 +49,7 @@ int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block, ...@@ -49,7 +49,7 @@ int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block,
int ocfs2_write_super_or_backup(struct ocfs2_super *osb, int ocfs2_write_super_or_backup(struct ocfs2_super *osb,
struct buffer_head *bh); struct buffer_head *bh);
#define OCFS2_BH_CACHED 1 #define OCFS2_BH_IGNORE_CACHE 1
#define OCFS2_BH_READAHEAD 8 #define OCFS2_BH_READAHEAD 8
static inline int ocfs2_read_block(struct inode *inode, u64 off, 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,7 +63,7 @@ static inline int ocfs2_read_block(struct inode *inode, u64 off,
goto bail; goto bail;
} }
status = ocfs2_read_blocks(inode, off, 1, bh, OCFS2_BH_CACHED); status = ocfs2_read_blocks(inode, off, 1, bh, 0);
bail: bail:
return status; return status;
......
...@@ -88,7 +88,7 @@ static struct buffer_head *ocfs2_bread(struct inode *inode, ...@@ -88,7 +88,7 @@ static struct buffer_head *ocfs2_bread(struct inode *inode,
struct buffer_head *bh = NULL; struct buffer_head *bh = NULL;
int tmperr; int tmperr;
u64 p_blkno; u64 p_blkno;
int readflags = OCFS2_BH_CACHED; int readflags = 0;
if (reada) if (reada)
readflags |= OCFS2_BH_READAHEAD; readflags |= OCFS2_BH_READAHEAD;
......
...@@ -461,7 +461,8 @@ static int ocfs2_read_locked_inode(struct inode *inode, ...@@ -461,7 +461,8 @@ static int ocfs2_read_locked_inode(struct inode *inode,
} }
if (can_lock) if (can_lock)
status = ocfs2_read_blocks(inode, args->fi_blkno, 1, &bh, 0); status = ocfs2_read_blocks(inode, args->fi_blkno, 1, &bh,
OCFS2_BH_IGNORE_CACHE);
else else
status = ocfs2_read_blocks_sync(osb, args->fi_blkno, 1, &bh); status = ocfs2_read_blocks_sync(osb, args->fi_blkno, 1, &bh);
if (status < 0) { if (status < 0) {
......
...@@ -1134,7 +1134,8 @@ static int ocfs2_read_journal_inode(struct ocfs2_super *osb, ...@@ -1134,7 +1134,8 @@ static int ocfs2_read_journal_inode(struct ocfs2_super *osb,
} }
SET_INODE_JOURNAL(inode); SET_INODE_JOURNAL(inode);
status = ocfs2_read_blocks(inode, OCFS2_I(inode)->ip_blkno, 1, bh, 0); status = ocfs2_read_blocks(inode, OCFS2_I(inode)->ip_blkno, 1, bh,
OCFS2_BH_IGNORE_CACHE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
goto bail; goto bail;
......
...@@ -249,7 +249,7 @@ int ocfs2_load_local_alloc(struct ocfs2_super *osb) ...@@ -249,7 +249,7 @@ int ocfs2_load_local_alloc(struct ocfs2_super *osb)
} }
status = ocfs2_read_blocks(inode, OCFS2_I(inode)->ip_blkno, 1, status = ocfs2_read_blocks(inode, OCFS2_I(inode)->ip_blkno, 1,
&alloc_bh, 0); &alloc_bh, OCFS2_BH_IGNORE_CACHE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
goto bail; goto bail;
...@@ -460,7 +460,7 @@ int ocfs2_begin_local_alloc_recovery(struct ocfs2_super *osb, ...@@ -460,7 +460,7 @@ int ocfs2_begin_local_alloc_recovery(struct ocfs2_super *osb,
mutex_lock(&inode->i_mutex); mutex_lock(&inode->i_mutex);
status = ocfs2_read_blocks(inode, OCFS2_I(inode)->ip_blkno, 1, status = ocfs2_read_blocks(inode, OCFS2_I(inode)->ip_blkno, 1,
&alloc_bh, 0); &alloc_bh, OCFS2_BH_IGNORE_CACHE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
goto bail; goto bail;
......
...@@ -150,7 +150,8 @@ int ocfs2_refresh_slot_info(struct ocfs2_super *osb) ...@@ -150,7 +150,8 @@ int ocfs2_refresh_slot_info(struct ocfs2_super *osb)
* be !NULL. Thus, ocfs2_read_blocks() will ignore blocknr. If * be !NULL. Thus, ocfs2_read_blocks() will ignore blocknr. If
* this is not true, the read of -1 (UINT64_MAX) will fail. * this is not true, the read of -1 (UINT64_MAX) will fail.
*/ */
ret = ocfs2_read_blocks(si->si_inode, -1, si->si_blocks, si->si_bh, 0); ret = ocfs2_read_blocks(si->si_inode, -1, si->si_blocks, si->si_bh,
OCFS2_BH_IGNORE_CACHE);
if (ret == 0) { if (ret == 0) {
spin_lock(&osb->osb_lock); spin_lock(&osb->osb_lock);
ocfs2_update_slot_info(si); ocfs2_update_slot_info(si);
...@@ -403,7 +404,8 @@ static int ocfs2_map_slot_buffers(struct ocfs2_super *osb, ...@@ -403,7 +404,8 @@ static int ocfs2_map_slot_buffers(struct ocfs2_super *osb,
(unsigned long long)blkno); (unsigned long long)blkno);
bh = NULL; /* Acquire a fresh bh */ bh = NULL; /* Acquire a fresh bh */
status = ocfs2_read_blocks(si->si_inode, blkno, 1, &bh, 0); status = ocfs2_read_blocks(si->si_inode, blkno, 1, &bh,
OCFS2_BH_IGNORE_CACHE);
if (status < 0) { if (status < 0) {
mlog_errno(status); mlog_errno(status);
goto bail; goto bail;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment