u32 len_to_oe_boundary;
        btrfs_bio_end_io_t end_io_func;
 
+       /*
+        * This is for metadata read, to provide the extra needed verification
+        * info.  This has to be provided for submit_one_bio(), as
+        * submit_one_bio() can submit a bio if it ends at stripe boundary.  If
+        * no such parent_check is provided, the metadata can hit false alert at
+        * endio time.
+        */
+       struct btrfs_tree_parent_check *parent_check;
+
        /*
         * Tell writepage not to lock the state bits for this range, it still
         * does the unlocking.
 
        btrfs_bio(bio)->file_offset = page_offset(bv->bv_page) + bv->bv_offset;
 
-       if (!is_data_inode(&inode->vfs_inode))
+       if (!is_data_inode(&inode->vfs_inode)) {
+               if (btrfs_op(bio) != BTRFS_MAP_WRITE) {
+                       /*
+                        * For metadata read, we should have the parent_check,
+                        * and copy it to bbio for metadata verification.
+                        */
+                       ASSERT(bio_ctrl->parent_check);
+                       memcpy(&btrfs_bio(bio)->parent_check,
+                              bio_ctrl->parent_check,
+                              sizeof(struct btrfs_tree_parent_check));
+               }
                btrfs_submit_metadata_bio(inode, bio, mirror_num);
-       else if (btrfs_op(bio) == BTRFS_MAP_WRITE)
+       } else if (btrfs_op(bio) == BTRFS_MAP_WRITE) {
                btrfs_submit_data_write_bio(inode, bio, mirror_num);
-       else
+       } else {
                btrfs_submit_data_read_bio(inode, bio, mirror_num,
                                           bio_ctrl->compress_type);
+       }
 
        /* The bio is owned by the end_io handler now */
        bio_ctrl->bio = NULL;
        struct extent_state *cached_state = NULL;
        struct btrfs_bio_ctrl bio_ctrl = {
                .mirror_num = mirror_num,
+               .parent_check = check,
        };
        int ret = 0;
 
                 */
                atomic_dec(&eb->io_pages);
        }
-       memcpy(&btrfs_bio(bio_ctrl.bio)->parent_check, check, sizeof(*check));
        submit_one_bio(&bio_ctrl);
        if (ret || wait != WAIT_COMPLETE) {
                free_extent_state(cached_state);
        unsigned long num_reads = 0;
        struct btrfs_bio_ctrl bio_ctrl = {
                .mirror_num = mirror_num,
+               .parent_check = check,
        };
 
        if (test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags))
                }
        }
 
-       memcpy(&btrfs_bio(bio_ctrl.bio)->parent_check, check, sizeof(*check));
        submit_one_bio(&bio_ctrl);
 
        if (ret || wait != WAIT_COMPLETE)