return sysfs_emit(buf, "%u\n", disk_has_partscan(dev_to_disk(dev)));
}
+static ssize_t disk_distribute_write_streams_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ /* Anything useful to show here like the ranges? */
+ return sysfs_emit(buf, "0\n");
+}
+
+static ssize_t disk_distribute_write_streams_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ struct gendisk *disk = dev_to_disk(dev);
+ struct block_device *bdev = disk->part0, *part;
+ unsigned short total_write_streams =
+ disk->queue->limits.max_write_streams;
+ unsigned short part_write_streams, part_write_stream_start = 0;
+ unsigned long nr_partitions = 0, idx;
+ int error = 0;
+
+ if (!total_write_streams)
+ return -EINVAL;
+
+ mutex_lock(&disk->open_mutex);
+ if (atomic_read(&bdev->bd_openers)) {
+ error = -EBUSY;
+ goto out_unlock;
+ }
+
+ xa_for_each_start(&disk->part_tbl, idx, part, 1)
+ nr_partitions++;
+ if (!nr_partitions)
+ goto out_unlock;
+
+ part_write_streams = total_write_streams / nr_partitions;
+ xa_for_each_start(&disk->part_tbl, idx, part, 1) {
+ part->bd_part_write_streams = part_write_streams;
+ part->bd_part_write_stream_start = part_write_stream_start;
+ part_write_stream_start += part_write_streams;
+ dev_info(dev,
+ "assigning %u write streams at %u to partition %lu\n",
+ part_write_streams, part_write_stream_start, idx - 1);
+ }
+out_unlock:
+ mutex_unlock(&disk->open_mutex);
+ if (error)
+ return error;
+ return count;
+}
+
static DEVICE_ATTR(range, 0444, disk_range_show, NULL);
static DEVICE_ATTR(ext_range, 0444, disk_ext_range_show, NULL);
static DEVICE_ATTR(removable, 0444, disk_removable_show, NULL);
static DEVICE_ATTR(badblocks, 0644, disk_badblocks_show, disk_badblocks_store);
static DEVICE_ATTR(diskseq, 0444, diskseq_show, NULL);
static DEVICE_ATTR(partscan, 0444, partscan_show, NULL);
+static DEVICE_ATTR(distribute_write_streams, 0644,
+ disk_distribute_write_streams_show,
+ disk_distribute_write_streams_store);
#ifdef CONFIG_FAIL_MAKE_REQUEST
ssize_t part_fail_show(struct device *dev,
&dev_attr_events_poll_msecs.attr,
&dev_attr_diskseq.attr,
&dev_attr_partscan.attr,
+ &dev_attr_distribute_write_streams.attr,
#ifdef CONFIG_FAIL_MAKE_REQUEST
&dev_attr_fail.attr,
#endif