unsigned long   *conv_zones_bitmap;
        unsigned long   *seq_zones_wlock;
        unsigned int    nr_zones;
+       unsigned int    zone_capacity;
        sector_t        sector;
 };
 
                return -ENODEV;
        }
 
+       if (!zone->capacity || zone->capacity > zone->len) {
+               pr_warn("%s: Invalid zone capacity\n",
+                       disk->disk_name);
+               return -ENODEV;
+       }
+
        /* Check zone type */
        switch (zone->type) {
        case BLK_ZONE_TYPE_CONVENTIONAL:
+               if (zone->capacity != zone->len) {
+                       pr_warn("%s: Invalid conventional zone capacity\n",
+                               disk->disk_name);
+                       return -ENODEV;
+               }
                if (!args->conv_zones_bitmap) {
                        args->conv_zones_bitmap =
                                blk_alloc_zone_bitmap(q->node, args->nr_zones);
                        if (!args->seq_zones_wlock)
                                return -ENOMEM;
                }
+
+               /*
+                * Remember the capacity of the first sequential zone and check
+                * if it is constant for all zones.
+                */
+               if (!args->zone_capacity)
+                       args->zone_capacity = zone->capacity;
+               if (zone->capacity != args->zone_capacity) {
+                       pr_warn("%s: Invalid variable zone capacity\n",
+                               disk->disk_name);
+                       return -ENODEV;
+               }
                break;
        case BLK_ZONE_TYPE_SEQWRITE_PREF:
        default:
        blk_mq_freeze_queue(q);
        if (ret > 0) {
                disk->nr_zones = args.nr_zones;
+               disk->zone_capacity = args.zone_capacity;
                swap(disk->seq_zones_wlock, args.seq_zones_wlock);
                swap(disk->conv_zones_bitmap, args.conv_zones_bitmap);
                if (update_driver_data)
 
        kfree(args.seq_zones_wlock);
        kfree(args.conv_zones_bitmap);
+
        return ret;
 }
 EXPORT_SYMBOL_GPL(blk_revalidate_disk_zones);