2018-11-14 05:53:34

by Minchan Kim

[permalink] [raw]
Subject: [PATCH] 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

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(-)

diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
index a1d6b5597c17..66921427d109 100644
--- a/drivers/block/zram/zram_drv.c
+++ b/drivers/block/zram/zram_drv.c
@@ -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);
--
2.19.1.930.g4563a0d9d0-goog



2018-11-14 07:11:18

by Hannes Reinecke

[permalink] [raw]
Subject: Re: [PATCH] zram: close udev startup race condition as default groups

On 11/14/18 6:52 AM, Minchan Kim wrote:
> 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
>
> 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.

Reviewed-by: Hannes Reinecke <[email protected]>

Cheers,

Hannes
--
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)

2018-11-15 17:46:07

by Sasha Levin

[permalink] [raw]
Subject: Re: [PATCH] zram: close udev startup race condition as default groups

On Wed, Nov 14, 2018 at 02:52:23PM +0900, Minchan Kim wrote:
>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
>
>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

2018-11-16 15:51:09

by Minchan Kim

[permalink] [raw]
Subject: Re: [PATCH] zram: close udev startup race condition as default groups

On Thu, Nov 15, 2018 at 12:45:04PM -0500, Sasha Levin wrote:
> On Wed, Nov 14, 2018 at 02:52:23PM +0900, Minchan Kim wrote:
> > 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
> >
> > 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.

>
> --
> Thanks,
> Sasha

2018-11-24 08:01:07

by Minchan Kim

[permalink] [raw]
Subject: [PATCH] [PATCH for v4.4] 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

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(-)

diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
index 502406c9e6e1..616ee4f9c233 100644
--- a/drivers/block/zram/zram_drv.c
+++ b/drivers/block/zram/zram_drv.c
@@ -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);
--
2.20.0.rc0.387.gc7a69e6b6c-goog


2018-11-24 08:01:11

by Minchan Kim

[permalink] [raw]
Subject: [PATCH] [PATCH for v3.18] 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

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 | 18 ++++++------------
1 file changed, 6 insertions(+), 12 deletions(-)

diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
index 7e94459a489a..5f4e6a3c2dde 100644
--- a/drivers/block/zram/zram_drv.c
+++ b/drivers/block/zram/zram_drv.c
@@ -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);

--
2.20.0.rc0.387.gc7a69e6b6c-goog


2018-11-24 08:01:57

by Minchan Kim

[permalink] [raw]
Subject: [PATCH for v4.14] 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

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(-)

diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
index 1e2648e4c286..27b202c64c84 100644
--- a/drivers/block/zram/zram_drv.c
+++ b/drivers/block/zram/zram_drv.c
@@ -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);
--
2.20.0.rc0.387.gc7a69e6b6c-goog


2018-11-24 08:02:03

by Minchan Kim

[permalink] [raw]
Subject: [PATCH for 4.9] 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

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(-)

diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
index b7c0b69a02f5..d64a53d3270a 100644
--- a/drivers/block/zram/zram_drv.c
+++ b/drivers/block/zram/zram_drv.c
@@ -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);
--
2.20.0.rc0.387.gc7a69e6b6c-goog


2018-11-24 08:48:39

by Sasha Levin

[permalink] [raw]
Subject: Re: [PATCH for v4.14] zram: close udev startup race condition as default groups

On Fri, Nov 23, 2018 at 03:25:50PM +0900, Minchan Kim wrote:
>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
>
>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