.is_id = ocfs2_global_is_id,
 };
 
-struct buffer_head *ocfs2_read_quota_block(struct inode *inode,
-                                          int block, int *err)
+int ocfs2_read_quota_block(struct inode *inode, u64 v_block,
+                          struct buffer_head **bh)
 {
-       struct buffer_head *tmp = NULL;
+       int rc = 0;
+       struct buffer_head *tmp = *bh;
 
-       *err = ocfs2_read_virt_blocks(inode, block, 1, &tmp, 0, NULL);
-       if (*err)
-               mlog_errno(*err);
+       rc = ocfs2_read_virt_blocks(inode, v_block, 1, &tmp, 0, NULL);
+       if (rc)
+               mlog_errno(rc);
+
+       /* If ocfs2_read_virt_blocks() got us a new bh, pass it up. */
+       if (!rc && !*bh)
+               *bh = tmp;
 
-       return tmp;
+       return rc;
 }
 
 static struct buffer_head *ocfs2_get_quota_block(struct inode *inode,
        toread = len;
        while (toread > 0) {
                tocopy = min((size_t)(sb->s_blocksize - offset), toread);
-               bh = ocfs2_read_quota_block(gqinode, blk, &err);
-               if (!bh) {
+               bh = NULL;
+               err = ocfs2_read_quota_block(gqinode, blk, &bh);
+               if (err) {
                        mlog_errno(err);
                        return err;
                }
        int offset = off & (sb->s_blocksize - 1);
        sector_t blk = off >> sb->s_blocksize_bits;
        int err = 0, new = 0;
-       struct buffer_head *bh;
+       struct buffer_head *bh = NULL;
        handle_t *handle = journal_current_handle();
 
        if (!handle) {
        /* Not rewriting whole block? */
        if ((offset || len < sb->s_blocksize - OCFS2_QBLK_RESERVED_SPACE) &&
            !new) {
-               bh = ocfs2_read_quota_block(gqinode, blk, &err);
-               if (!bh) {
+               err = ocfs2_read_quota_block(gqinode, blk, &bh);
+               if (err) {
                        mlog_errno(err);
                        return err;
                }
                err = ocfs2_journal_access(handle, gqinode, bh,
-                                               OCFS2_JOURNAL_ACCESS_WRITE);
+                                          OCFS2_JOURNAL_ACCESS_WRITE);
        } else {
                bh = ocfs2_get_quota_block(gqinode, blk, &err);
                if (!bh) {
                        return err;
                }
                err = ocfs2_journal_access(handle, gqinode, bh,
-                                               OCFS2_JOURNAL_ACCESS_CREATE);
+                                          OCFS2_JOURNAL_ACCESS_CREATE);
        }
        if (err < 0) {
                brelse(bh);
 
        unsigned int gversions[MAXQUOTAS] = OCFS2_GLOBAL_QVERSIONS;
        unsigned int ino[MAXQUOTAS] = { USER_QUOTA_SYSTEM_INODE,
                                        GROUP_QUOTA_SYSTEM_INODE };
-       struct buffer_head *bh;
+       struct buffer_head *bh = NULL;
        struct inode *linode = sb_dqopt(sb)->files[type];
        struct inode *ginode = NULL;
        struct ocfs2_disk_dqheader *dqhead;
        int status, ret = 0;
 
        /* First check whether we understand local quota file */
-       bh = ocfs2_read_quota_block(linode, 0, &status);
-       if (!bh) {
+       status = ocfs2_read_quota_block(linode, 0, &bh);
+       if (status) {
                mlog_errno(status);
                mlog(ML_ERROR, "failed to read quota file header (type=%d)\n",
                        type);
                goto out_err;
        }
        /* Since the header is read only, we don't care about locking */
-       bh = ocfs2_read_quota_block(ginode, 0, &status);
-       if (!bh) {
+       status = ocfs2_read_quota_block(ginode, 0, &bh);
+       if (status) {
                mlog_errno(status);
                mlog(ML_ERROR, "failed to read global quota file header "
                                "(type=%d)\n", type);
                        return -ENOMEM;
                }
                newchunk->qc_num = i;
-               newchunk->qc_headerbh = ocfs2_read_quota_block(inode,
+               newchunk->qc_headerbh = NULL;
+               status = ocfs2_read_quota_block(inode,
                                ol_quota_chunk_block(inode->i_sb, i),
-                               &status);
-               if (!newchunk->qc_headerbh) {
+                               &newchunk->qc_headerbh);
+               if (status) {
                        mlog_errno(status);
                        kmem_cache_free(ocfs2_qf_chunk_cachep, newchunk);
                        ocfs2_release_local_quota_bitmaps(head);
        int status = 0;
 
        for (i = 0; i < chunks; i++) {
-               hbh = ocfs2_read_quota_block(lqinode,
-                                            ol_quota_chunk_block(sb, i),
-                                            &status);
-               if (!hbh) {
+               hbh = NULL;
+               status = ocfs2_read_quota_block(lqinode,
+                                               ol_quota_chunk_block(sb, i),
+                                               &hbh);
+               if (status) {
                        mlog_errno(status);
                        break;
                }
                        goto out_put;
                }
                /* Now read local header */
-               bh = ocfs2_read_quota_block(lqinode, 0, &status);
-               if (!bh) {
+               bh = NULL;
+               status = ocfs2_read_quota_block(lqinode, 0, &bh);
+               if (status) {
                        mlog_errno(status);
                        mlog(ML_ERROR, "failed to read quota file info header "
                                "(slot=%d type=%d)\n", slot_num, type);
 
        list_for_each_entry_safe(rchunk, next, &(rec->r_list[type]), rc_list) {
                chunk = rchunk->rc_chunk;
-               hbh = ocfs2_read_quota_block(lqinode,
-                                            ol_quota_chunk_block(sb, chunk),
-                                            &status);
-               if (!hbh) {
+               hbh = NULL;
+               status = ocfs2_read_quota_block(lqinode,
+                                               ol_quota_chunk_block(sb, chunk),
+                                               &hbh);
+               if (status) {
                        mlog_errno(status);
                        break;
                }
                dchunk = (struct ocfs2_local_disk_chunk *)hbh->b_data;
                for_each_bit(bit, rchunk->rc_bitmap, ol_chunk_entries(sb)) {
-                       qbh = ocfs2_read_quota_block(lqinode,
+                       qbh = NULL;
+                       status = ocfs2_read_quota_block(lqinode,
                                                ol_dqblk_block(sb, chunk, bit),
-                                               &status);
-                       if (!qbh) {
+                                               &qbh);
+                       if (status) {
                                mlog_errno(status);
                                break;
                        }
                        goto out_put;
                }
                /* Now read local header */
-               bh = ocfs2_read_quota_block(lqinode, 0, &status);
-               if (!bh) {
+               bh = NULL;
+               status = ocfs2_read_quota_block(lqinode, 0, &bh);
+               if (status) {
                        mlog_errno(status);
                        mlog(ML_ERROR, "failed to read quota file info header "
                                "(slot=%d type=%d)\n", slot_num, type);
        locked = 1;
 
        /* Now read local header */
-       bh = ocfs2_read_quota_block(lqinode, 0, &status);
-       if (!bh) {
+       status = ocfs2_read_quota_block(lqinode, 0, &bh);
+       if (status) {
                mlog_errno(status);
                mlog(ML_ERROR, "failed to read quota file info header "
                        "(type=%d)\n", type);
 {
        struct super_block *sb = dquot->dq_sb;
        struct ocfs2_dquot *od = OCFS2_DQUOT(dquot);
-       struct buffer_head *bh;
+       struct buffer_head *bh = NULL;
        int status;
 
-       bh = ocfs2_read_quota_block(sb_dqopt(sb)->files[dquot->dq_type],
+       status = ocfs2_read_quota_block(sb_dqopt(sb)->files[dquot->dq_type],
                                    ol_dqblk_file_block(sb, od->dq_local_off),
-                                   &status);
-       if (!bh) {
+                                   &bh);
+       if (status) {
                mlog_errno(status);
                goto out;
        }