提交 b6f60d28 编写于 作者: W Wenchao Hao 提交者: Cheng Jian

virtio-blk: modernize sysfs attribute creation

euleros/rtos inclusion
category: bugfix
bugzilla: NA

--------------------------------

Register default sysfs groups during device_add_disk() to avoid a
race condition with udev during startup.
Signed-off-by: NWenchao Hao <haowenchao@huawei.com>
Reviewed-by: NYufen Yu <yuyufen@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
Signed-off-by: NCheng Jian <cj.chengjian@huawei.com>
上级 4abd2c44
...@@ -423,7 +423,7 @@ static int minor_to_index(int minor) ...@@ -423,7 +423,7 @@ static int minor_to_index(int minor)
return minor >> PART_BITS; return minor >> PART_BITS;
} }
static ssize_t virtblk_serial_show(struct device *dev, static ssize_t serial_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct gendisk *disk = dev_to_disk(dev); struct gendisk *disk = dev_to_disk(dev);
...@@ -443,7 +443,7 @@ static ssize_t virtblk_serial_show(struct device *dev, ...@@ -443,7 +443,7 @@ static ssize_t virtblk_serial_show(struct device *dev,
return err; return err;
} }
static DEVICE_ATTR(serial, 0444, virtblk_serial_show, NULL); static DEVICE_ATTR_RO(serial);
/* The queue's logical block size must be set before calling this */ /* The queue's logical block size must be set before calling this */
static void virtblk_update_capacity(struct virtio_blk *vblk, bool resize) static void virtblk_update_capacity(struct virtio_blk *vblk, bool resize)
...@@ -619,7 +619,7 @@ static const char *const virtblk_cache_types[] = { ...@@ -619,7 +619,7 @@ static const char *const virtblk_cache_types[] = {
}; };
static ssize_t static ssize_t
virtblk_cache_type_store(struct device *dev, struct device_attribute *attr, cache_type_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct gendisk *disk = dev_to_disk(dev); struct gendisk *disk = dev_to_disk(dev);
...@@ -638,8 +638,7 @@ virtblk_cache_type_store(struct device *dev, struct device_attribute *attr, ...@@ -638,8 +638,7 @@ virtblk_cache_type_store(struct device *dev, struct device_attribute *attr,
} }
static ssize_t static ssize_t
virtblk_cache_type_show(struct device *dev, struct device_attribute *attr, cache_type_show(struct device *dev, struct device_attribute *attr, char *buf)
char *buf)
{ {
struct gendisk *disk = dev_to_disk(dev); struct gendisk *disk = dev_to_disk(dev);
struct virtio_blk *vblk = disk->private_data; struct virtio_blk *vblk = disk->private_data;
...@@ -649,12 +648,38 @@ virtblk_cache_type_show(struct device *dev, struct device_attribute *attr, ...@@ -649,12 +648,38 @@ virtblk_cache_type_show(struct device *dev, struct device_attribute *attr,
return snprintf(buf, 40, "%s\n", virtblk_cache_types[writeback]); return snprintf(buf, 40, "%s\n", virtblk_cache_types[writeback]);
} }
static const struct device_attribute dev_attr_cache_type_ro = static DEVICE_ATTR_RW(cache_type);
__ATTR(cache_type, 0444,
virtblk_cache_type_show, NULL); static struct attribute *virtblk_attrs[] = {
static const struct device_attribute dev_attr_cache_type_rw = &dev_attr_serial.attr,
__ATTR(cache_type, 0644, &dev_attr_cache_type.attr,
virtblk_cache_type_show, virtblk_cache_type_store); NULL,
};
static umode_t virtblk_attrs_are_visible(struct kobject *kobj,
struct attribute *a, int n)
{
struct device *dev = container_of(kobj, struct device, kobj);
struct gendisk *disk = dev_to_disk(dev);
struct virtio_blk *vblk = disk->private_data;
struct virtio_device *vdev = vblk->vdev;
if (a == &dev_attr_cache_type.attr &&
!virtio_has_feature(vdev, VIRTIO_BLK_F_CONFIG_WCE))
return S_IRUGO;
return a->mode;
}
static const struct attribute_group virtblk_attr_group = {
.attrs = virtblk_attrs,
.is_visible = virtblk_attrs_are_visible,
};
static const struct attribute_group *virtblk_attr_groups[] = {
&virtblk_attr_group,
NULL,
};
static int virtblk_init_request(struct blk_mq_tag_set *set, struct request *rq, static int virtblk_init_request(struct blk_mq_tag_set *set, struct request *rq,
unsigned int hctx_idx, unsigned int numa_node) unsigned int hctx_idx, unsigned int numa_node)
...@@ -858,24 +883,10 @@ static int virtblk_probe(struct virtio_device *vdev) ...@@ -858,24 +883,10 @@ static int virtblk_probe(struct virtio_device *vdev)
virtblk_update_capacity(vblk, false); virtblk_update_capacity(vblk, false);
virtio_device_ready(vdev); virtio_device_ready(vdev);
disk_to_dev(vblk->disk)->groups = virtblk_attr_groups;
device_add_disk(&vdev->dev, vblk->disk); device_add_disk(&vdev->dev, vblk->disk);
err = device_create_file(disk_to_dev(vblk->disk), &dev_attr_serial);
if (err)
goto out_del_disk;
if (virtio_has_feature(vdev, VIRTIO_BLK_F_CONFIG_WCE))
err = device_create_file(disk_to_dev(vblk->disk),
&dev_attr_cache_type_rw);
else
err = device_create_file(disk_to_dev(vblk->disk),
&dev_attr_cache_type_ro);
if (err)
goto out_del_disk;
return 0; return 0;
out_del_disk:
del_gendisk(vblk->disk);
blk_cleanup_queue(vblk->disk->queue);
out_free_tags: out_free_tags:
blk_mq_free_tag_set(&vblk->tag_set); blk_mq_free_tag_set(&vblk->tag_set);
out_put_disk: out_put_disk:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册