> +static inline unsigned long *sd_zbc_alloc_zone_bitmap(struct scsi_disk *sdkp)
> +{
> +     struct request_queue *q = sdkp->disk->queue;
> +
> +     return kzalloc_node(BITS_TO_LONGS(sdkp->nr_zones)
> +                         * sizeof(unsigned long),
> +                         GFP_KERNEL, q->node);

This really screams for kcalloc_node and friends that I think Johannes
volunteered to add.

> + * sd_zbc_setup_seq_zones - Initialize the disk request queue zone type 
> bitmap.
> + * @sdkp: The disk of the bitmap
> + *
> + * Allocate a zone bitmap and initialize it by identifying sequential zones.
> + */
> +static int sd_zbc_setup_seq_zones(struct scsi_disk *sdkp)
> +{
> +     struct request_queue *q = sdkp->disk->queue;
> +     unsigned long *seq_zones;
> +     sector_t block = 0;
> +     unsigned char *buf;
> +     unsigned char *rec;
> +     unsigned int buf_len;
> +     unsigned int list_length;
> +     unsigned int n = 0;
> +     u8 type, cond;
> +     int ret = -ENOMEM;
> +
> +     kfree(q->seq_zones);
> +     q->seq_zones = NULL;

We also free the previous version, which isn't documented above.
Which in general begs the question:  What scheme protects access
to q->seq_zones?

And the previous patch should probably grow a comment to document
that q->seq_zones is entirely managed by the driver.

> +             /*
> +              * Parse reported zone descriptors to find sequiential zones.
> +              * Since read-only and offline zones cannot be written, do not
> +              * mark them as sequential in the bitmap.
> +              */
> +             list_length = get_unaligned_be32(&buf[0]) + 64;
> +             rec = buf + 64;
> +             buf_len = min(list_length, SD_ZBC_BUF_SIZE);
> +             while (rec < buf + buf_len) {
> +                     type = rec[0] & 0x0f;
> +                     cond = (rec[1] >> 4) & 0xf;
> +                     if (type != ZBC_ZONE_TYPE_CONV &&
> +                         cond != ZBC_ZONE_COND_READONLY &&
> +                         cond != ZBC_ZONE_COND_OFFLINE)
> +                             set_bit(n, seq_zones);
> +                     block = get_unaligned_be64(&rec[8]) +
> +                             get_unaligned_be64(&rec[16]);
> +                     rec += 64;
> +                     n++;
> +             }

Split this out into a helper?

Reply via email to