zram: close udev startup race condition as default groups
Subsystems (3)
Minchan Kim
maintainerPATCH 1/1 zram: close udev startup race condition as default groups
commit fef912bf860e upstream.
commit 98af4d4df889 upstream.
I got a report from Howard Chen that he saw zram and sysfs race(ie, zram block device file is created but sysfs for it isn't yet) when he tried to create new zram devices via hotadd knob.
v4.20 kernel fixes it by [1, 2] but it's too large size to merge into -stable so this patch fixes the problem by registering defualt group by Greg KH's approach[3].
This patch should be applied to every stable tree [3.16+] currently existing from kernel.org because the problem was introduced at 2.6.37 by [4].
[1] fef912bf860e, block: genhd: add 'groups' argument to device_add_disk
[2] 98af4d4df889, zram: register default groups with device_add_disk()
[3] http://kroah.com/log/blog/2013/06/26/how-to-create-a-sysfs-file-correctly/
[4] 33863c21e69e9, Staging: zram: Replace ioctls with sysfs interface
--- drivers/block/zram/zram_drv.c | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-)
drivers/block/zram/zram_drv.c +6 -20
@@ -1636,6 +1636,11 @@ static const struct attribute_group zram_disk_attr_group = { .attrs = zram_disk_attrs, }; +static const struct attribute_group *zram_disk_attr_groups[] = { + &zram_disk_attr_group, +NULL , +}; +/* * Allocate and initialize new zram device. the function returns * '>= 0' device_id upon success, and negative value otherwise.
@@ -1716,24 +1721,15 @@ static int zram_add(void) zram->disk->queue->backing_dev_info->capabilities |= (BDI_CAP_STABLE_WRITES |BDI_CAP_SYNCHRONOUS_IO ); +disk_to_dev (zram->disk)->groups = zram_disk_attr_groups;add_disk (zram->disk); - ret =sysfs_create_group (&disk_to_dev (zram->disk)->kobj, - &zram_disk_attr_group); -if (ret <0 ) { -pr_err ("Error creating sysfs group for device %d\n" , - device_id); - goto out_free_disk; - }strlcpy (zram->compressor, default_compressor,sizeof (zram->compressor));zram_debugfs_register (zram);pr_info ("Added device: %s\n" , zram->disk->disk_name);return device_id; -out_free_disk: -del_gendisk (zram->disk); -put_disk (zram->disk); out_free_queue:blk_cleanup_queue (queue); out_free_idr:
@@ -1762,16 +1758,6 @@ static int zram_remove(struct zram *zram)mutex_unlock (&bdev->bd_mutex);zram_debugfs_unregister (zram); -/* -* Remove sysfs first, so no one will perform a disksize -* store while we destroy the devices. This also helps during -* hot_remove -- zram_reset_device() is the last holder of -* ->init_lock, no later/concurrent disksize_store() or any -* other sysfs handlers are possible. -*/ -sysfs_remove_group (&disk_to_dev (zram->disk)->kobj, - &zram_disk_attr_group); -/* Make sure all the pending I/O are finished */ fsync_bdev (bdev);zram_reset_device (zram);
Signature · 1 line
2.19.1.930.g4563a0d9d0-goog
Quoted 20 lines · Minchan Kim
commit
fef912bf860eupstream.
commit98af4d4df889upstream.I got a report from Howard Chen that he saw zram and sysfs
race(ie, zram block device file is created but sysfs for it isn't yet)when he tried to create new zram devices via hotadd knob.v4.20 kernel fixes it by [1, 2] but it's too large size to merge into -stable so this patch fixes the problem by registering defualt group by Greg KH's approach[3].
This patch should be applied to every stable tree [3.16+] currently existing from kernel.org because the problem was introduced at 2.6.37 by [4].
[1]
fef912bf860e, block: genhd: add 'groups' argument todevice_add_disk
[2]98af4d4df889, zram: register default groups withdevice_add_disk()
[3] http://kroah.com/log/blog/2013/06/26/how-to-create-a-sysfs-file-correctly/
[4]33863c21e69e9, Staging: zram: Replace ioctls with sysfs interface
Quoted 8 lines
Cc Sergey Senozhatsky <[email protected]>Cc Hannes Reinecke <[email protected]>Tested-by Howard Chen <[email protected]>Signed-off-by Minchan Kim <[email protected]>--- drivers/block/zram/zram_drv.c | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-)
Actually, I have a similar patch for NVMe in older revisions, so maybe I should push it to -stable, too.
Cheers,
Hannes
Signature · 5 lines
Dr. Hannes Reinecke zSeries & Storage [email protected] +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: F. Imendörffer, J. Smithard, D. Upmanyu, G. Norton HRB 21284 (AG Nürnberg)
Quoted 20 lines · Minchan Kim
commit
fef912bf860eupstream.
commit98af4d4df889upstream.I got a report from Howard Chen that he saw zram and sysfs
race(ie, zram block device file is created but sysfs for it isn't yet)when he tried to create new zram devices via hotadd knob.v4.20 kernel fixes it by [1, 2] but it's too large size to merge into -stable so this patch fixes the problem by registering defualt group by Greg KH's approach[3].
This patch should be applied to every stable tree [3.16+] currently existing from kernel.org because the problem was introduced at 2.6.37 by [4].
[1]
fef912bf860e, block: genhd: add 'groups' argument todevice_add_disk
[2]98af4d4df889, zram: register default groups withdevice_add_disk()
[3] http://kroah.com/log/blog/2013/06/26/how-to-create-a-sysfs-file-correctly/
[4]33863c21e69e9, Staging: zram: Replace ioctls with sysfs interface
Quoted 4 lines
Cc Sergey Senozhatsky <[email protected]>Cc Hannes Reinecke <[email protected]>Tested-by Howard Chen <[email protected]>Signed-off-by Minchan Kim <[email protected]>
I've queued this for 4.19 and 4.18, but it doesn't apply to anything older than that.
--
Thanks,
Sasha
Minchan Kim
maintainerQuoted 21 lines · Sasha Levin
Quoted 20 lines · Minchan Kim
commit
fef912bf860eupstream.
commit98af4d4df889upstream.I got a report from Howard Chen that he saw zram and sysfs
race(ie, zram block device file is created but sysfs for it isn't yet)when he tried to create new zram devices via hotadd knob.v4.20 kernel fixes it by [1, 2] but it's too large size to merge into -stable so this patch fixes the problem by registering defualt group by Greg KH's approach[3].
This patch should be applied to every stable tree [3.16+] currently existing from kernel.org because the problem was introduced at 2.6.37 by [4].
[1]
fef912bf860e, block: genhd: add 'groups' argument todevice_add_disk
[2]98af4d4df889, zram: register default groups withdevice_add_disk()
[3] http://kroah.com/log/blog/2013/06/26/how-to-create-a-sysfs-file-correctly/
[4]33863c21e69e9, Staging: zram: Replace ioctls with sysfs interface
Quoted 7 lines
Quoted 4 lines
Cc Sergey Senozhatsky <[email protected]>Cc Hannes Reinecke <[email protected]>Tested-by Howard Chen <[email protected]>Signed-off-by Minchan Kim <[email protected]>I've queued this for 4.19 and 4.18, but it doesn't apply to anything older than that.
Thanks for the review, Hannes.
Sasha, I will send separate patches for older stable kernel. Thanks for picking the patch.
Quoted 4 lines
--
Thanks,
Sasha
Minchan Kim
maintainerPATCH 1/1 zram: close udev startup race condition as default groups
In reply to Sasha Levincommit fef912bf860e upstream.
commit 98af4d4df889 upstream.
I got a report from Howard Chen that he saw zram and sysfs race(ie, zram block device file is created but sysfs for it isn't yet) when he tried to create new zram devices via hotadd knob.
v4.20 kernel fixes it by [1, 2] but it's too large size to merge into -stable so this patch fixes the problem by registering defualt group by Greg KH's approach[3].
This patch should be applied to every stable tree [3.16+] currently existing from kernel.org because the problem was introduced at 2.6.37 by [4].
[1] fef912bf860e, block: genhd: add 'groups' argument to device_add_disk
[2] 98af4d4df889, zram: register default groups with device_add_disk()
[3] http://kroah.com/log/blog/2013/06/26/how-to-create-a-sysfs-file-correctly/
[4] 33863c21e69e9, Staging: zram: Replace ioctls with sysfs interface
--- drivers/block/zram/zram_drv.c | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-)
drivers/block/zram/zram_drv.c +6 -20
@@ -1491,6 +1491,11 @@ static const struct attribute_group zram_disk_attr_group = { .attrs = zram_disk_attrs, }; +static const struct attribute_group *zram_disk_attr_groups[] = { + &zram_disk_attr_group, +NULL , +}; +/* * Allocate and initialize new zram device. the function returns * '>= 0' device_id upon success, and negative value otherwise.
@@ -1568,23 +1573,14 @@ static int zram_add(void)if (ZRAM_LOGICAL_BLOCK_SIZE ==PAGE_SIZE )blk_queue_max_write_zeroes_sectors (zram->disk->queue,UINT_MAX ); +disk_to_dev (zram->disk)->groups = zram_disk_attr_groups;add_disk (zram->disk); - ret =sysfs_create_group (&disk_to_dev (zram->disk)->kobj, - &zram_disk_attr_group); -if (ret <0 ) { -pr_err ("Error creating sysfs group for device %d\n" , - device_id); - goto out_free_disk; - }strlcpy (zram->compressor, default_compressor,sizeof (zram->compressor));pr_info ("Added device: %s\n" , zram->disk->disk_name);return device_id; -out_free_disk: -del_gendisk (zram->disk); -put_disk (zram->disk); out_free_queue:blk_cleanup_queue (queue); out_free_idr:
@@ -1612,16 +1608,6 @@ static int zram_remove(struct zram *zram) zram->claim = true;mutex_unlock (&bdev->bd_mutex); -/* -* Remove sysfs first, so no one will perform a disksize -* store while we destroy the devices. This also helps during -* hot_remove -- zram_reset_device() is the last holder of -* ->init_lock, no later/concurrent disksize_store() or any -* other sysfs handlers are possible. -*/ -sysfs_remove_group (&disk_to_dev (zram->disk)->kobj, - &zram_disk_attr_group); -/* Make sure all the pending I/O are finished */ fsync_bdev (bdev);zram_reset_device (zram);
Signature · 1 line
2.20.0.rc0.387.gc7a69e6b6c-goog
Minchan Kim
maintainerPATCH 1/1 zram: close udev startup race condition as default groups
In reply to Sasha Levincommit fef912bf860e upstream.
commit 98af4d4df889 upstream.
I got a report from Howard Chen that he saw zram and sysfs race(ie, zram block device file is created but sysfs for it isn't yet) when he tried to create new zram devices via hotadd knob.
v4.20 kernel fixes it by [1, 2] but it's too large size to merge into -stable so this patch fixes the problem by registering defualt group by Greg KH's approach[3].
This patch should be applied to every stable tree [3.16+] currently existing from kernel.org because the problem was introduced at 2.6.37 by [4].
[1] fef912bf860e, block: genhd: add 'groups' argument to device_add_disk
[2] 98af4d4df889, zram: register default groups with device_add_disk()
[3] http://kroah.com/log/blog/2013/06/26/how-to-create-a-sysfs-file-correctly/
[4] 33863c21e69e9, Staging: zram: Replace ioctls with sysfs interface
--- drivers/block/zram/zram_drv.c | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-)
drivers/block/zram/zram_drv.c +6 -20
@@ -1223,6 +1223,11 @@ static struct attribute_group zram_disk_attr_group = { .attrs = zram_disk_attrs, }; +static const struct attribute_group *zram_disk_attr_groups[] = { + &zram_disk_attr_group, +NULL , +}; +/* * Allocate and initialize new zram device. the function returns * '>= 0' device_id upon success, and negative value otherwise.
@@ -1303,24 +1308,15 @@ static int zram_add(void) zram->disk->queue->limits.discard_zeroes_data =0 ;queue_flag_set_unlocked (QUEUE_FLAG_DISCARD , zram->disk->queue); +disk_to_dev (zram->disk)->groups = zram_disk_attr_groups;add_disk (zram->disk); - ret =sysfs_create_group (&disk_to_dev (zram->disk)->kobj, - &zram_disk_attr_group); -if (ret <0 ) { -pr_err ("Error creating sysfs group for device %d\n" , - device_id); - goto out_free_disk; - }strlcpy (zram->compressor, default_compressor,sizeof (zram->compressor)); zram->meta =NULL ;pr_info ("Added device: %s\n" , zram->disk->disk_name);return device_id; -out_free_disk: -del_gendisk (zram->disk); -put_disk (zram->disk); out_free_queue:blk_cleanup_queue (queue); out_free_idr:
@@ -1348,16 +1344,6 @@ static int zram_remove(struct zram *zram) zram->claim = true;mutex_unlock (&bdev->bd_mutex); -/* -* Remove sysfs first, so no one will perform a disksize -* store while we destroy the devices. This also helps during -* hot_remove -- zram_reset_device() is the last holder of -* ->init_lock, no later/concurrent disksize_store() or any -* other sysfs handlers are possible. -*/ -sysfs_remove_group (&disk_to_dev (zram->disk)->kobj, - &zram_disk_attr_group); -/* Make sure all the pending I/O are finished */ fsync_bdev (bdev);zram_reset_device (zram);
Signature · 1 line
2.20.0.rc0.387.gc7a69e6b6c-goog
Minchan Kim
maintainerPATCH 1/1 zram: close udev startup race condition as default groups
In reply to Sasha Levincommit fef912bf860e upstream.
commit 98af4d4df889 upstream.
I got a report from Howard Chen that he saw zram and sysfs race(ie, zram block device file is created but sysfs for it isn't yet) when he tried to create new zram devices via hotadd knob.
v4.20 kernel fixes it by [1, 2] but it's too large size to merge into -stable so this patch fixes the problem by registering defualt group by Greg KH's approach[3].
This patch should be applied to every stable tree [3.16+] currently existing from kernel.org because the problem was introduced at 2.6.37 by [4].
[1] fef912bf860e, block: genhd: add 'groups' argument to device_add_disk
[2] 98af4d4df889, zram: register default groups with device_add_disk()
[3] http://kroah.com/log/blog/2013/06/26/how-to-create-a-sysfs-file-correctly/
[4] 33863c21e69e9, Staging: zram: Replace ioctls with sysfs interface
--- drivers/block/zram/zram_drv.c | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-)
drivers/block/zram/zram_drv.c +6 -20
@@ -1184,6 +1184,11 @@ static struct attribute_group zram_disk_attr_group = { .attrs = zram_disk_attrs, }; +static const struct attribute_group *zram_disk_attr_groups[] = { + &zram_disk_attr_group, +NULL , +}; +/* * Allocate and initialize new zram device. the function returns * '>= 0' device_id upon success, and negative value otherwise.
@@ -1264,15 +1269,9 @@ static int zram_add(void) zram->disk->queue->limits.discard_zeroes_data =0 ;queue_flag_set_unlocked (QUEUE_FLAG_DISCARD , zram->disk->queue); +disk_to_dev (zram->disk)->groups = zram_disk_attr_groups;add_disk (zram->disk); - ret =sysfs_create_group (&disk_to_dev (zram->disk)->kobj, - &zram_disk_attr_group); -if (ret <0 ) { -pr_err ("Error creating sysfs group for device %d\n" , - device_id); - goto out_free_disk; - }strlcpy (zram->compressor, default_compressor,sizeof (zram->compressor)); zram->meta =NULL ; zram->max_comp_streams =1 ;
@@ -1280,9 +1279,6 @@ static int zram_add(void)pr_info ("Added device: %s\n" , zram->disk->disk_name);return device_id; -out_free_disk: -del_gendisk (zram->disk); -put_disk (zram->disk); out_free_queue:blk_cleanup_queue (queue); out_free_idr:
@@ -1310,16 +1306,6 @@ static int zram_remove(struct zram *zram) zram->claim = true;mutex_unlock (&bdev->bd_mutex); -/* -* Remove sysfs first, so no one will perform a disksize -* store while we destroy the devices. This also helps during -* hot_remove -- zram_reset_device() is the last holder of -* ->init_lock, no later/concurrent disksize_store() or any -* other sysfs handlers are possible. -*/ -sysfs_remove_group (&disk_to_dev (zram->disk)->kobj, - &zram_disk_attr_group); -/* Make sure all the pending I/O are finished */ fsync_bdev (bdev);zram_reset_device (zram);
Signature · 1 line
2.20.0.rc0.387.gc7a69e6b6c-goog
Minchan Kim
maintainerPATCH 1/1 zram: close udev startup race condition as default groups
In reply to Sasha Levincommit fef912bf860e upstream.
commit 98af4d4df889 upstream.
I got a report from Howard Chen that he saw zram and sysfs race(ie, zram block device file is created but sysfs for it isn't yet) when he tried to create new zram devices via hotadd knob.
v4.20 kernel fixes it by [1, 2] but it's too large size to merge into -stable so this patch fixes the problem by registering defualt group by Greg KH's approach[3].
This patch should be applied to every stable tree [3.16+] currently existing from kernel.org because the problem was introduced at 2.6.37 by [4].
[1] fef912bf860e, block: genhd: add 'groups' argument to device_add_disk
[2] 98af4d4df889, zram: register default groups with device_add_disk()
[3] http://kroah.com/log/blog/2013/06/26/how-to-create-a-sysfs-file-correctly/
[4] 33863c21e69e9, Staging: zram: Replace ioctls with sysfs interface
--- drivers/block/zram/zram_drv.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-)
drivers/block/zram/zram_drv.c +6 -12
@@ -999,6 +999,11 @@ static struct attribute_group zram_disk_attr_group = { .attrs = zram_disk_attrs, }; +static const struct attribute_group *zram_disk_attr_groups[] = { + &zram_disk_attr_group, +NULL , +}; +static int create_device (struct zram *zram,int device_id) {int ret = -ENOMEM ;
@@ -1060,22 +1065,14 @@ static int create_device(struct zram *zram, int device_id) zram->disk->queue->limits.discard_zeroes_data =0 ;queue_flag_set_unlocked (QUEUE_FLAG_DISCARD , zram->disk->queue); +disk_to_dev (zram->disk)->groups = zram_disk_attr_groups;add_disk (zram->disk); - ret =sysfs_create_group (&disk_to_dev (zram->disk)->kobj, - &zram_disk_attr_group); -if (ret <0 ) { -pr_warn ("Error creating sysfs group" ); - goto out_free_disk; - }strlcpy (zram->compressor, default_compressor,sizeof (zram->compressor)); zram->meta =NULL ; zram->max_comp_streams =1 ;return 0 ; -out_free_disk: -del_gendisk (zram->disk); -put_disk (zram->disk); out_free_queue:blk_cleanup_queue (zram->queue); out:
@@ -1084,9 +1081,6 @@ static int create_device(struct zram *zram, int device_id)static void destroy_device (struct zram *zram) { -sysfs_remove_group (&disk_to_dev (zram->disk)->kobj, - &zram_disk_attr_group); -del_gendisk (zram->disk);put_disk (zram->disk);
Signature · 1 line
2.20.0.rc0.387.gc7a69e6b6c-goog
Quoted 20 lines · Minchan Kim
commit
fef912bf860eupstream.
commit98af4d4df889upstream.I got a report from Howard Chen that he saw zram and sysfs
race(ie, zram block device file is created but sysfs for it isn't yet)when he tried to create new zram devices via hotadd knob.v4.20 kernel fixes it by [1, 2] but it's too large size to merge into -stable so this patch fixes the problem by registering defualt group by Greg KH's approach[3].
This patch should be applied to every stable tree [3.16+] currently existing from kernel.org because the problem was introduced at 2.6.37 by [4].
[1]
fef912bf860e, block: genhd: add 'groups' argument todevice_add_disk
[2]98af4d4df889, zram: register default groups withdevice_add_disk()
[3] http://kroah.com/log/blog/2013/06/26/how-to-create-a-sysfs-file-correctly/
[4]33863c21e69e9, Staging: zram: Replace ioctls with sysfs interface
Quoted 4 lines
Cc Sergey Senozhatsky <[email protected]>Cc Hannes Reinecke <[email protected]>Tested-by Howard Chen <[email protected]>Signed-off-by Minchan Kim <[email protected]>
I've queued all 4 to their respective branches, thank you.
--
Thanks,
Sasha