]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
queue zram-close-udev-startup-race-condition-as-default-gr.patch for 4.19 and 4.18
authorSasha Levin <sashal@kernel.org>
Thu, 15 Nov 2018 17:44:17 +0000 (12:44 -0500)
committerSasha Levin <sashal@kernel.org>
Thu, 15 Nov 2018 17:44:17 +0000 (12:44 -0500)
Signed-off-by: Sasha Levin <sashal@kernel.org>
queue-4.18/series
queue-4.18/zram-close-udev-startup-race-condition-as-default-gr.patch [new file with mode: 0644]
queue-4.19/series
queue-4.19/zram-close-udev-startup-race-condition-as-default-gr.patch [new file with mode: 0644]

index 1c9663a4b0212deb81ccf9b0d1a62c1c12e7f52b..553dac778663af3849e52af6abc695bfafe29e89 100644 (file)
@@ -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 (file)
index 0000000..d204878
--- /dev/null
@@ -0,0 +1,97 @@
+From 03f158da137009ab41739dfa7c60579f61026070 Mon Sep 17 00:00:00 2001
+From: Minchan Kim <minchan@kernel.org>
+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 <sergey.senozhatsky@gmail.com>
+Cc: Hannes Reinecke <hare@suse.com>
+Tested-by: Howard Chen <howardsoc@google.com>
+Signed-off-by: Minchan Kim <minchan@kernel.org>
+Reviewed-by: Hannes Reinecke <hare@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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
+
index 0a31052209ea3e2f10eb9eb7c4beaf60da0c6786..dac9817c67246a9ad9268ba4b2a481e7506ea64a 100644 (file)
@@ -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 (file)
index 0000000..ba2f5e9
--- /dev/null
@@ -0,0 +1,97 @@
+From a10aed8474f983d5c756be8ba504e126fc1596a6 Mon Sep 17 00:00:00 2001
+From: Minchan Kim <minchan@kernel.org>
+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 <sergey.senozhatsky@gmail.com>
+Cc: Hannes Reinecke <hare@suse.com>
+Tested-by: Howard Chen <howardsoc@google.com>
+Signed-off-by: Minchan Kim <minchan@kernel.org>
+Reviewed-by: Hannes Reinecke <hare@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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
+