int                     c_split_covers_rec;
 };
 
+static int ocfs2_validate_extent_block(struct super_block *sb,
+                                      struct buffer_head *bh)
+{
+       struct ocfs2_extent_block *eb =
+               (struct ocfs2_extent_block *)bh->b_data;
+
+       if (!OCFS2_IS_VALID_EXTENT_BLOCK(eb)) {
+               ocfs2_error(sb,
+                           "Extent block #%llu has bad signature %.*s",
+                           (unsigned long long)bh->b_blocknr, 7,
+                           eb->h_signature);
+               return -EINVAL;
+       }
+
+       if (le64_to_cpu(eb->h_blkno) != bh->b_blocknr) {
+               ocfs2_error(sb,
+                           "Extent block #%llu has an invalid h_blkno "
+                           "of %llu",
+                           (unsigned long long)bh->b_blocknr,
+                           (unsigned long long)le64_to_cpu(eb->h_blkno));
+               return -EINVAL;
+       }
+
+       if (le32_to_cpu(eb->h_fs_generation) != OCFS2_SB(sb)->fs_generation) {
+               ocfs2_error(sb,
+                           "Extent block #%llu has an invalid "
+                           "h_fs_generation of #%u",
+                           (unsigned long long)bh->b_blocknr,
+                           le32_to_cpu(eb->h_fs_generation));
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+int ocfs2_read_extent_block(struct inode *inode, u64 eb_blkno,
+                           struct buffer_head **bh)
+{
+       int rc;
+       struct buffer_head *tmp = *bh;
+
+       rc = ocfs2_read_block(inode, eb_blkno, &tmp);
+       if (rc)
+               goto out;
+
+       rc = ocfs2_validate_extent_block(inode->i_sb, tmp);
+       if (rc) {
+               brelse(tmp);
+               goto out;
+       }
+
+       /* If ocfs2_read_block() got us a new bh, pass it up. */
+       if (!*bh)
+               *bh = tmp;
+
+out:
+       return rc;
+}
+
+
 /*
  * How many free extents have we got before we need more meta data?
  */
        last_eb_blk = ocfs2_et_get_last_eb_blk(et);
 
        if (last_eb_blk) {
-               retval = ocfs2_read_block(inode, last_eb_blk,
-                                         &eb_bh);
+               retval = ocfs2_read_extent_block(inode, last_eb_blk, &eb_bh);
                if (retval < 0) {
                        mlog_errno(retval);
                        goto bail;
        for(i = 0; i < new_blocks; i++) {
                bh = new_eb_bhs[i];
                eb = (struct ocfs2_extent_block *) bh->b_data;
-               if (!OCFS2_IS_VALID_EXTENT_BLOCK(eb)) {
-                       OCFS2_RO_ON_INVALID_EXTENT_BLOCK(inode->i_sb, eb);
-                       status = -EIO;
-                       goto bail;
-               }
+               /* ocfs2_create_new_meta_bhs() should create it right! */
+               BUG_ON(!OCFS2_IS_VALID_EXTENT_BLOCK(eb));
                eb_el = &eb->h_list;
 
                status = ocfs2_journal_access(handle, inode, bh,
        }
 
        eb = (struct ocfs2_extent_block *) new_eb_bh->b_data;
-       if (!OCFS2_IS_VALID_EXTENT_BLOCK(eb)) {
-               OCFS2_RO_ON_INVALID_EXTENT_BLOCK(inode->i_sb, eb);
-               status = -EIO;
-               goto bail;
-       }
+       /* ocfs2_create_new_meta_bhs() should create it right! */
+       BUG_ON(!OCFS2_IS_VALID_EXTENT_BLOCK(eb));
 
        eb_el = &eb->h_list;
        root_el = et->et_root_el;
                brelse(bh);
                bh = NULL;
 
-               status = ocfs2_read_block(inode, blkno, &bh);
+               status = ocfs2_read_extent_block(inode, blkno, &bh);
                if (status < 0) {
                        mlog_errno(status);
                        goto bail;
                }
 
                eb = (struct ocfs2_extent_block *) bh->b_data;
-               if (!OCFS2_IS_VALID_EXTENT_BLOCK(eb)) {
-                       OCFS2_RO_ON_INVALID_EXTENT_BLOCK(inode->i_sb, eb);
-                       status = -EIO;
-                       goto bail;
-               }
                el = &eb->h_list;
 
                if (le16_to_cpu(el->l_next_free_rec) <
 
                brelse(bh);
                bh = NULL;
-               ret = ocfs2_read_block(inode, blkno, &bh);
+               ret = ocfs2_read_extent_block(inode, blkno, &bh);
                if (ret) {
                        mlog_errno(ret);
                        goto out;
 
                eb = (struct ocfs2_extent_block *) bh->b_data;
                el = &eb->h_list;
-               if (!OCFS2_IS_VALID_EXTENT_BLOCK(eb)) {
-                       OCFS2_RO_ON_INVALID_EXTENT_BLOCK(inode->i_sb, eb);
-                       ret = -EIO;
-                       goto out;
-               }
 
                if (le16_to_cpu(el->l_next_free_rec) >
                    le16_to_cpu(el->l_count)) {
                            le16_to_cpu(new_el->l_count)) {
                                bh = path_leaf_bh(left_path);
                                eb = (struct ocfs2_extent_block *)bh->b_data;
-                               OCFS2_RO_ON_INVALID_EXTENT_BLOCK(inode->i_sb,
-                                                                eb);
+                               ocfs2_error(inode->i_sb,
+                                           "Extent block #%llu has an "
+                                           "invalid l_next_free_rec of "
+                                           "%d.  It should have "
+                                           "matched the l_count of %d",
+                                           (unsigned long long)le64_to_cpu(eb->h_blkno),
+                                           le16_to_cpu(new_el->l_next_free_rec),
+                                           le16_to_cpu(new_el->l_count));
+                               status = -EINVAL;
                                goto out;
                        }
                        rec = &new_el->l_recs[
                        if (le16_to_cpu(new_el->l_next_free_rec) <= 1) {
                                bh = path_leaf_bh(right_path);
                                eb = (struct ocfs2_extent_block *)bh->b_data;
-                               OCFS2_RO_ON_INVALID_EXTENT_BLOCK(inode->i_sb,
-                                                                eb);
+                               ocfs2_error(inode->i_sb,
+                                           "Extent block #%llu has an "
+                                           "invalid l_next_free_rec of %d",
+                                           (unsigned long long)le64_to_cpu(eb->h_blkno),
+                                           le16_to_cpu(new_el->l_next_free_rec));
+                               status = -EINVAL;
                                goto out;
                        }
                        rec = &new_el->l_recs[1];
                 * ocfs2_figure_insert_type() and ocfs2_add_branch()
                 * may want it later.
                 */
-               ret = ocfs2_read_block(inode, ocfs2_et_get_last_eb_blk(et), &bh);
+               ret = ocfs2_read_extent_block(inode,
+                                             ocfs2_et_get_last_eb_blk(et),
+                                             &bh);
                if (ret) {
                        mlog_exit(ret);
                        goto out;
        if (path->p_tree_depth) {
                struct ocfs2_extent_block *eb;
 
-               ret = ocfs2_read_block(inode, ocfs2_et_get_last_eb_blk(et),
-                                      &last_eb_bh);
+               ret = ocfs2_read_extent_block(inode,
+                                             ocfs2_et_get_last_eb_blk(et),
+                                             &last_eb_bh);
                if (ret) {
                        mlog_exit(ret);
                        goto out;
                }
 
                eb = (struct ocfs2_extent_block *) last_eb_bh->b_data;
-               if (!OCFS2_IS_VALID_EXTENT_BLOCK(eb)) {
-                       OCFS2_RO_ON_INVALID_EXTENT_BLOCK(inode->i_sb, eb);
-                       ret = -EROFS;
-                       goto out;
-               }
-
                rightmost_el = &eb->h_list;
        } else
                rightmost_el = path_root_el(path);
 
        depth = path->p_tree_depth;
        if (depth > 0) {
-               ret = ocfs2_read_block(inode, ocfs2_et_get_last_eb_blk(et),
-                                      &last_eb_bh);
+               ret = ocfs2_read_extent_block(inode,
+                                             ocfs2_et_get_last_eb_blk(et),
+                                             &last_eb_bh);
                if (ret < 0) {
                        mlog_errno(ret);
                        goto out;
 
        eb = (struct ocfs2_extent_block *) bh->b_data;
        el = &eb->h_list;
-       if (!OCFS2_IS_VALID_EXTENT_BLOCK(eb)) {
-               OCFS2_RO_ON_INVALID_EXTENT_BLOCK(inode->i_sb, eb);
-               ret = -EROFS;
-               goto out;
-       }
+
+       /* ocfs2_find_leaf() gets the eb from ocfs2_read_extent_block().
+        * Any corruption is a code bug. */
+       BUG_ON(!OCFS2_IS_VALID_EXTENT_BLOCK(eb));
 
        *new_last_eb = bh;
        get_bh(*new_last_eb);
        ocfs2_init_dealloc_ctxt(&(*tc)->tc_dealloc);
 
        if (fe->id2.i_list.l_tree_depth) {
-               status = ocfs2_read_block(inode, le64_to_cpu(fe->i_last_eb_blk),
-                                         &last_eb_bh);
+               status = ocfs2_read_extent_block(inode,
+                                                le64_to_cpu(fe->i_last_eb_blk),
+                                                &last_eb_bh);
                if (status < 0) {
                        mlog_errno(status);
                        goto bail;
                }
                eb = (struct ocfs2_extent_block *) last_eb_bh->b_data;
-               if (!OCFS2_IS_VALID_EXTENT_BLOCK(eb)) {
-                       OCFS2_RO_ON_INVALID_EXTENT_BLOCK(inode->i_sb, eb);
-
-                       brelse(last_eb_bh);
-                       status = -EIO;
-                       goto bail;
-               }
        }
 
        (*tc)->tc_last_eb_bh = last_eb_bh;