@@ -417,20 +417,32 @@ int blkdev_report_zones_ioctl(struct block_device *bdev, unsigned int cmd,
417417 return 0 ;
418418}
419419
420- static int blkdev_truncate_zone_range (struct block_device * bdev ,
421- blk_mode_t mode , const struct blk_zone_range * zrange )
420+ static int blkdev_reset_zone (struct block_device * bdev , blk_mode_t mode ,
421+ struct blk_zone_range * zrange )
422422{
423423 loff_t start , end ;
424+ int ret = - EINVAL ;
424425
426+ inode_lock (bdev -> bd_mapping -> host );
427+ filemap_invalidate_lock (bdev -> bd_mapping );
425428 if (zrange -> sector + zrange -> nr_sectors <= zrange -> sector ||
426429 zrange -> sector + zrange -> nr_sectors > get_capacity (bdev -> bd_disk ))
427430 /* Out of range */
428- return - EINVAL ;
431+ goto out_unlock ;
429432
430433 start = zrange -> sector << SECTOR_SHIFT ;
431434 end = ((zrange -> sector + zrange -> nr_sectors ) << SECTOR_SHIFT ) - 1 ;
432435
433- return truncate_bdev_range (bdev , mode , start , end );
436+ ret = truncate_bdev_range (bdev , mode , start , end );
437+ if (ret )
438+ goto out_unlock ;
439+
440+ ret = blkdev_zone_mgmt (bdev , REQ_OP_ZONE_RESET , zrange -> sector ,
441+ zrange -> nr_sectors );
442+ out_unlock :
443+ filemap_invalidate_unlock (bdev -> bd_mapping );
444+ inode_unlock (bdev -> bd_mapping -> host );
445+ return ret ;
434446}
435447
436448/*
@@ -443,7 +455,6 @@ int blkdev_zone_mgmt_ioctl(struct block_device *bdev, blk_mode_t mode,
443455 void __user * argp = (void __user * )arg ;
444456 struct blk_zone_range zrange ;
445457 enum req_op op ;
446- int ret ;
447458
448459 if (!argp )
449460 return - EINVAL ;
@@ -459,15 +470,7 @@ int blkdev_zone_mgmt_ioctl(struct block_device *bdev, blk_mode_t mode,
459470
460471 switch (cmd ) {
461472 case BLKRESETZONE :
462- op = REQ_OP_ZONE_RESET ;
463-
464- /* Invalidate the page cache, including dirty pages. */
465- inode_lock (bdev -> bd_mapping -> host );
466- filemap_invalidate_lock (bdev -> bd_mapping );
467- ret = blkdev_truncate_zone_range (bdev , mode , & zrange );
468- if (ret )
469- goto fail ;
470- break ;
473+ return blkdev_reset_zone (bdev , mode , & zrange );
471474 case BLKOPENZONE :
472475 op = REQ_OP_ZONE_OPEN ;
473476 break ;
@@ -481,15 +484,7 @@ int blkdev_zone_mgmt_ioctl(struct block_device *bdev, blk_mode_t mode,
481484 return - ENOTTY ;
482485 }
483486
484- ret = blkdev_zone_mgmt (bdev , op , zrange .sector , zrange .nr_sectors );
485-
486- fail :
487- if (cmd == BLKRESETZONE ) {
488- filemap_invalidate_unlock (bdev -> bd_mapping );
489- inode_unlock (bdev -> bd_mapping -> host );
490- }
491-
492- return ret ;
487+ return blkdev_zone_mgmt (bdev , op , zrange .sector , zrange .nr_sectors );
493488}
494489
495490static bool disk_zone_is_last (struct gendisk * disk , struct blk_zone * zone )
0 commit comments