struct btrfs_dio_private {
        struct inode *inode;
-       u64 logical_offset;
+
+       /*
+        * Since DIO can use anonymous page, we cannot use page_offset() to
+        * grab the file offset, thus need a dedicated member for file offset.
+        */
+       u64 file_offset;
        u64 disk_bytenr;
        /* Used for bio::bi_size */
        u32 bytes;
 
 
        if (btrfs_op(dip->dio_bio) == BTRFS_MAP_WRITE) {
                __endio_write_update_ordered(BTRFS_I(dip->inode),
-                                            dip->logical_offset,
+                                            dip->file_offset,
                                             dip->bytes,
                                             !dip->dio_bio->bi_status);
        } else {
                unlock_extent(&BTRFS_I(dip->inode)->io_tree,
-                             dip->logical_offset,
-                             dip->logical_offset + dip->bytes - 1);
+                             dip->file_offset,
+                             dip->file_offset + dip->bytes - 1);
        }
 
        bio_endio(dip->dio_bio);
        if (err)
                dip->dio_bio->bi_status = err;
 
-       btrfs_record_physical_zoned(dip->inode, dip->logical_offset, bio);
+       btrfs_record_physical_zoned(dip->inode, dip->file_offset, bio);
 
        bio_put(bio);
        btrfs_dio_private_put(dip);
        } else {
                u64 csum_offset;
 
-               csum_offset = file_offset - dip->logical_offset;
+               csum_offset = file_offset - dip->file_offset;
                csum_offset >>= fs_info->sectorsize_bits;
                csum_offset *= fs_info->csum_size;
                btrfs_bio(bio)->csum = dip->csums + csum_offset;
                return NULL;
 
        dip->inode = inode;
-       dip->logical_offset = file_offset;
+       dip->file_offset = file_offset;
        dip->bytes = dio_bio->bi_iter.bi_size;
        dip->disk_bytenr = dio_bio->bi_iter.bi_sector << 9;
        dip->dio_bio = dio_bio;