linux/block/blk-zoned.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Zoned block device handling
   4 *
   5 * Copyright (c) 2015, Hannes Reinecke
   6 * Copyright (c) 2015, SUSE Linux GmbH
   7 *
   8 * Copyright (c) 2016, Damien Le Moal
   9 * Copyright (c) 2016, Western Digital
  10 */
  11
  12#include <linux/kernel.h>
  13#include <linux/module.h>
  14#include <linux/rbtree.h>
  15#include <linux/blkdev.h>
  16#include <linux/blk-mq.h>
  17#include <linux/mm.h>
  18#include <linux/vmalloc.h>
  19#include <linux/sched/mm.h>
  20
  21#include "blk.h"
  22
  23#define ZONE_COND_NAME(name) [BLK_ZONE_COND_##name] = #name
  24static const char *const zone_cond_name[] = {
  25        ZONE_COND_NAME(NOT_WP),
  26        ZONE_COND_NAME(EMPTY),
  27        ZONE_COND_NAME(IMP_OPEN),
  28        ZONE_COND_NAME(EXP_OPEN),
  29        ZONE_COND_NAME(CLOSED),
  30        ZONE_COND_NAME(READONLY),
  31        ZONE_COND_NAME(FULL),
  32        ZONE_COND_NAME(OFFLINE),
  33};
  34#undef ZONE_COND_NAME
  35
  36/**
  37 * blk_zone_cond_str - Return string XXX in BLK_ZONE_COND_XXX.
  38 * @zone_cond: BLK_ZONE_COND_XXX.
  39 *
  40 * Description: Centralize block layer function to convert BLK_ZONE_COND_XXX
  41 * into string format. Useful in the debugging and tracing zone conditions. For
  42 * invalid BLK_ZONE_COND_XXX it returns string "UNKNOWN".
  43 */
  44const char *blk_zone_cond_str(enum blk_zone_cond zone_cond)
  45{
  46        static const char *zone_cond_str = "UNKNOWN";
  47
  48        if (zone_cond < ARRAY_SIZE(zone_cond_name) && zone_cond_name[zone_cond])
  49                zone_cond_str = zone_cond_name[zone_cond];
  50
  51        return zone_cond_str;
  52}
  53EXPORT_SYMBOL_GPL(blk_zone_cond_str);
  54
  55/*
  56 * Return true if a request is a write requests that needs zone write locking.
  57 */
  58bool blk_req_needs_zone_write_lock(struct request *rq)
  59{
  60        if (!rq->q->disk->seq_zones_wlock)
  61                return false;
  62
  63        return blk_rq_is_seq_zoned_write(rq);
  64}
  65EXPORT_SYMBOL_GPL(blk_req_needs_zone_write_lock);
  66
  67bool blk_req_zone_write_trylock(struct request *rq)
  68{
  69        unsigned int zno = blk_rq_zone_no(rq);
  70
  71        if (test_and_set_bit(zno, rq->q->disk->seq_zones_wlock))
  72                return false;
  73
  74        WARN_ON_ONCE(rq->rq_flags & RQF_ZONE_WRITE_LOCKED);
  75        rq->rq_flags |= RQF_ZONE_WRITE_LOCKED;
  76
  77        return true;
  78}
  79EXPORT_SYMBOL_GPL(blk_req_zone_write_trylock);
  80
  81void __blk_req_zone_write_lock(struct request *rq)
  82{
  83        if (WARN_ON_ONCE(test_and_set_bit(blk_rq_zone_no(rq),
  84                                          rq->q->disk->seq_zones_wlock)))
  85                return;
  86
  87        WARN_ON_ONCE(rq->rq_flags & RQF_ZONE_WRITE_LOCKED);
  88        rq->rq_flags |= RQF_ZONE_WRITE_LOCKED;
  89}
  90EXPORT_SYMBOL_GPL(__blk_req_zone_write_lock);
  91
  92void __blk_req_zone_write_unlock(struct request *rq)
  93{
  94        rq->rq_flags &= ~RQF_ZONE_WRITE_LOCKED;
  95        if (rq->q->disk->seq_zones_wlock)
  96                WARN_ON_ONCE(!test_and_clear_bit(blk_rq_zone_no(rq),
  97                                                 rq->q->disk->seq_zones_wlock));
  98}
  99EXPORT_SYMBOL_GPL(__blk_req_zone_write_unlock);
 100
 101/**
 102 * bdev_nr_zones - Get number of zones
 103 * @bdev:       Target device
 104 *
 105 * Return the total number of zones of a zoned block device.  For a block
 106 * device without zone capabilities, the number of zones is always 0.
 107 */
 108unsigned int bdev_nr_zones(struct block_device *bdev)
 109{
 110        sector_t zone_sectors = bdev_zone_sectors(bdev);
 111
 112        if (!bdev_is_zoned(bdev))
 113                return 0;
 114        return (bdev_nr_sectors(bdev) + zone_sectors - 1) >>
 115                ilog2(zone_sectors);
 116}
 117EXPORT_SYMBOL_GPL(bdev_nr_zones);
 118
 119/**
 120 * blkdev_report_zones - Get zones information
 121 * @bdev:       Target block device
 122 * @sector:     Sector from which to report zones
 123 * @nr_zones:   Maximum number of zones to report
 124 * @cb:         Callback function called for each reported zone
 125 * @data:       Private data for the callback
 126 *
 127 * Description:
 128 *    Get zone information starting from the zone containing @sector for at most
 129 *    @nr_zones, and call @cb for each zone reported by the device.
 130 *    To report all zones in a device starting from @sector, the BLK_ALL_ZONES
 131 *    constant can be passed to @nr_zones.
 132 *    Returns the number of zones reported by the device, or a negative errno
 133 *    value in case of failure.
 134 *
 135 *    Note: The caller must use memalloc_noXX_save/restore() calls to control
 136 *    memory allocations done within this function.
 137 */
 138int blkdev_report_zones(struct block_device *bdev, sector_t sector,
 139                        unsigned int nr_zones, report_zones_cb cb, void *data)
 140{
 141        struct gendisk *disk = bdev->bd_disk;
 142        sector_t capacity = get_capacity(disk);
 143
 144        if (!bdev_is_zoned(bdev) || WARN_ON_ONCE(!disk->fops->report_zones))
 145                return -EOPNOTSUPP;
 146
 147        if (!nr_zones || sector >= capacity)
 148                return 0;
 149
 150        return disk->fops->report_zones(disk, sector, nr_zones, cb, data);
 151}
 152EXPORT_SYMBOL_GPL(blkdev_report_zones);
 153
 154static inline unsigned long *blk_alloc_zone_bitmap(int node,
 155                                                   unsigned int nr_zones)
 156{
 157        return kcalloc_node(BITS_TO_LONGS(nr_zones), sizeof(unsigned long),
 158                            GFP_NOIO, node);
 159}
 160
 161static int blk_zone_need_reset_cb(struct blk_zone *zone, unsigned int idx,
 162                                  void *data)
 163{
 164        /*
 165         * For an all-zones reset, ignore conventional, empty, read-only
 166         * and offline zones.
 167         */
 168        switch (zone->cond) {
 169        case BLK_ZONE_COND_NOT_WP:
 170        case BLK_ZONE_COND_EMPTY:
 171        case BLK_ZONE_COND_READONLY:
 172        case BLK_ZONE_COND_OFFLINE:
 173                return 0;
 174        default:
 175                set_bit(idx, (unsigned long *)data);
 176                return 0;
 177        }
 178}
 179
 180static int blkdev_zone_reset_all_emulated(struct block_device *bdev,
 181                                          gfp_t gfp_mask)
 182{
 183        struct gendisk *disk = bdev->bd_disk;
 184        sector_t capacity = bdev_nr_sectors(bdev);
 185        sector_t zone_sectors = bdev_zone_sectors(bdev);
 186        unsigned long *need_reset;
 187        struct bio *bio = NULL;
 188        sector_t sector = 0;
 189        int ret;
 190
 191        need_reset = blk_alloc_zone_bitmap(disk->queue->node, disk->nr_zones);
 192        if (!need_reset)
 193                return -ENOMEM;
 194
 195        ret = disk->fops->report_zones(disk, 0, disk->nr_zones,
 196                                       blk_zone_need_reset_cb, need_reset);
 197        if (ret < 0)
 198                goto out_free_need_reset;
 199
 200        ret = 0;
 201        while (sector < capacity) {
 202                if (!test_bit(disk_zone_no(disk, sector), need_reset)) {
 203                        sector += zone_sectors;
 204                        continue;
 205                }
 206
 207                bio = blk_next_bio(bio, bdev, 0, REQ_OP_ZONE_RESET | REQ_SYNC,
 208                                   gfp_mask);
 209                bio->bi_iter.bi_sector = sector;
 210                sector += zone_sectors;
 211
 212                /* This may take a while, so be nice to others */
 213                cond_resched();
 214        }
 215
 216        if (bio) {
 217                ret = submit_bio_wait(bio);
 218                bio_put(bio);
 219        }
 220
 221out_free_need_reset:
 222        kfree(need_reset);
 223        return ret;
 224}
 225
 226static int blkdev_zone_reset_all(struct block_device *bdev, gfp_t gfp_mask)
 227{
 228        struct bio bio;
 229
 230        bio_init(&bio, bdev, NULL, 0, REQ_OP_ZONE_RESET_ALL | REQ_SYNC);
 231        return submit_bio_wait(&bio);
 232}
 233
 234/**
 235 * blkdev_zone_mgmt - Execute a zone management operation on a range of zones
 236 * @bdev:       Target block device
 237 * @op:         Operation to be performed on the zones
 238 * @sector:     Start sector of the first zone to operate on
 239 * @nr_sectors: Number of sectors, should be at least the length of one zone and
 240 *              must be zone size aligned.
 241 * @gfp_mask:   Memory allocation flags (for bio_alloc)
 242 *
 243 * Description:
 244 *    Perform the specified operation on the range of zones specified by
 245 *    @sector..@sector+@nr_sectors. Specifying the entire disk sector range
 246 *    is valid, but the specified range should not contain conventional zones.
 247 *    The operation to execute on each zone can be a zone reset, open, close
 248 *    or finish request.
 249 */
 250int blkdev_zone_mgmt(struct block_device *bdev, enum req_op op,
 251                     sector_t sector, sector_t nr_sectors, gfp_t gfp_mask)
 252{
 253        struct request_queue *q = bdev_get_queue(bdev);
 254        sector_t zone_sectors = bdev_zone_sectors(bdev);
 255        sector_t capacity = bdev_nr_sectors(bdev);
 256        sector_t end_sector = sector + nr_sectors;
 257        struct bio *bio = NULL;
 258        int ret = 0;
 259
 260        if (!bdev_is_zoned(bdev))
 261                return -EOPNOTSUPP;
 262
 263        if (bdev_read_only(bdev))
 264                return -EPERM;
 265
 266        if (!op_is_zone_mgmt(op))
 267                return -EOPNOTSUPP;
 268
 269        if (end_sector <= sector || end_sector > capacity)
 270                /* Out of range */
 271                return -EINVAL;
 272
 273        /* Check alignment (handle eventual smaller last zone) */
 274        if (!bdev_is_zone_start(bdev, sector))
 275                return -EINVAL;
 276
 277        if (!bdev_is_zone_start(bdev, nr_sectors) && end_sector != capacity)
 278                return -EINVAL;
 279
 280        /*
 281         * In the case of a zone reset operation over all zones,
 282         * REQ_OP_ZONE_RESET_ALL can be used with devices supporting this
 283         * command. For other devices, we emulate this command behavior by
 284         * identifying the zones needing a reset.
 285         */
 286        if (op == REQ_OP_ZONE_RESET && sector == 0 && nr_sectors == capacity) {
 287                if (!blk_queue_zone_resetall(q))
 288                        return blkdev_zone_reset_all_emulated(bdev, gfp_mask);
 289                return blkdev_zone_reset_all(bdev, gfp_mask);
 290        }
 291
 292        while (sector < end_sector) {
 293                bio = blk_next_bio(bio, bdev, 0, op | REQ_SYNC, gfp_mask);
 294                bio->bi_iter.bi_sector = sector;
 295                sector += zone_sectors;
 296
 297                /* This may take a while, so be nice to others */
 298                cond_resched();
 299        }
 300
 301        ret = submit_bio_wait(bio);
 302        bio_put(bio);
 303
 304        return ret;
 305}
 306EXPORT_SYMBOL_GPL(blkdev_zone_mgmt);
 307
 308struct zone_report_args {
 309        struct blk_zone __user *zones;
 310};
 311
 312static int blkdev_copy_zone_to_user(struct blk_zone *zone, unsigned int idx,
 313                                    void *data)
 314{
 315        struct zone_report_args *args = data;
 316
 317        if (copy_to_user(&args->zones[idx], zone, sizeof(struct blk_zone)))
 318                return -EFAULT;
 319        return 0;
 320}
 321
 322/*
 323 * BLKREPORTZONE ioctl processing.
 324 * Called from blkdev_ioctl.
 325 */
 326int blkdev_report_zones_ioctl(struct block_device *bdev, unsigned int cmd,
 327                unsigned long arg)
 328{
 329        void __user *argp = (void __user *)arg;
 330        struct zone_report_args args;
 331        struct blk_zone_report rep;
 332        int ret;
 333
 334        if (!argp)
 335                return -EINVAL;
 336
 337        if (!bdev_is_zoned(bdev))
 338                return -ENOTTY;
 339
 340        if (copy_from_user(&rep, argp, sizeof(struct blk_zone_report)))
 341                return -EFAULT;
 342
 343        if (!rep.nr_zones)
 344                return -EINVAL;
 345
 346        args.zones = argp + sizeof(struct blk_zone_report);
 347        ret = blkdev_report_zones(bdev, rep.sector, rep.nr_zones,
 348                                  blkdev_copy_zone_to_user, &args);
 349        if (ret < 0)
 350                return ret;
 351
 352        rep.nr_zones = ret;
 353        rep.flags = BLK_ZONE_REP_CAPACITY;
 354        if (copy_to_user(argp, &rep, sizeof(struct blk_zone_report)))
 355                return -EFAULT;
 356        return 0;
 357}
 358
 359static int blkdev_truncate_zone_range(struct block_device *bdev,
 360                blk_mode_t mode, const struct blk_zone_range *zrange)
 361{
 362        loff_t start, end;
 363
 364        if (zrange->sector + zrange->nr_sectors <= zrange->sector ||
 365            zrange->sector + zrange->nr_sectors > get_capacity(bdev->bd_disk))
 366                /* Out of range */
 367                return -EINVAL;
 368
 369        start = zrange->sector << SECTOR_SHIFT;
 370        end = ((zrange->sector + zrange->nr_sectors) << SECTOR_SHIFT) - 1;
 371
 372        return truncate_bdev_range(bdev, mode, start, end);
 373}
 374
 375/*
 376 * BLKRESETZONE, BLKOPENZONE, BLKCLOSEZONE and BLKFINISHZONE ioctl processing.
 377 * Called from blkdev_ioctl.
 378 */
 379int blkdev_zone_mgmt_ioctl(struct block_device *bdev, blk_mode_t mode,
 380                           unsigned int cmd, unsigned long arg)
 381{
 382        void __user *argp = (void __user *)arg;
 383        struct blk_zone_range zrange;
 384        enum req_op op;
 385        int ret;
 386
 387        if (!argp)
 388                return -EINVAL;
 389
 390        if (!bdev_is_zoned(bdev))
 391                return -ENOTTY;
 392
 393        if (!(mode & BLK_OPEN_WRITE))
 394                return -EBADF;
 395
 396        if (copy_from_user(&zrange, argp, sizeof(struct blk_zone_range)))
 397                return -EFAULT;
 398
 399        switch (cmd) {
 400        case BLKRESETZONE:
 401                op = REQ_OP_ZONE_RESET;
 402
 403                /* Invalidate the page cache, including dirty pages. */
 404                filemap_invalidate_lock(bdev->bd_inode->i_mapping);
 405                ret = blkdev_truncate_zone_range(bdev, mode, &zrange);
 406                if (ret)
 407                        goto fail;
 408                break;
 409        case BLKOPENZONE:
 410                op = REQ_OP_ZONE_OPEN;
 411                break;
 412        case BLKCLOSEZONE:
 413                op = REQ_OP_ZONE_CLOSE;
 414                break;
 415        case BLKFINISHZONE:
 416                op = REQ_OP_ZONE_FINISH;
 417                break;
 418        default:
 419                return -ENOTTY;
 420        }
 421
 422        ret = blkdev_zone_mgmt(bdev, op, zrange.sector, zrange.nr_sectors,
 423                               GFP_KERNEL);
 424
 425fail:
 426        if (cmd == BLKRESETZONE)
 427                filemap_invalidate_unlock(bdev->bd_inode->i_mapping);
 428
 429        return ret;
 430}
 431
 432void disk_free_zone_bitmaps(struct gendisk *disk)
 433{
 434        kfree(disk->conv_zones_bitmap);
 435        disk->conv_zones_bitmap = NULL;
 436        kfree(disk->seq_zones_wlock);
 437        disk->seq_zones_wlock = NULL;
 438}
 439
 440struct blk_revalidate_zone_args {
 441        struct gendisk  *disk;
 442        unsigned long   *conv_zones_bitmap;
 443        unsigned long   *seq_zones_wlock;
 444        unsigned int    nr_zones;
 445        sector_t        sector;
 446};
 447
 448/*
 449 * Helper function to check the validity of zones of a zoned block device.
 450 */
 451static int blk_revalidate_zone_cb(struct blk_zone *zone, unsigned int idx,
 452                                  void *data)
 453{
 454        struct blk_revalidate_zone_args *args = data;
 455        struct gendisk *disk = args->disk;
 456        struct request_queue *q = disk->queue;
 457        sector_t capacity = get_capacity(disk);
 458        sector_t zone_sectors = q->limits.chunk_sectors;
 459
 460        /* Check for bad zones and holes in the zone report */
 461        if (zone->start != args->sector) {
 462                pr_warn("%s: Zone gap at sectors %llu..%llu\n",
 463                        disk->disk_name, args->sector, zone->start);
 464                return -ENODEV;
 465        }
 466
 467        if (zone->start >= capacity || !zone->len) {
 468                pr_warn("%s: Invalid zone start %llu, length %llu\n",
 469                        disk->disk_name, zone->start, zone->len);
 470                return -ENODEV;
 471        }
 472
 473        /*
 474         * All zones must have the same size, with the exception on an eventual
 475         * smaller last zone.
 476         */
 477        if (zone->start + zone->len < capacity) {
 478                if (zone->len != zone_sectors) {
 479                        pr_warn("%s: Invalid zoned device with non constant zone size\n",
 480                                disk->disk_name);
 481                        return -ENODEV;
 482                }
 483        } else if (zone->len > zone_sectors) {
 484                pr_warn("%s: Invalid zoned device with larger last zone size\n",
 485                        disk->disk_name);
 486                return -ENODEV;
 487        }
 488
 489        /* Check zone type */
 490        switch (zone->type) {
 491        case BLK_ZONE_TYPE_CONVENTIONAL:
 492                if (!args->conv_zones_bitmap) {
 493                        args->conv_zones_bitmap =
 494                                blk_alloc_zone_bitmap(q->node, args->nr_zones);
 495                        if (!args->conv_zones_bitmap)
 496                                return -ENOMEM;
 497                }
 498                set_bit(idx, args->conv_zones_bitmap);
 499                break;
 500        case BLK_ZONE_TYPE_SEQWRITE_REQ:
 501        case BLK_ZONE_TYPE_SEQWRITE_PREF:
 502                if (!args->seq_zones_wlock) {
 503                        args->seq_zones_wlock =
 504                                blk_alloc_zone_bitmap(q->node, args->nr_zones);
 505                        if (!args->seq_zones_wlock)
 506                                return -ENOMEM;
 507                }
 508                break;
 509        default:
 510                pr_warn("%s: Invalid zone type 0x%x at sectors %llu\n",
 511                        disk->disk_name, (int)zone->type, zone->start);
 512                return -ENODEV;
 513        }
 514
 515        args->sector += zone->len;
 516        return 0;
 517}
 518
 519/**
 520 * blk_revalidate_disk_zones - (re)allocate and initialize zone bitmaps
 521 * @disk:       Target disk
 522 * @update_driver_data: Callback to update driver data on the frozen disk
 523 *
 524 * Helper function for low-level device drivers to check and (re) allocate and
 525 * initialize a disk request queue zone bitmaps. This functions should normally
 526 * be called within the disk ->revalidate method for blk-mq based drivers.
 527 * Before calling this function, the device driver must already have set the
 528 * device zone size (chunk_sector limit) and the max zone append limit.
 529 * For BIO based drivers, this function cannot be used. BIO based device drivers
 530 * only need to set disk->nr_zones so that the sysfs exposed value is correct.
 531 * If the @update_driver_data callback function is not NULL, the callback is
 532 * executed with the device request queue frozen after all zones have been
 533 * checked.
 534 */
 535int blk_revalidate_disk_zones(struct gendisk *disk,
 536                              void (*update_driver_data)(struct gendisk *disk))
 537{
 538        struct request_queue *q = disk->queue;
 539        sector_t zone_sectors = q->limits.chunk_sectors;
 540        sector_t capacity = get_capacity(disk);
 541        struct blk_revalidate_zone_args args = { };
 542        unsigned int noio_flag;
 543        int ret;
 544
 545        if (WARN_ON_ONCE(!blk_queue_is_zoned(q)))
 546                return -EIO;
 547        if (WARN_ON_ONCE(!queue_is_mq(q)))
 548                return -EIO;
 549
 550        if (!capacity)
 551                return -ENODEV;
 552
 553        /*
 554         * Checks that the device driver indicated a valid zone size and that
 555         * the max zone append limit is set.
 556         */
 557        if (!zone_sectors || !is_power_of_2(zone_sectors)) {
 558                pr_warn("%s: Invalid non power of two zone size (%llu)\n",
 559                        disk->disk_name, zone_sectors);
 560                return -ENODEV;
 561        }
 562
 563        if (!q->limits.max_zone_append_sectors) {
 564                pr_warn("%s: Invalid 0 maximum zone append limit\n",
 565                        disk->disk_name);
 566                return -ENODEV;
 567        }
 568
 569        /*
 570         * Ensure that all memory allocations in this context are done as if
 571         * GFP_NOIO was specified.
 572         */
 573        args.disk = disk;
 574        args.nr_zones = (capacity + zone_sectors - 1) >> ilog2(zone_sectors);
 575        noio_flag = memalloc_noio_save();
 576        ret = disk->fops->report_zones(disk, 0, UINT_MAX,
 577                                       blk_revalidate_zone_cb, &args);
 578        if (!ret) {
 579                pr_warn("%s: No zones reported\n", disk->disk_name);
 580                ret = -ENODEV;
 581        }
 582        memalloc_noio_restore(noio_flag);
 583
 584        /*
 585         * If zones where reported, make sure that the entire disk capacity
 586         * has been checked.
 587         */
 588        if (ret > 0 && args.sector != capacity) {
 589                pr_warn("%s: Missing zones from sector %llu\n",
 590                        disk->disk_name, args.sector);
 591                ret = -ENODEV;
 592        }
 593
 594        /*
 595         * Install the new bitmaps and update nr_zones only once the queue is
 596         * stopped and all I/Os are completed (i.e. a scheduler is not
 597         * referencing the bitmaps).
 598         */
 599        blk_mq_freeze_queue(q);
 600        if (ret > 0) {
 601                disk->nr_zones = args.nr_zones;
 602                swap(disk->seq_zones_wlock, args.seq_zones_wlock);
 603                swap(disk->conv_zones_bitmap, args.conv_zones_bitmap);
 604                if (update_driver_data)
 605                        update_driver_data(disk);
 606                ret = 0;
 607        } else {
 608                pr_warn("%s: failed to revalidate zones\n", disk->disk_name);
 609                disk_free_zone_bitmaps(disk);
 610        }
 611        blk_mq_unfreeze_queue(q);
 612
 613        kfree(args.seq_zones_wlock);
 614        kfree(args.conv_zones_bitmap);
 615        return ret;
 616}
 617EXPORT_SYMBOL_GPL(blk_revalidate_disk_zones);
 618
 619void disk_clear_zone_settings(struct gendisk *disk)
 620{
 621        struct request_queue *q = disk->queue;
 622
 623        blk_mq_freeze_queue(q);
 624
 625        disk_free_zone_bitmaps(disk);
 626        blk_queue_flag_clear(QUEUE_FLAG_ZONE_RESETALL, q);
 627        q->required_elevator_features &= ~ELEVATOR_F_ZBD_SEQ_WRITE;
 628        disk->nr_zones = 0;
 629        disk->max_open_zones = 0;
 630        disk->max_active_zones = 0;
 631        q->limits.chunk_sectors = 0;
 632        q->limits.zone_write_granularity = 0;
 633        q->limits.max_zone_append_sectors = 0;
 634
 635        blk_mq_unfreeze_queue(q);
 636}
 637