From 64c6a14dd2a61c27d06c84aed2327d4477854b0f Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Thu, 15 Nov 2018 12:44:17 -0500 Subject: [PATCH] queue zram-close-udev-startup-race-condition-as-default-gr.patch for 4.19 and 4.18 Signed-off-by: Sasha Levin --- queue-4.18/series | 1 + ...startup-race-condition-as-default-gr.patch | 97 +++++++++++++++++++ queue-4.19/series | 1 + ...startup-race-condition-as-default-gr.patch | 97 +++++++++++++++++++ 4 files changed, 196 insertions(+) create mode 100644 queue-4.18/zram-close-udev-startup-race-condition-as-default-gr.patch create mode 100644 queue-4.19/zram-close-udev-startup-race-condition-as-default-gr.patch diff --git a/queue-4.18/series b/queue-4.18/series index 1c9663a4b02..553dac77866 100644 --- a/queue-4.18/series +++ b/queue-4.18/series @@ -53,3 +53,4 @@ arm64-dts-stratix10-support-ethernet-jumbo-frame.patch arm64-dts-stratix10-fix-multicast-filtering.patch clk-meson-gxbb-set-fclk_div3-as-clk_is_critical.patch clk-meson-axg-mark-fdiv2-and-fdiv3-as-critical.patch +zram-close-udev-startup-race-condition-as-default-gr.patch diff --git a/queue-4.18/zram-close-udev-startup-race-condition-as-default-gr.patch b/queue-4.18/zram-close-udev-startup-race-condition-as-default-gr.patch new file mode 100644 index 00000000000..d204878c781 --- /dev/null +++ b/queue-4.18/zram-close-udev-startup-race-condition-as-default-gr.patch @@ -0,0 +1,97 @@ +From 03f158da137009ab41739dfa7c60579f61026070 Mon Sep 17 00:00:00 2001 +From: Minchan Kim +Date: Wed, 14 Nov 2018 14:52:23 +0900 +Subject: 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 +Cc: Hannes Reinecke +Tested-by: Howard Chen +Signed-off-by: Minchan Kim +Reviewed-by: Hannes Reinecke +Signed-off-by: Sasha Levin +--- + 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 af7cb8e618fe..363b9102ebb0 100644 +--- a/drivers/block/zram/zram_drv.c ++++ b/drivers/block/zram/zram_drv.c +@@ -1637,6 +1637,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. +@@ -1717,24 +1722,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: +@@ -1763,16 +1759,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.17.1 + diff --git a/queue-4.19/series b/queue-4.19/series index 0a31052209e..dac9817c672 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -70,3 +70,4 @@ arm64-dts-stratix10-support-ethernet-jumbo-frame.patch arm64-dts-stratix10-fix-multicast-filtering.patch clk-meson-gxbb-set-fclk_div3-as-clk_is_critical.patch clk-meson-axg-mark-fdiv2-and-fdiv3-as-critical.patch +zram-close-udev-startup-race-condition-as-default-gr.patch diff --git a/queue-4.19/zram-close-udev-startup-race-condition-as-default-gr.patch b/queue-4.19/zram-close-udev-startup-race-condition-as-default-gr.patch new file mode 100644 index 00000000000..ba2f5e94c42 --- /dev/null +++ b/queue-4.19/zram-close-udev-startup-race-condition-as-default-gr.patch @@ -0,0 +1,97 @@ +From a10aed8474f983d5c756be8ba504e126fc1596a6 Mon Sep 17 00:00:00 2001 +From: Minchan Kim +Date: Wed, 14 Nov 2018 14:52:23 +0900 +Subject: 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 +Cc: Hannes Reinecke +Tested-by: Howard Chen +Signed-off-by: Minchan Kim +Reviewed-by: Hannes Reinecke +Signed-off-by: Sasha Levin +--- + 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.17.1 + -- 2.47.2