@@ -800,40 +800,41 @@ static unsigned int blk_zone_wp_offset(struct blk_zone *zone)
800800 case BLK_ZONE_COND_IMP_OPEN :
801801 case BLK_ZONE_COND_EXP_OPEN :
802802 case BLK_ZONE_COND_CLOSED :
803+ case BLK_ZONE_COND_ACTIVE :
803804 return zone -> wp - zone -> start ;
804- case BLK_ZONE_COND_FULL :
805- return zone -> len ;
806805 case BLK_ZONE_COND_EMPTY :
807806 return 0 ;
807+ case BLK_ZONE_COND_FULL :
808808 case BLK_ZONE_COND_NOT_WP :
809809 case BLK_ZONE_COND_OFFLINE :
810810 case BLK_ZONE_COND_READONLY :
811811 default :
812812 /*
813- * Conventional, offline and read-only zones do not have a valid
814- * write pointer.
813+ * Conventional, full, offline and read-only zones do not have
814+ * a valid write pointer.
815815 */
816816 return UINT_MAX ;
817817 }
818818}
819819
820- static void disk_zone_wplug_sync_wp_offset (struct gendisk * disk ,
821- struct blk_zone * zone )
820+ static unsigned int disk_zone_wplug_sync_wp_offset (struct gendisk * disk ,
821+ struct blk_zone * zone )
822822{
823823 struct blk_zone_wplug * zwplug ;
824- unsigned long flags ;
824+ unsigned int wp_offset = blk_zone_wp_offset ( zone ) ;
825825
826826 zwplug = disk_get_zone_wplug (disk , zone -> start );
827- if (! zwplug )
828- return ;
827+ if (zwplug ) {
828+ unsigned long flags ;
829829
830- spin_lock_irqsave (& zwplug -> lock , flags );
831- if (zwplug -> flags & BLK_ZONE_WPLUG_NEED_WP_UPDATE )
832- disk_zone_wplug_set_wp_offset (disk , zwplug ,
833- blk_zone_wp_offset (zone ));
834- spin_unlock_irqrestore (& zwplug -> lock , flags );
830+ spin_lock_irqsave (& zwplug -> lock , flags );
831+ if (zwplug -> flags & BLK_ZONE_WPLUG_NEED_WP_UPDATE )
832+ disk_zone_wplug_set_wp_offset (disk , zwplug , wp_offset );
833+ spin_unlock_irqrestore (& zwplug -> lock , flags );
834+ disk_put_zone_wplug (zwplug );
835+ }
835836
836- disk_put_zone_wplug ( zwplug ) ;
837+ return wp_offset ;
837838}
838839
839840/**
@@ -949,7 +950,7 @@ int blkdev_get_zone_info(struct block_device *bdev, sector_t sector,
949950 return - EINVAL ;
950951
951952 memset (zone , 0 , sizeof (* zone ));
952- sector = ALIGN_DOWN ( sector , zone_sectors );
953+ sector = bdev_zone_start ( bdev , sector );
953954
954955 if (!blkdev_has_cached_report_zones (bdev ))
955956 return blkdev_report_zone_fallback (bdev , sector , zone );
@@ -1067,7 +1068,7 @@ int blkdev_report_zones_cached(struct block_device *bdev, sector_t sector,
10671068 return blkdev_do_report_zones (bdev , sector , nr_zones , & args );
10681069 }
10691070
1070- for (sector = ALIGN_DOWN ( sector , zone_sectors );
1071+ for (sector = bdev_zone_start ( bdev , sector );
10711072 sector < capacity && idx < nr_zones ;
10721073 sector += zone_sectors , idx ++ ) {
10731074 ret = blkdev_get_zone_info (bdev , sector , & zone );
@@ -2101,9 +2102,7 @@ static int blk_revalidate_seq_zone(struct blk_zone *zone, unsigned int idx,
21012102 if (!queue_emulates_zone_append (disk -> queue ) || !disk -> zone_wplugs_hash )
21022103 return 0 ;
21032104
2104- disk_zone_wplug_sync_wp_offset (disk , zone );
2105-
2106- wp_offset = blk_zone_wp_offset (zone );
2105+ wp_offset = disk_zone_wplug_sync_wp_offset (disk , zone );
21072106 if (!wp_offset || wp_offset >= zone -> capacity )
21082107 return 0 ;
21092108
0 commit comments