All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 00/13] block: add_disk() error handling stragglers
@ 2021-11-03 12:21 ` Luis Chamberlain
  0 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

This is the last pending changes to address add_disk() error handling
completely. Changes on this v2 series:

  o dropped all patches which folks have said they'd pick up on their
    own trees or that I already see present on linux-next
  o rebased onto next-20211103
  o Added Reviewed-by tag by Dan Williams and addressed his recommended
    changes.
  o Re-added the nvdimm/blk changes given Dan Williams was not able to
    remove the driver in time for v5.16
  o Added new nvdimm/pmem driver changes, not sure how I missed addressing
    this before.
  o Just note that I keep Tetsuo Handa's patch in this series as it is
    a requirement for the __register_blkdev() changes.

You can find all these changes on my git tree:

https://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux-next.git/log/?h=20211103-for-axboe-add-disk-error-handling

Luis Chamberlain (12):
  nvdimm/btt: do not call del_gendisk() if not needed
  nvdimm/btt: use goto error labels on btt_blk_init()
  nvdimm/btt: add error handling support for add_disk()
  nvdimm/blk: avoid calling del_gendisk() on early failures
  nvdimm/blk: add error handling support for add_disk()
  nvdimm/pmem: cleanup the disk if pmem_release_disk() is yet assigned
  nvdimm/pmem: use add_disk() error handling
  z2ram: add error handling support for add_disk()
  block/sunvdc: add error handling support for add_disk()
  mtd/ubi/block: add error handling support for add_disk()
  block: make __register_blkdev() return an error
  block: add __must_check for *add_disk*() callers

Tetsuo Handa (1):
  ataflop: remove ataflop_probe_lock mutex

 block/bdev.c            |  5 +++-
 block/genhd.c           | 27 +++++++++++------
 drivers/block/ataflop.c | 66 +++++++++++++++++++++++++----------------
 drivers/block/brd.c     |  7 +++--
 drivers/block/floppy.c  | 17 ++++++++---
 drivers/block/loop.c    | 11 +++++--
 drivers/block/sunvdc.c  | 14 +++++++--
 drivers/block/z2ram.c   |  7 +++--
 drivers/md/md.c         | 12 ++++++--
 drivers/mtd/ubi/block.c |  8 ++++-
 drivers/nvdimm/blk.c    | 21 +++++++++----
 drivers/nvdimm/btt.c    | 21 ++++++++-----
 drivers/nvdimm/pmem.c   | 21 +++++++++----
 drivers/scsi/sd.c       |  3 +-
 include/linux/genhd.h   | 10 +++----
 15 files changed, 172 insertions(+), 78 deletions(-)

-- 
2.33.0


^ permalink raw reply	[flat|nested] 62+ messages in thread

* [PATCH v2 00/13] block: add_disk() error handling stragglers
@ 2021-11-03 12:21 ` Luis Chamberlain
  0 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

This is the last pending changes to address add_disk() error handling
completely. Changes on this v2 series:

  o dropped all patches which folks have said they'd pick up on their
    own trees or that I already see present on linux-next
  o rebased onto next-20211103
  o Added Reviewed-by tag by Dan Williams and addressed his recommended
    changes.
  o Re-added the nvdimm/blk changes given Dan Williams was not able to
    remove the driver in time for v5.16
  o Added new nvdimm/pmem driver changes, not sure how I missed addressing
    this before.
  o Just note that I keep Tetsuo Handa's patch in this series as it is
    a requirement for the __register_blkdev() changes.

You can find all these changes on my git tree:

https://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux-next.git/log/?h=20211103-for-axboe-add-disk-error-handling

Luis Chamberlain (12):
  nvdimm/btt: do not call del_gendisk() if not needed
  nvdimm/btt: use goto error labels on btt_blk_init()
  nvdimm/btt: add error handling support for add_disk()
  nvdimm/blk: avoid calling del_gendisk() on early failures
  nvdimm/blk: add error handling support for add_disk()
  nvdimm/pmem: cleanup the disk if pmem_release_disk() is yet assigned
  nvdimm/pmem: use add_disk() error handling
  z2ram: add error handling support for add_disk()
  block/sunvdc: add error handling support for add_disk()
  mtd/ubi/block: add error handling support for add_disk()
  block: make __register_blkdev() return an error
  block: add __must_check for *add_disk*() callers

Tetsuo Handa (1):
  ataflop: remove ataflop_probe_lock mutex

 block/bdev.c            |  5 +++-
 block/genhd.c           | 27 +++++++++++------
 drivers/block/ataflop.c | 66 +++++++++++++++++++++++++----------------
 drivers/block/brd.c     |  7 +++--
 drivers/block/floppy.c  | 17 ++++++++---
 drivers/block/loop.c    | 11 +++++--
 drivers/block/sunvdc.c  | 14 +++++++--
 drivers/block/z2ram.c   |  7 +++--
 drivers/md/md.c         | 12 ++++++--
 drivers/mtd/ubi/block.c |  8 ++++-
 drivers/nvdimm/blk.c    | 21 +++++++++----
 drivers/nvdimm/btt.c    | 21 ++++++++-----
 drivers/nvdimm/pmem.c   | 21 +++++++++----
 drivers/scsi/sd.c       |  3 +-
 include/linux/genhd.h   | 10 +++----
 15 files changed, 172 insertions(+), 78 deletions(-)

-- 
2.33.0


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply	[flat|nested] 62+ messages in thread

* [PATCH v2 01/13] nvdimm/btt: do not call del_gendisk() if not needed
  2021-11-03 12:21 ` Luis Chamberlain
@ 2021-11-03 12:21   ` Luis Chamberlain
  -1 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

del_gendisk() is not required if the disk has not been added.
On kernels prior to commit 40b3a52ffc5bc3 ("block: add a sanity
check for a live disk in del_gendisk") it is mandatory to not
call del_gendisk() if the underlying device has not been through
device_add().

Fixes: 41cd8b70c37a ("libnvdimm, btt: add support for blk integrity")
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 drivers/nvdimm/btt.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
index f10a50ffa047..a62f23b945f1 100644
--- a/drivers/nvdimm/btt.c
+++ b/drivers/nvdimm/btt.c
@@ -1537,7 +1537,6 @@ static int btt_blk_init(struct btt *btt)
 		int rc = nd_integrity_init(btt->btt_disk, btt_meta_size(btt));
 
 		if (rc) {
-			del_gendisk(btt->btt_disk);
 			blk_cleanup_disk(btt->btt_disk);
 			return rc;
 		}
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 01/13] nvdimm/btt: do not call del_gendisk() if not needed
@ 2021-11-03 12:21   ` Luis Chamberlain
  0 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

del_gendisk() is not required if the disk has not been added.
On kernels prior to commit 40b3a52ffc5bc3 ("block: add a sanity
check for a live disk in del_gendisk") it is mandatory to not
call del_gendisk() if the underlying device has not been through
device_add().

Fixes: 41cd8b70c37a ("libnvdimm, btt: add support for blk integrity")
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 drivers/nvdimm/btt.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
index f10a50ffa047..a62f23b945f1 100644
--- a/drivers/nvdimm/btt.c
+++ b/drivers/nvdimm/btt.c
@@ -1537,7 +1537,6 @@ static int btt_blk_init(struct btt *btt)
 		int rc = nd_integrity_init(btt->btt_disk, btt_meta_size(btt));
 
 		if (rc) {
-			del_gendisk(btt->btt_disk);
 			blk_cleanup_disk(btt->btt_disk);
 			return rc;
 		}
-- 
2.33.0


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 02/13] nvdimm/btt: use goto error labels on btt_blk_init()
  2021-11-03 12:21 ` Luis Chamberlain
@ 2021-11-03 12:21   ` Luis Chamberlain
  -1 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

This will make it easier to share common error paths.

Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 drivers/nvdimm/btt.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
index a62f23b945f1..416d31cda3e7 100644
--- a/drivers/nvdimm/btt.c
+++ b/drivers/nvdimm/btt.c
@@ -1519,6 +1519,7 @@ static int btt_blk_init(struct btt *btt)
 {
 	struct nd_btt *nd_btt = btt->nd_btt;
 	struct nd_namespace_common *ndns = nd_btt->ndns;
+	int rc = -ENOMEM;
 
 	btt->btt_disk = blk_alloc_disk(NUMA_NO_NODE);
 	if (!btt->btt_disk)
@@ -1534,19 +1535,22 @@ static int btt_blk_init(struct btt *btt)
 	blk_queue_flag_set(QUEUE_FLAG_NONROT, btt->btt_disk->queue);
 
 	if (btt_meta_size(btt)) {
-		int rc = nd_integrity_init(btt->btt_disk, btt_meta_size(btt));
-
-		if (rc) {
-			blk_cleanup_disk(btt->btt_disk);
-			return rc;
-		}
+		rc = nd_integrity_init(btt->btt_disk, btt_meta_size(btt));
+		if (rc)
+			goto out_cleanup_disk;
 	}
+
 	set_capacity(btt->btt_disk, btt->nlba * btt->sector_size >> 9);
 	device_add_disk(&btt->nd_btt->dev, btt->btt_disk, NULL);
+
 	btt->nd_btt->size = btt->nlba * (u64)btt->sector_size;
 	nvdimm_check_and_set_ro(btt->btt_disk);
 
 	return 0;
+
+out_cleanup_disk:
+	blk_cleanup_disk(btt->btt_disk);
+	return rc;
 }
 
 static void btt_blk_cleanup(struct btt *btt)
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 02/13] nvdimm/btt: use goto error labels on btt_blk_init()
@ 2021-11-03 12:21   ` Luis Chamberlain
  0 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

This will make it easier to share common error paths.

Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 drivers/nvdimm/btt.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
index a62f23b945f1..416d31cda3e7 100644
--- a/drivers/nvdimm/btt.c
+++ b/drivers/nvdimm/btt.c
@@ -1519,6 +1519,7 @@ static int btt_blk_init(struct btt *btt)
 {
 	struct nd_btt *nd_btt = btt->nd_btt;
 	struct nd_namespace_common *ndns = nd_btt->ndns;
+	int rc = -ENOMEM;
 
 	btt->btt_disk = blk_alloc_disk(NUMA_NO_NODE);
 	if (!btt->btt_disk)
@@ -1534,19 +1535,22 @@ static int btt_blk_init(struct btt *btt)
 	blk_queue_flag_set(QUEUE_FLAG_NONROT, btt->btt_disk->queue);
 
 	if (btt_meta_size(btt)) {
-		int rc = nd_integrity_init(btt->btt_disk, btt_meta_size(btt));
-
-		if (rc) {
-			blk_cleanup_disk(btt->btt_disk);
-			return rc;
-		}
+		rc = nd_integrity_init(btt->btt_disk, btt_meta_size(btt));
+		if (rc)
+			goto out_cleanup_disk;
 	}
+
 	set_capacity(btt->btt_disk, btt->nlba * btt->sector_size >> 9);
 	device_add_disk(&btt->nd_btt->dev, btt->btt_disk, NULL);
+
 	btt->nd_btt->size = btt->nlba * (u64)btt->sector_size;
 	nvdimm_check_and_set_ro(btt->btt_disk);
 
 	return 0;
+
+out_cleanup_disk:
+	blk_cleanup_disk(btt->btt_disk);
+	return rc;
 }
 
 static void btt_blk_cleanup(struct btt *btt)
-- 
2.33.0


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 03/13] nvdimm/btt: add error handling support for add_disk()
  2021-11-03 12:21 ` Luis Chamberlain
@ 2021-11-03 12:21   ` Luis Chamberlain
  -1 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

We never checked for errors on add_disk() as this function
returned void. Now that this is fixed, use the shiny new
error handling.

Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 drivers/nvdimm/btt.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
index 416d31cda3e7..da3f007a1211 100644
--- a/drivers/nvdimm/btt.c
+++ b/drivers/nvdimm/btt.c
@@ -1541,7 +1541,9 @@ static int btt_blk_init(struct btt *btt)
 	}
 
 	set_capacity(btt->btt_disk, btt->nlba * btt->sector_size >> 9);
-	device_add_disk(&btt->nd_btt->dev, btt->btt_disk, NULL);
+	rc = device_add_disk(&btt->nd_btt->dev, btt->btt_disk, NULL);
+	if (rc)
+		goto out_cleanup_disk;
 
 	btt->nd_btt->size = btt->nlba * (u64)btt->sector_size;
 	nvdimm_check_and_set_ro(btt->btt_disk);
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 03/13] nvdimm/btt: add error handling support for add_disk()
@ 2021-11-03 12:21   ` Luis Chamberlain
  0 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

We never checked for errors on add_disk() as this function
returned void. Now that this is fixed, use the shiny new
error handling.

Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 drivers/nvdimm/btt.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
index 416d31cda3e7..da3f007a1211 100644
--- a/drivers/nvdimm/btt.c
+++ b/drivers/nvdimm/btt.c
@@ -1541,7 +1541,9 @@ static int btt_blk_init(struct btt *btt)
 	}
 
 	set_capacity(btt->btt_disk, btt->nlba * btt->sector_size >> 9);
-	device_add_disk(&btt->nd_btt->dev, btt->btt_disk, NULL);
+	rc = device_add_disk(&btt->nd_btt->dev, btt->btt_disk, NULL);
+	if (rc)
+		goto out_cleanup_disk;
 
 	btt->nd_btt->size = btt->nlba * (u64)btt->sector_size;
 	nvdimm_check_and_set_ro(btt->btt_disk);
-- 
2.33.0


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 04/13] nvdimm/blk: avoid calling del_gendisk() on early failures
  2021-11-03 12:21 ` Luis Chamberlain
@ 2021-11-03 12:21   ` Luis Chamberlain
  -1 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

If nd_integrity_init() fails we'd get del_gendisk() called,
but that's not correct as we should only call that if we're
done with device_add_disk(). Fix this by providing unwinding
prior to the devm call being registered and moving the devm
registration to the very end.

This should fix calling del_gendisk() if nd_integrity_init()
fails. I only spotted this issue through code inspection. It
does not fix any real world bug.

Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 drivers/nvdimm/blk.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/drivers/nvdimm/blk.c b/drivers/nvdimm/blk.c
index b6c6866f9259..4eef67918a7e 100644
--- a/drivers/nvdimm/blk.c
+++ b/drivers/nvdimm/blk.c
@@ -239,6 +239,7 @@ static int nsblk_attach_disk(struct nd_namespace_blk *nsblk)
 	resource_size_t available_disk_size;
 	struct gendisk *disk;
 	u64 internal_nlba;
+	int rc;
 
 	internal_nlba = div_u64(nsblk->size, nsblk_internal_lbasize(nsblk));
 	available_disk_size = internal_nlba * nsblk_sector_size(nsblk);
@@ -255,20 +256,26 @@ static int nsblk_attach_disk(struct nd_namespace_blk *nsblk)
 	blk_queue_logical_block_size(disk->queue, nsblk_sector_size(nsblk));
 	blk_queue_flag_set(QUEUE_FLAG_NONROT, disk->queue);
 
-	if (devm_add_action_or_reset(dev, nd_blk_release_disk, disk))
-		return -ENOMEM;
-
 	if (nsblk_meta_size(nsblk)) {
-		int rc = nd_integrity_init(disk, nsblk_meta_size(nsblk));
+		rc = nd_integrity_init(disk, nsblk_meta_size(nsblk));
 
 		if (rc)
-			return rc;
+			goto out_before_devm_err;
 	}
 
 	set_capacity(disk, available_disk_size >> SECTOR_SHIFT);
 	device_add_disk(dev, disk, NULL);
+
+	/* nd_blk_release_disk() is called if this fails */
+	if (devm_add_action_or_reset(dev, nd_blk_release_disk, disk))
+		return -ENOMEM;
+
 	nvdimm_check_and_set_ro(disk);
 	return 0;
+
+out_before_devm_err:
+	blk_cleanup_disk(disk);
+	return rc;
 }
 
 static int nd_blk_probe(struct device *dev)
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 04/13] nvdimm/blk: avoid calling del_gendisk() on early failures
@ 2021-11-03 12:21   ` Luis Chamberlain
  0 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

If nd_integrity_init() fails we'd get del_gendisk() called,
but that's not correct as we should only call that if we're
done with device_add_disk(). Fix this by providing unwinding
prior to the devm call being registered and moving the devm
registration to the very end.

This should fix calling del_gendisk() if nd_integrity_init()
fails. I only spotted this issue through code inspection. It
does not fix any real world bug.

Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 drivers/nvdimm/blk.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/drivers/nvdimm/blk.c b/drivers/nvdimm/blk.c
index b6c6866f9259..4eef67918a7e 100644
--- a/drivers/nvdimm/blk.c
+++ b/drivers/nvdimm/blk.c
@@ -239,6 +239,7 @@ static int nsblk_attach_disk(struct nd_namespace_blk *nsblk)
 	resource_size_t available_disk_size;
 	struct gendisk *disk;
 	u64 internal_nlba;
+	int rc;
 
 	internal_nlba = div_u64(nsblk->size, nsblk_internal_lbasize(nsblk));
 	available_disk_size = internal_nlba * nsblk_sector_size(nsblk);
@@ -255,20 +256,26 @@ static int nsblk_attach_disk(struct nd_namespace_blk *nsblk)
 	blk_queue_logical_block_size(disk->queue, nsblk_sector_size(nsblk));
 	blk_queue_flag_set(QUEUE_FLAG_NONROT, disk->queue);
 
-	if (devm_add_action_or_reset(dev, nd_blk_release_disk, disk))
-		return -ENOMEM;
-
 	if (nsblk_meta_size(nsblk)) {
-		int rc = nd_integrity_init(disk, nsblk_meta_size(nsblk));
+		rc = nd_integrity_init(disk, nsblk_meta_size(nsblk));
 
 		if (rc)
-			return rc;
+			goto out_before_devm_err;
 	}
 
 	set_capacity(disk, available_disk_size >> SECTOR_SHIFT);
 	device_add_disk(dev, disk, NULL);
+
+	/* nd_blk_release_disk() is called if this fails */
+	if (devm_add_action_or_reset(dev, nd_blk_release_disk, disk))
+		return -ENOMEM;
+
 	nvdimm_check_and_set_ro(disk);
 	return 0;
+
+out_before_devm_err:
+	blk_cleanup_disk(disk);
+	return rc;
 }
 
 static int nd_blk_probe(struct device *dev)
-- 
2.33.0


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 05/13] nvdimm/blk: add error handling support for add_disk()
  2021-11-03 12:21 ` Luis Chamberlain
@ 2021-11-03 12:21   ` Luis Chamberlain
  -1 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

We never checked for errors on add_disk() as this function
returned void. Now that this is fixed, use the shiny new
error handling.

Since nvdimm/blk uses devm we just need to move the devm
registration towards the end. And in hindsight, that seems
to also provide a fix given del_gendisk() should not be
called unless the disk was already added via add_disk().
The probably of that issue happening is low though, like
OOM while calling devm_add_action(), so the fix is minor.

We manually unwind in case of add_disk() failure prior
to the devm registration.

Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 drivers/nvdimm/blk.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/nvdimm/blk.c b/drivers/nvdimm/blk.c
index 4eef67918a7e..228c33b8d1d6 100644
--- a/drivers/nvdimm/blk.c
+++ b/drivers/nvdimm/blk.c
@@ -264,7 +264,9 @@ static int nsblk_attach_disk(struct nd_namespace_blk *nsblk)
 	}
 
 	set_capacity(disk, available_disk_size >> SECTOR_SHIFT);
-	device_add_disk(dev, disk, NULL);
+	rc = device_add_disk(dev, disk, NULL);
+	if (rc)
+		goto out_before_devm_err;
 
 	/* nd_blk_release_disk() is called if this fails */
 	if (devm_add_action_or_reset(dev, nd_blk_release_disk, disk))
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 05/13] nvdimm/blk: add error handling support for add_disk()
@ 2021-11-03 12:21   ` Luis Chamberlain
  0 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

We never checked for errors on add_disk() as this function
returned void. Now that this is fixed, use the shiny new
error handling.

Since nvdimm/blk uses devm we just need to move the devm
registration towards the end. And in hindsight, that seems
to also provide a fix given del_gendisk() should not be
called unless the disk was already added via add_disk().
The probably of that issue happening is low though, like
OOM while calling devm_add_action(), so the fix is minor.

We manually unwind in case of add_disk() failure prior
to the devm registration.

Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 drivers/nvdimm/blk.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/nvdimm/blk.c b/drivers/nvdimm/blk.c
index 4eef67918a7e..228c33b8d1d6 100644
--- a/drivers/nvdimm/blk.c
+++ b/drivers/nvdimm/blk.c
@@ -264,7 +264,9 @@ static int nsblk_attach_disk(struct nd_namespace_blk *nsblk)
 	}
 
 	set_capacity(disk, available_disk_size >> SECTOR_SHIFT);
-	device_add_disk(dev, disk, NULL);
+	rc = device_add_disk(dev, disk, NULL);
+	if (rc)
+		goto out_before_devm_err;
 
 	/* nd_blk_release_disk() is called if this fails */
 	if (devm_add_action_or_reset(dev, nd_blk_release_disk, disk))
-- 
2.33.0


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 06/13] nvdimm/pmem: cleanup the disk if pmem_release_disk() is yet assigned
  2021-11-03 12:21 ` Luis Chamberlain
@ 2021-11-03 12:21   ` Luis Chamberlain
  -1 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

Prior to devm being able to use pmem_release_disk() there are other
failure which can occur for which we must account for and release the
disk for. Address those few cases.

Fixes: 3dd60fb9d95d ("nvdimm/pmem: stop using q_usage_count as external pgmap refcount")
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 drivers/nvdimm/pmem.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
index 9cc0d0ebfad1..d98af6c31f42 100644
--- a/drivers/nvdimm/pmem.c
+++ b/drivers/nvdimm/pmem.c
@@ -471,8 +471,10 @@ static int pmem_attach_disk(struct device *dev,
 		bb_range.end = res->end;
 	}
 
-	if (IS_ERR(addr))
-		return PTR_ERR(addr);
+	if (IS_ERR(addr)) {
+		rc = PTR_ERR(addr);
+		goto out;
+	}
 	pmem->virt_addr = addr;
 
 	blk_queue_write_cache(q, true, fua);
@@ -497,7 +499,8 @@ static int pmem_attach_disk(struct device *dev,
 		flags = DAXDEV_F_SYNC;
 	dax_dev = alloc_dax(pmem, disk->disk_name, &pmem_dax_ops, flags);
 	if (IS_ERR(dax_dev)) {
-		return PTR_ERR(dax_dev);
+		rc = PTR_ERR(dax_dev);
+		goto out;
 	}
 	dax_write_cache(dax_dev, nvdimm_has_cache(nd_region));
 	pmem->dax_dev = dax_dev;
@@ -512,8 +515,10 @@ static int pmem_attach_disk(struct device *dev,
 					  "badblocks");
 	if (!pmem->bb_state)
 		dev_warn(dev, "'badblocks' notification disabled\n");
-
 	return 0;
+out:
+	blk_cleanup_disk(pmem->disk);
+	return rc;
 }
 
 static int nd_pmem_probe(struct device *dev)
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 06/13] nvdimm/pmem: cleanup the disk if pmem_release_disk() is yet assigned
@ 2021-11-03 12:21   ` Luis Chamberlain
  0 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

Prior to devm being able to use pmem_release_disk() there are other
failure which can occur for which we must account for and release the
disk for. Address those few cases.

Fixes: 3dd60fb9d95d ("nvdimm/pmem: stop using q_usage_count as external pgmap refcount")
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 drivers/nvdimm/pmem.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
index 9cc0d0ebfad1..d98af6c31f42 100644
--- a/drivers/nvdimm/pmem.c
+++ b/drivers/nvdimm/pmem.c
@@ -471,8 +471,10 @@ static int pmem_attach_disk(struct device *dev,
 		bb_range.end = res->end;
 	}
 
-	if (IS_ERR(addr))
-		return PTR_ERR(addr);
+	if (IS_ERR(addr)) {
+		rc = PTR_ERR(addr);
+		goto out;
+	}
 	pmem->virt_addr = addr;
 
 	blk_queue_write_cache(q, true, fua);
@@ -497,7 +499,8 @@ static int pmem_attach_disk(struct device *dev,
 		flags = DAXDEV_F_SYNC;
 	dax_dev = alloc_dax(pmem, disk->disk_name, &pmem_dax_ops, flags);
 	if (IS_ERR(dax_dev)) {
-		return PTR_ERR(dax_dev);
+		rc = PTR_ERR(dax_dev);
+		goto out;
 	}
 	dax_write_cache(dax_dev, nvdimm_has_cache(nd_region));
 	pmem->dax_dev = dax_dev;
@@ -512,8 +515,10 @@ static int pmem_attach_disk(struct device *dev,
 					  "badblocks");
 	if (!pmem->bb_state)
 		dev_warn(dev, "'badblocks' notification disabled\n");
-
 	return 0;
+out:
+	blk_cleanup_disk(pmem->disk);
+	return rc;
 }
 
 static int nd_pmem_probe(struct device *dev)
-- 
2.33.0


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 07/13] nvdimm/pmem: use add_disk() error handling
  2021-11-03 12:21 ` Luis Chamberlain
@ 2021-11-03 12:21   ` Luis Chamberlain
  -1 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

Now that device_add_disk() supports returning an error, use
that. We must unwind alloc_dax() on error.

Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 drivers/nvdimm/pmem.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
index d98af6c31f42..fe7ece1534e1 100644
--- a/drivers/nvdimm/pmem.c
+++ b/drivers/nvdimm/pmem.c
@@ -505,7 +505,9 @@ static int pmem_attach_disk(struct device *dev,
 	dax_write_cache(dax_dev, nvdimm_has_cache(nd_region));
 	pmem->dax_dev = dax_dev;
 
-	device_add_disk(dev, disk, pmem_attribute_groups);
+	rc = device_add_disk(dev, disk, pmem_attribute_groups);
+	if (rc)
+		goto out_cleanup_dax;
 	if (devm_add_action_or_reset(dev, pmem_release_disk, pmem))
 		return -ENOMEM;
 
@@ -516,6 +518,10 @@ static int pmem_attach_disk(struct device *dev,
 	if (!pmem->bb_state)
 		dev_warn(dev, "'badblocks' notification disabled\n");
 	return 0;
+
+out_cleanup_dax:
+	kill_dax(pmem->dax_dev);
+	put_dax(pmem->dax_dev);
 out:
 	blk_cleanup_disk(pmem->disk);
 	return rc;
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 07/13] nvdimm/pmem: use add_disk() error handling
@ 2021-11-03 12:21   ` Luis Chamberlain
  0 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

Now that device_add_disk() supports returning an error, use
that. We must unwind alloc_dax() on error.

Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 drivers/nvdimm/pmem.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
index d98af6c31f42..fe7ece1534e1 100644
--- a/drivers/nvdimm/pmem.c
+++ b/drivers/nvdimm/pmem.c
@@ -505,7 +505,9 @@ static int pmem_attach_disk(struct device *dev,
 	dax_write_cache(dax_dev, nvdimm_has_cache(nd_region));
 	pmem->dax_dev = dax_dev;
 
-	device_add_disk(dev, disk, pmem_attribute_groups);
+	rc = device_add_disk(dev, disk, pmem_attribute_groups);
+	if (rc)
+		goto out_cleanup_dax;
 	if (devm_add_action_or_reset(dev, pmem_release_disk, pmem))
 		return -ENOMEM;
 
@@ -516,6 +518,10 @@ static int pmem_attach_disk(struct device *dev,
 	if (!pmem->bb_state)
 		dev_warn(dev, "'badblocks' notification disabled\n");
 	return 0;
+
+out_cleanup_dax:
+	kill_dax(pmem->dax_dev);
+	put_dax(pmem->dax_dev);
 out:
 	blk_cleanup_disk(pmem->disk);
 	return rc;
-- 
2.33.0


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 08/13] z2ram: add error handling support for add_disk()
  2021-11-03 12:21 ` Luis Chamberlain
@ 2021-11-03 12:21   ` Luis Chamberlain
  -1 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

We never checked for errors on add_disk() as this function
returned void. Now that this is fixed, use the shiny new
error handling. Only the disk is cleaned up inside
z2ram_register_disk() as the caller deals with the rest.

Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 drivers/block/z2ram.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/block/z2ram.c b/drivers/block/z2ram.c
index 4eef218108c6..ccc52c935faf 100644
--- a/drivers/block/z2ram.c
+++ b/drivers/block/z2ram.c
@@ -318,6 +318,7 @@ static const struct blk_mq_ops z2_mq_ops = {
 static int z2ram_register_disk(int minor)
 {
 	struct gendisk *disk;
+	int err;
 
 	disk = blk_mq_alloc_disk(&tag_set, NULL);
 	if (IS_ERR(disk))
@@ -333,8 +334,10 @@ static int z2ram_register_disk(int minor)
 		sprintf(disk->disk_name, "z2ram");
 
 	z2ram_gendisk[minor] = disk;
-	add_disk(disk);
-	return 0;
+	err = add_disk(disk);
+	if (err)
+		blk_cleanup_disk(disk);
+	return err;
 }
 
 static int __init z2_init(void)
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 08/13] z2ram: add error handling support for add_disk()
@ 2021-11-03 12:21   ` Luis Chamberlain
  0 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

We never checked for errors on add_disk() as this function
returned void. Now that this is fixed, use the shiny new
error handling. Only the disk is cleaned up inside
z2ram_register_disk() as the caller deals with the rest.

Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 drivers/block/z2ram.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/block/z2ram.c b/drivers/block/z2ram.c
index 4eef218108c6..ccc52c935faf 100644
--- a/drivers/block/z2ram.c
+++ b/drivers/block/z2ram.c
@@ -318,6 +318,7 @@ static const struct blk_mq_ops z2_mq_ops = {
 static int z2ram_register_disk(int minor)
 {
 	struct gendisk *disk;
+	int err;
 
 	disk = blk_mq_alloc_disk(&tag_set, NULL);
 	if (IS_ERR(disk))
@@ -333,8 +334,10 @@ static int z2ram_register_disk(int minor)
 		sprintf(disk->disk_name, "z2ram");
 
 	z2ram_gendisk[minor] = disk;
-	add_disk(disk);
-	return 0;
+	err = add_disk(disk);
+	if (err)
+		blk_cleanup_disk(disk);
+	return err;
 }
 
 static int __init z2_init(void)
-- 
2.33.0


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 09/13] block/sunvdc: add error handling support for add_disk()
  2021-11-03 12:21 ` Luis Chamberlain
@ 2021-11-03 12:21   ` Luis Chamberlain
  -1 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

We never checked for errors on add_disk() as this function
returned void. Now that this is fixed, use the shiny new
error handling.

We re-use the same free tag call, so we also add a label for
that as well.

Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 drivers/block/sunvdc.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/drivers/block/sunvdc.c b/drivers/block/sunvdc.c
index 4d4bb810c2ae..6f45a53f7cbf 100644
--- a/drivers/block/sunvdc.c
+++ b/drivers/block/sunvdc.c
@@ -826,8 +826,8 @@ static int probe_disk(struct vdc_port *port)
 	if (IS_ERR(g)) {
 		printk(KERN_ERR PFX "%s: Could not allocate gendisk.\n",
 		       port->vio.name);
-		blk_mq_free_tag_set(&port->tag_set);
-		return PTR_ERR(g);
+		err = PTR_ERR(g);
+		goto out_free_tag;
 	}
 
 	port->disk = g;
@@ -879,9 +879,17 @@ static int probe_disk(struct vdc_port *port)
 	       port->vdisk_size, (port->vdisk_size >> (20 - 9)),
 	       port->vio.ver.major, port->vio.ver.minor);
 
-	device_add_disk(&port->vio.vdev->dev, g, NULL);
+	err = device_add_disk(&port->vio.vdev->dev, g, NULL);
+	if (err)
+		goto out_cleanup_disk;
 
 	return 0;
+
+out_cleanup_disk:
+	blk_cleanup_disk(g);
+out_free_tag:
+	blk_mq_free_tag_set(&port->tag_set);
+	return err;
 }
 
 static struct ldc_channel_config vdc_ldc_cfg = {
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 09/13] block/sunvdc: add error handling support for add_disk()
@ 2021-11-03 12:21   ` Luis Chamberlain
  0 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

We never checked for errors on add_disk() as this function
returned void. Now that this is fixed, use the shiny new
error handling.

We re-use the same free tag call, so we also add a label for
that as well.

Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 drivers/block/sunvdc.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/drivers/block/sunvdc.c b/drivers/block/sunvdc.c
index 4d4bb810c2ae..6f45a53f7cbf 100644
--- a/drivers/block/sunvdc.c
+++ b/drivers/block/sunvdc.c
@@ -826,8 +826,8 @@ static int probe_disk(struct vdc_port *port)
 	if (IS_ERR(g)) {
 		printk(KERN_ERR PFX "%s: Could not allocate gendisk.\n",
 		       port->vio.name);
-		blk_mq_free_tag_set(&port->tag_set);
-		return PTR_ERR(g);
+		err = PTR_ERR(g);
+		goto out_free_tag;
 	}
 
 	port->disk = g;
@@ -879,9 +879,17 @@ static int probe_disk(struct vdc_port *port)
 	       port->vdisk_size, (port->vdisk_size >> (20 - 9)),
 	       port->vio.ver.major, port->vio.ver.minor);
 
-	device_add_disk(&port->vio.vdev->dev, g, NULL);
+	err = device_add_disk(&port->vio.vdev->dev, g, NULL);
+	if (err)
+		goto out_cleanup_disk;
 
 	return 0;
+
+out_cleanup_disk:
+	blk_cleanup_disk(g);
+out_free_tag:
+	blk_mq_free_tag_set(&port->tag_set);
+	return err;
 }
 
 static struct ldc_channel_config vdc_ldc_cfg = {
-- 
2.33.0


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 10/13] mtd/ubi/block: add error handling support for add_disk()
  2021-11-03 12:21 ` Luis Chamberlain
@ 2021-11-03 12:21   ` Luis Chamberlain
  -1 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

We never checked for errors on add_disk() as this function
returned void. Now that this is fixed, use the shiny new
error handling.

Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 drivers/mtd/ubi/block.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/mtd/ubi/block.c b/drivers/mtd/ubi/block.c
index e003b4b44ffa..062e6c2c45f5 100644
--- a/drivers/mtd/ubi/block.c
+++ b/drivers/mtd/ubi/block.c
@@ -447,12 +447,18 @@ int ubiblock_create(struct ubi_volume_info *vi)
 	list_add_tail(&dev->list, &ubiblock_devices);
 
 	/* Must be the last step: anyone can call file ops from now on */
-	add_disk(dev->gd);
+	ret = add_disk(dev->gd);
+	if (ret)
+		goto out_destroy_wq;
+
 	dev_info(disk_to_dev(dev->gd), "created from ubi%d:%d(%s)",
 		 dev->ubi_num, dev->vol_id, vi->name);
 	mutex_unlock(&devices_mutex);
 	return 0;
 
+out_destroy_wq:
+	list_del(&dev->list);
+	destroy_workqueue(dev->wq);
 out_remove_minor:
 	idr_remove(&ubiblock_minor_idr, gd->first_minor);
 out_cleanup_disk:
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 10/13] mtd/ubi/block: add error handling support for add_disk()
@ 2021-11-03 12:21   ` Luis Chamberlain
  0 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

We never checked for errors on add_disk() as this function
returned void. Now that this is fixed, use the shiny new
error handling.

Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 drivers/mtd/ubi/block.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/mtd/ubi/block.c b/drivers/mtd/ubi/block.c
index e003b4b44ffa..062e6c2c45f5 100644
--- a/drivers/mtd/ubi/block.c
+++ b/drivers/mtd/ubi/block.c
@@ -447,12 +447,18 @@ int ubiblock_create(struct ubi_volume_info *vi)
 	list_add_tail(&dev->list, &ubiblock_devices);
 
 	/* Must be the last step: anyone can call file ops from now on */
-	add_disk(dev->gd);
+	ret = add_disk(dev->gd);
+	if (ret)
+		goto out_destroy_wq;
+
 	dev_info(disk_to_dev(dev->gd), "created from ubi%d:%d(%s)",
 		 dev->ubi_num, dev->vol_id, vi->name);
 	mutex_unlock(&devices_mutex);
 	return 0;
 
+out_destroy_wq:
+	list_del(&dev->list);
+	destroy_workqueue(dev->wq);
 out_remove_minor:
 	idr_remove(&ubiblock_minor_idr, gd->first_minor);
 out_cleanup_disk:
-- 
2.33.0


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 11/13] ataflop: remove ataflop_probe_lock mutex
  2021-11-03 12:21 ` Luis Chamberlain
@ 2021-11-03 12:21   ` Luis Chamberlain
  -1 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel,
	Tetsuo Handa, Michael Schmitz

From: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>

Commit bf9c0538e485b591 ("ataflop: use a separate gendisk for each media
format") introduced ataflop_probe_lock mutex, but forgot to unlock the
mutex when atari_floppy_init() (i.e. module loading) succeeded. This will
result in double lock deadlock if ataflop_probe() is called. Also,
unregister_blkdev() must not be called from atari_floppy_init() with
ataflop_probe_lock held when atari_floppy_init() failed, for
ataflop_probe() waits for ataflop_probe_lock with major_names_lock held
(i.e. AB-BA deadlock).

__register_blkdev() needs to be called last in order to avoid calling
ataflop_probe() when atari_floppy_init() is about to fail, for memory for
completing already-started ataflop_probe() safely will be released as soon
as atari_floppy_init() released ataflop_probe_lock mutex.

As with commit 8b52d8be86d72308 ("loop: reorder loop_exit"),
unregister_blkdev() needs to be called first in order to avoid calling
ataflop_alloc_disk() from ataflop_probe() after del_gendisk() from
atari_floppy_exit().

By relocating __register_blkdev() / unregister_blkdev() as explained above,
we can remove ataflop_probe_lock mutex, for probe function and __exit
function are serialized by major_names_lock mutex.

Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Fixes: bf9c0538e485b591 ("ataflop: use a separate gendisk for each media format")
Reviewed-by: Luis Chamberlain <mcgrof@kernel.org>
Tested-by: Michael Schmitz <schmitzmic@gmail.com>
---
 drivers/block/ataflop.c | 47 +++++++++++++++++++++++------------------
 1 file changed, 27 insertions(+), 20 deletions(-)

diff --git a/drivers/block/ataflop.c b/drivers/block/ataflop.c
index d14bdc3589b2..170dd193cef6 100644
--- a/drivers/block/ataflop.c
+++ b/drivers/block/ataflop.c
@@ -2008,8 +2008,6 @@ static int ataflop_alloc_disk(unsigned int drive, unsigned int type)
 	return 0;
 }
 
-static DEFINE_MUTEX(ataflop_probe_lock);
-
 static void ataflop_probe(dev_t dev)
 {
 	int drive = MINOR(dev) & 3;
@@ -2020,14 +2018,32 @@ static void ataflop_probe(dev_t dev)
 
 	if (drive >= FD_MAX_UNITS || type >= NUM_DISK_MINORS)
 		return;
-	mutex_lock(&ataflop_probe_lock);
 	if (!unit[drive].disk[type]) {
 		if (ataflop_alloc_disk(drive, type) == 0) {
 			add_disk(unit[drive].disk[type]);
 			unit[drive].registered[type] = true;
 		}
 	}
-	mutex_unlock(&ataflop_probe_lock);
+}
+
+static void atari_floppy_cleanup(void)
+{
+	int i;
+	int type;
+
+	for (i = 0; i < FD_MAX_UNITS; i++) {
+		for (type = 0; type < NUM_DISK_MINORS; type++) {
+			if (!unit[i].disk[type])
+				continue;
+			del_gendisk(unit[i].disk[type]);
+			blk_cleanup_queue(unit[i].disk[type]->queue);
+			put_disk(unit[i].disk[type]);
+		}
+		blk_mq_free_tag_set(&unit[i].tag_set);
+	}
+
+	del_timer_sync(&fd_timer);
+	atari_stram_free(DMABuffer);
 }
 
 static void atari_cleanup_floppy_disk(struct atari_floppy_struct *fs)
@@ -2053,11 +2069,6 @@ static int __init atari_floppy_init (void)
 		/* Amiga, Mac, ... don't have Atari-compatible floppy :-) */
 		return -ENODEV;
 
-	mutex_lock(&ataflop_probe_lock);
-	ret = __register_blkdev(FLOPPY_MAJOR, "fd", ataflop_probe);
-	if (ret)
-		goto out_unlock;
-
 	for (i = 0; i < FD_MAX_UNITS; i++) {
 		memset(&unit[i].tag_set, 0, sizeof(unit[i].tag_set));
 		unit[i].tag_set.ops = &ataflop_mq_ops;
@@ -2113,7 +2124,12 @@ static int __init atari_floppy_init (void)
 	       UseTrackbuffer ? "" : "no ");
 	config_types();
 
-	return 0;
+	ret = __register_blkdev(FLOPPY_MAJOR, "fd", ataflop_probe);
+	if (ret) {
+		printk(KERN_ERR "atari_floppy_init: cannot register block device\n");
+		atari_floppy_cleanup();
+	}
+	return ret;
 
 err_out_dma:
 	atari_stram_free(DMABuffer);
@@ -2121,9 +2137,6 @@ static int __init atari_floppy_init (void)
 	while (--i >= 0)
 		atari_cleanup_floppy_disk(&unit[i]);
 
-	unregister_blkdev(FLOPPY_MAJOR, "fd");
-out_unlock:
-	mutex_unlock(&ataflop_probe_lock);
 	return ret;
 }
 
@@ -2168,14 +2181,8 @@ __setup("floppy=", atari_floppy_setup);
 
 static void __exit atari_floppy_exit(void)
 {
-	int i;
-
-	for (i = 0; i < FD_MAX_UNITS; i++)
-		atari_cleanup_floppy_disk(&unit[i]);
 	unregister_blkdev(FLOPPY_MAJOR, "fd");
-
-	del_timer_sync(&fd_timer);
-	atari_stram_free( DMABuffer );
+	atari_floppy_cleanup();
 }
 
 module_init(atari_floppy_init)
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 11/13] ataflop: remove ataflop_probe_lock mutex
@ 2021-11-03 12:21   ` Luis Chamberlain
  0 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel,
	Tetsuo Handa, Michael Schmitz

From: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>

Commit bf9c0538e485b591 ("ataflop: use a separate gendisk for each media
format") introduced ataflop_probe_lock mutex, but forgot to unlock the
mutex when atari_floppy_init() (i.e. module loading) succeeded. This will
result in double lock deadlock if ataflop_probe() is called. Also,
unregister_blkdev() must not be called from atari_floppy_init() with
ataflop_probe_lock held when atari_floppy_init() failed, for
ataflop_probe() waits for ataflop_probe_lock with major_names_lock held
(i.e. AB-BA deadlock).

__register_blkdev() needs to be called last in order to avoid calling
ataflop_probe() when atari_floppy_init() is about to fail, for memory for
completing already-started ataflop_probe() safely will be released as soon
as atari_floppy_init() released ataflop_probe_lock mutex.

As with commit 8b52d8be86d72308 ("loop: reorder loop_exit"),
unregister_blkdev() needs to be called first in order to avoid calling
ataflop_alloc_disk() from ataflop_probe() after del_gendisk() from
atari_floppy_exit().

By relocating __register_blkdev() / unregister_blkdev() as explained above,
we can remove ataflop_probe_lock mutex, for probe function and __exit
function are serialized by major_names_lock mutex.

Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Fixes: bf9c0538e485b591 ("ataflop: use a separate gendisk for each media format")
Reviewed-by: Luis Chamberlain <mcgrof@kernel.org>
Tested-by: Michael Schmitz <schmitzmic@gmail.com>
---
 drivers/block/ataflop.c | 47 +++++++++++++++++++++++------------------
 1 file changed, 27 insertions(+), 20 deletions(-)

diff --git a/drivers/block/ataflop.c b/drivers/block/ataflop.c
index d14bdc3589b2..170dd193cef6 100644
--- a/drivers/block/ataflop.c
+++ b/drivers/block/ataflop.c
@@ -2008,8 +2008,6 @@ static int ataflop_alloc_disk(unsigned int drive, unsigned int type)
 	return 0;
 }
 
-static DEFINE_MUTEX(ataflop_probe_lock);
-
 static void ataflop_probe(dev_t dev)
 {
 	int drive = MINOR(dev) & 3;
@@ -2020,14 +2018,32 @@ static void ataflop_probe(dev_t dev)
 
 	if (drive >= FD_MAX_UNITS || type >= NUM_DISK_MINORS)
 		return;
-	mutex_lock(&ataflop_probe_lock);
 	if (!unit[drive].disk[type]) {
 		if (ataflop_alloc_disk(drive, type) == 0) {
 			add_disk(unit[drive].disk[type]);
 			unit[drive].registered[type] = true;
 		}
 	}
-	mutex_unlock(&ataflop_probe_lock);
+}
+
+static void atari_floppy_cleanup(void)
+{
+	int i;
+	int type;
+
+	for (i = 0; i < FD_MAX_UNITS; i++) {
+		for (type = 0; type < NUM_DISK_MINORS; type++) {
+			if (!unit[i].disk[type])
+				continue;
+			del_gendisk(unit[i].disk[type]);
+			blk_cleanup_queue(unit[i].disk[type]->queue);
+			put_disk(unit[i].disk[type]);
+		}
+		blk_mq_free_tag_set(&unit[i].tag_set);
+	}
+
+	del_timer_sync(&fd_timer);
+	atari_stram_free(DMABuffer);
 }
 
 static void atari_cleanup_floppy_disk(struct atari_floppy_struct *fs)
@@ -2053,11 +2069,6 @@ static int __init atari_floppy_init (void)
 		/* Amiga, Mac, ... don't have Atari-compatible floppy :-) */
 		return -ENODEV;
 
-	mutex_lock(&ataflop_probe_lock);
-	ret = __register_blkdev(FLOPPY_MAJOR, "fd", ataflop_probe);
-	if (ret)
-		goto out_unlock;
-
 	for (i = 0; i < FD_MAX_UNITS; i++) {
 		memset(&unit[i].tag_set, 0, sizeof(unit[i].tag_set));
 		unit[i].tag_set.ops = &ataflop_mq_ops;
@@ -2113,7 +2124,12 @@ static int __init atari_floppy_init (void)
 	       UseTrackbuffer ? "" : "no ");
 	config_types();
 
-	return 0;
+	ret = __register_blkdev(FLOPPY_MAJOR, "fd", ataflop_probe);
+	if (ret) {
+		printk(KERN_ERR "atari_floppy_init: cannot register block device\n");
+		atari_floppy_cleanup();
+	}
+	return ret;
 
 err_out_dma:
 	atari_stram_free(DMABuffer);
@@ -2121,9 +2137,6 @@ static int __init atari_floppy_init (void)
 	while (--i >= 0)
 		atari_cleanup_floppy_disk(&unit[i]);
 
-	unregister_blkdev(FLOPPY_MAJOR, "fd");
-out_unlock:
-	mutex_unlock(&ataflop_probe_lock);
 	return ret;
 }
 
@@ -2168,14 +2181,8 @@ __setup("floppy=", atari_floppy_setup);
 
 static void __exit atari_floppy_exit(void)
 {
-	int i;
-
-	for (i = 0; i < FD_MAX_UNITS; i++)
-		atari_cleanup_floppy_disk(&unit[i]);
 	unregister_blkdev(FLOPPY_MAJOR, "fd");
-
-	del_timer_sync(&fd_timer);
-	atari_stram_free( DMABuffer );
+	atari_floppy_cleanup();
 }
 
 module_init(atari_floppy_init)
-- 
2.33.0


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 12/13] block: make __register_blkdev() return an error
  2021-11-03 12:21 ` Luis Chamberlain
@ 2021-11-03 12:21   ` Luis Chamberlain
  -1 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

This makes __register_blkdev() return an error, and also changes the
probe() call to return an error as well.

We expand documentation for the probe call to ensure that if the block
device already exists we don't return on error on that condition. We do
this as otherwise we loose ability to handle concurrent requests if the
block device already existed.

Cc: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 block/bdev.c            |  5 ++++-
 block/genhd.c           | 21 +++++++++++++++------
 drivers/block/ataflop.c | 19 ++++++++++++++-----
 drivers/block/brd.c     |  7 +++++--
 drivers/block/floppy.c  | 17 +++++++++++++----
 drivers/block/loop.c    | 11 ++++++++---
 drivers/md/md.c         | 12 +++++++++---
 drivers/scsi/sd.c       |  3 ++-
 include/linux/genhd.h   |  4 ++--
 9 files changed, 72 insertions(+), 27 deletions(-)

diff --git a/block/bdev.c b/block/bdev.c
index b4dab2fb6a74..876306c6ba6e 100644
--- a/block/bdev.c
+++ b/block/bdev.c
@@ -736,10 +736,13 @@ struct block_device *blkdev_get_no_open(dev_t dev)
 {
 	struct block_device *bdev;
 	struct inode *inode;
+	int ret;
 
 	inode = ilookup(blockdev_superblock, dev);
 	if (!inode) {
-		blk_request_module(dev);
+		ret = blk_request_module(dev);
+		if (ret)
+			return NULL;
 		inode = ilookup(blockdev_superblock, dev);
 		if (!inode)
 			return NULL;
diff --git a/block/genhd.c b/block/genhd.c
index febaaa55125a..7b56767e9e32 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -183,7 +183,7 @@ static struct blk_major_name {
 	struct blk_major_name *next;
 	int major;
 	char name[16];
-	void (*probe)(dev_t devt);
+	int (*probe)(dev_t devt);
 } *major_names[BLKDEV_MAJOR_HASH_SIZE];
 static DEFINE_MUTEX(major_names_lock);
 static DEFINE_SPINLOCK(major_names_spinlock);
@@ -213,7 +213,13 @@ void blkdev_show(struct seq_file *seqf, off_t offset)
  * @major: the requested major device number [1..BLKDEV_MAJOR_MAX-1]. If
  *         @major = 0, try to allocate any unused major number.
  * @name: the name of the new block device as a zero terminated string
- * @probe: allback that is called on access to any minor number of @major
+ * @probe: callback that is called on access to any minor number of @major.
+ * 	This will return 0 if the block device is already present or was
+ * 	not present and it succcessfully added a new one. If the block device
+ * 	was not already present but it was a valid request an error reflecting
+ * 	the reason why adding the block device is returned. An error should not
+ * 	be returned if the block device already exists as otherwise concurrent
+ * 	requests to open an existing block device would fail.
  *
  * The @name must be unique within the system.
  *
@@ -231,7 +237,7 @@ void blkdev_show(struct seq_file *seqf, off_t offset)
  * Use register_blkdev instead for any new code.
  */
 int __register_blkdev(unsigned int major, const char *name,
-		void (*probe)(dev_t devt))
+		int (*probe)(dev_t devt))
 {
 	struct blk_major_name **n, *p;
 	int index, ret = 0;
@@ -672,17 +678,18 @@ static ssize_t disk_badblocks_store(struct device *dev,
 	return badblocks_store(disk->bb, page, len, 0);
 }
 
-void blk_request_module(dev_t devt)
+int blk_request_module(dev_t devt)
 {
 	unsigned int major = MAJOR(devt);
 	struct blk_major_name **n;
+	int err;
 
 	mutex_lock(&major_names_lock);
 	for (n = &major_names[major_to_index(major)]; *n; n = &(*n)->next) {
 		if ((*n)->major == major && (*n)->probe) {
-			(*n)->probe(devt);
+			err = (*n)->probe(devt);
 			mutex_unlock(&major_names_lock);
-			return;
+			return err;
 		}
 	}
 	mutex_unlock(&major_names_lock);
@@ -690,6 +697,8 @@ void blk_request_module(dev_t devt)
 	if (request_module("block-major-%d-%d", MAJOR(devt), MINOR(devt)) > 0)
 		/* Make old-style 2.4 aliases work */
 		request_module("block-major-%d", MAJOR(devt));
+
+	return 0;
 }
 
 /*
diff --git a/drivers/block/ataflop.c b/drivers/block/ataflop.c
index 170dd193cef6..805c2d12e358 100644
--- a/drivers/block/ataflop.c
+++ b/drivers/block/ataflop.c
@@ -2008,22 +2008,31 @@ static int ataflop_alloc_disk(unsigned int drive, unsigned int type)
 	return 0;
 }
 
-static void ataflop_probe(dev_t dev)
+static int ataflop_probe(dev_t dev)
 {
 	int drive = MINOR(dev) & 3;
 	int type  = MINOR(dev) >> 2;
+	int err = 0;
 
 	if (type)
 		type--;
 
 	if (drive >= FD_MAX_UNITS || type >= NUM_DISK_MINORS)
-		return;
+		return -EINVAL;
+
 	if (!unit[drive].disk[type]) {
-		if (ataflop_alloc_disk(drive, type) == 0) {
-			add_disk(unit[drive].disk[type]);
-			unit[drive].registered[type] = true;
+		err = ataflop_alloc_disk(drive, type);
+		if (err == 0) {
+			err = add_disk(unit[drive].disk[type]);
+			if (err) {
+				blk_cleanup_disk(unit[drive].disk[type]);
+				unit[drive].disk[type] = NULL;
+			} else
+				unit[drive].registered[type] = true;
 		}
 	}
+
+	return err;
 }
 
 static void atari_floppy_cleanup(void)
diff --git a/drivers/block/brd.c b/drivers/block/brd.c
index a896ee175d86..fa6f532035fc 100644
--- a/drivers/block/brd.c
+++ b/drivers/block/brd.c
@@ -437,9 +437,12 @@ static int brd_alloc(int i)
 	return err;
 }
 
-static void brd_probe(dev_t dev)
+static int brd_probe(dev_t dev)
 {
-	brd_alloc(MINOR(dev) / max_part);
+	int ret =  brd_alloc(MINOR(dev) / max_part);
+	if (ret == -EEXIST)
+		return 0;
+	return ret;
 }
 
 static void brd_del_one(struct brd_device *brd)
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
index 3873e789478e..ff3422f517a6 100644
--- a/drivers/block/floppy.c
+++ b/drivers/block/floppy.c
@@ -4518,21 +4518,30 @@ static int floppy_alloc_disk(unsigned int drive, unsigned int type)
 
 static DEFINE_MUTEX(floppy_probe_lock);
 
-static void floppy_probe(dev_t dev)
+static int floppy_probe(dev_t dev)
 {
 	unsigned int drive = (MINOR(dev) & 3) | ((MINOR(dev) & 0x80) >> 5);
 	unsigned int type = (MINOR(dev) >> 2) & 0x1f;
+	int err = 0;
 
 	if (drive >= N_DRIVE || !floppy_available(drive) ||
 	    type >= ARRAY_SIZE(floppy_type))
-		return;
+		return -EINVAL;
 
 	mutex_lock(&floppy_probe_lock);
 	if (!disks[drive][type]) {
-		if (floppy_alloc_disk(drive, type) == 0)
-			add_disk(disks[drive][type]);
+		err = floppy_alloc_disk(drive, type);
+		if (err == 0) {
+			err = add_disk(disks[drive][type]);
+			if (err) {
+				blk_cleanup_disk(disks[drive][type]);
+				disks[drive][type] = NULL;
+			}
+		}
 	}
 	mutex_unlock(&floppy_probe_lock);
+
+	return err;
 }
 
 static int __init do_floppy_init(void)
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 3c09a33fa1c7..dfc2859274a4 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -2089,13 +2089,18 @@ static void loop_remove(struct loop_device *lo)
 	kfree(lo);
 }
 
-static void loop_probe(dev_t dev)
+static int loop_probe(dev_t dev)
 {
 	int idx = MINOR(dev) >> part_shift;
+	int ret;
 
 	if (max_loop && idx >= max_loop)
-		return;
-	loop_add(idx);
+		return -EINVAL;
+	ret = loop_add(idx);
+	if (ret == -EEXIST)
+		return 0;
+
+	return ret;
 }
 
 static int loop_control_remove(int idx)
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 5111ed966947..cdfabb90acb5 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -5737,12 +5737,18 @@ static int md_alloc(dev_t dev, char *name)
 	return error;
 }
 
-static void md_probe(dev_t dev)
+static int md_probe(dev_t dev)
 {
+	int error = 0;
+
 	if (MAJOR(dev) == MD_MAJOR && MINOR(dev) >= 512)
-		return;
+		return -EINVAL;
 	if (create_on_open)
-		md_alloc(dev, NULL);
+		error = md_alloc(dev, NULL);
+	if (error == -EEXIST)
+		return 0;
+
+	return error;
 }
 
 static int add_named_array(const char *val, const struct kernel_param *kp)
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 65875a598d62..a135d5c48829 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -632,8 +632,9 @@ static struct scsi_driver sd_template = {
  * Don't request a new module, as that could deadlock in multipath
  * environment.
  */
-static void sd_default_probe(dev_t devt)
+static int sd_default_probe(dev_t devt)
 {
+	return 0;
 }
 
 /*
diff --git a/include/linux/genhd.h b/include/linux/genhd.h
index 59eabbc3a36b..016623245725 100644
--- a/include/linux/genhd.h
+++ b/include/linux/genhd.h
@@ -290,7 +290,7 @@ struct gendisk *__blk_alloc_disk(int node, struct lock_class_key *lkclass);
 void blk_cleanup_disk(struct gendisk *disk);
 
 int __register_blkdev(unsigned int major, const char *name,
-		void (*probe)(dev_t devt));
+		int (*probe)(dev_t devt));
 #define register_blkdev(major, name) \
 	__register_blkdev(major, name, NULL)
 void unregister_blkdev(unsigned int major, const char *name);
@@ -322,7 +322,7 @@ static inline int bd_register_pending_holders(struct gendisk *disk)
 dev_t part_devt(struct gendisk *disk, u8 partno);
 void inc_diskseq(struct gendisk *disk);
 dev_t blk_lookup_devt(const char *name, int partno);
-void blk_request_module(dev_t devt);
+int blk_request_module(dev_t devt);
 #ifdef CONFIG_BLOCK
 void printk_all_partitions(void);
 #else /* CONFIG_BLOCK */
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 12/13] block: make __register_blkdev() return an error
@ 2021-11-03 12:21   ` Luis Chamberlain
  0 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

This makes __register_blkdev() return an error, and also changes the
probe() call to return an error as well.

We expand documentation for the probe call to ensure that if the block
device already exists we don't return on error on that condition. We do
this as otherwise we loose ability to handle concurrent requests if the
block device already existed.

Cc: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 block/bdev.c            |  5 ++++-
 block/genhd.c           | 21 +++++++++++++++------
 drivers/block/ataflop.c | 19 ++++++++++++++-----
 drivers/block/brd.c     |  7 +++++--
 drivers/block/floppy.c  | 17 +++++++++++++----
 drivers/block/loop.c    | 11 ++++++++---
 drivers/md/md.c         | 12 +++++++++---
 drivers/scsi/sd.c       |  3 ++-
 include/linux/genhd.h   |  4 ++--
 9 files changed, 72 insertions(+), 27 deletions(-)

diff --git a/block/bdev.c b/block/bdev.c
index b4dab2fb6a74..876306c6ba6e 100644
--- a/block/bdev.c
+++ b/block/bdev.c
@@ -736,10 +736,13 @@ struct block_device *blkdev_get_no_open(dev_t dev)
 {
 	struct block_device *bdev;
 	struct inode *inode;
+	int ret;
 
 	inode = ilookup(blockdev_superblock, dev);
 	if (!inode) {
-		blk_request_module(dev);
+		ret = blk_request_module(dev);
+		if (ret)
+			return NULL;
 		inode = ilookup(blockdev_superblock, dev);
 		if (!inode)
 			return NULL;
diff --git a/block/genhd.c b/block/genhd.c
index febaaa55125a..7b56767e9e32 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -183,7 +183,7 @@ static struct blk_major_name {
 	struct blk_major_name *next;
 	int major;
 	char name[16];
-	void (*probe)(dev_t devt);
+	int (*probe)(dev_t devt);
 } *major_names[BLKDEV_MAJOR_HASH_SIZE];
 static DEFINE_MUTEX(major_names_lock);
 static DEFINE_SPINLOCK(major_names_spinlock);
@@ -213,7 +213,13 @@ void blkdev_show(struct seq_file *seqf, off_t offset)
  * @major: the requested major device number [1..BLKDEV_MAJOR_MAX-1]. If
  *         @major = 0, try to allocate any unused major number.
  * @name: the name of the new block device as a zero terminated string
- * @probe: allback that is called on access to any minor number of @major
+ * @probe: callback that is called on access to any minor number of @major.
+ * 	This will return 0 if the block device is already present or was
+ * 	not present and it succcessfully added a new one. If the block device
+ * 	was not already present but it was a valid request an error reflecting
+ * 	the reason why adding the block device is returned. An error should not
+ * 	be returned if the block device already exists as otherwise concurrent
+ * 	requests to open an existing block device would fail.
  *
  * The @name must be unique within the system.
  *
@@ -231,7 +237,7 @@ void blkdev_show(struct seq_file *seqf, off_t offset)
  * Use register_blkdev instead for any new code.
  */
 int __register_blkdev(unsigned int major, const char *name,
-		void (*probe)(dev_t devt))
+		int (*probe)(dev_t devt))
 {
 	struct blk_major_name **n, *p;
 	int index, ret = 0;
@@ -672,17 +678,18 @@ static ssize_t disk_badblocks_store(struct device *dev,
 	return badblocks_store(disk->bb, page, len, 0);
 }
 
-void blk_request_module(dev_t devt)
+int blk_request_module(dev_t devt)
 {
 	unsigned int major = MAJOR(devt);
 	struct blk_major_name **n;
+	int err;
 
 	mutex_lock(&major_names_lock);
 	for (n = &major_names[major_to_index(major)]; *n; n = &(*n)->next) {
 		if ((*n)->major == major && (*n)->probe) {
-			(*n)->probe(devt);
+			err = (*n)->probe(devt);
 			mutex_unlock(&major_names_lock);
-			return;
+			return err;
 		}
 	}
 	mutex_unlock(&major_names_lock);
@@ -690,6 +697,8 @@ void blk_request_module(dev_t devt)
 	if (request_module("block-major-%d-%d", MAJOR(devt), MINOR(devt)) > 0)
 		/* Make old-style 2.4 aliases work */
 		request_module("block-major-%d", MAJOR(devt));
+
+	return 0;
 }
 
 /*
diff --git a/drivers/block/ataflop.c b/drivers/block/ataflop.c
index 170dd193cef6..805c2d12e358 100644
--- a/drivers/block/ataflop.c
+++ b/drivers/block/ataflop.c
@@ -2008,22 +2008,31 @@ static int ataflop_alloc_disk(unsigned int drive, unsigned int type)
 	return 0;
 }
 
-static void ataflop_probe(dev_t dev)
+static int ataflop_probe(dev_t dev)
 {
 	int drive = MINOR(dev) & 3;
 	int type  = MINOR(dev) >> 2;
+	int err = 0;
 
 	if (type)
 		type--;
 
 	if (drive >= FD_MAX_UNITS || type >= NUM_DISK_MINORS)
-		return;
+		return -EINVAL;
+
 	if (!unit[drive].disk[type]) {
-		if (ataflop_alloc_disk(drive, type) == 0) {
-			add_disk(unit[drive].disk[type]);
-			unit[drive].registered[type] = true;
+		err = ataflop_alloc_disk(drive, type);
+		if (err == 0) {
+			err = add_disk(unit[drive].disk[type]);
+			if (err) {
+				blk_cleanup_disk(unit[drive].disk[type]);
+				unit[drive].disk[type] = NULL;
+			} else
+				unit[drive].registered[type] = true;
 		}
 	}
+
+	return err;
 }
 
 static void atari_floppy_cleanup(void)
diff --git a/drivers/block/brd.c b/drivers/block/brd.c
index a896ee175d86..fa6f532035fc 100644
--- a/drivers/block/brd.c
+++ b/drivers/block/brd.c
@@ -437,9 +437,12 @@ static int brd_alloc(int i)
 	return err;
 }
 
-static void brd_probe(dev_t dev)
+static int brd_probe(dev_t dev)
 {
-	brd_alloc(MINOR(dev) / max_part);
+	int ret =  brd_alloc(MINOR(dev) / max_part);
+	if (ret == -EEXIST)
+		return 0;
+	return ret;
 }
 
 static void brd_del_one(struct brd_device *brd)
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
index 3873e789478e..ff3422f517a6 100644
--- a/drivers/block/floppy.c
+++ b/drivers/block/floppy.c
@@ -4518,21 +4518,30 @@ static int floppy_alloc_disk(unsigned int drive, unsigned int type)
 
 static DEFINE_MUTEX(floppy_probe_lock);
 
-static void floppy_probe(dev_t dev)
+static int floppy_probe(dev_t dev)
 {
 	unsigned int drive = (MINOR(dev) & 3) | ((MINOR(dev) & 0x80) >> 5);
 	unsigned int type = (MINOR(dev) >> 2) & 0x1f;
+	int err = 0;
 
 	if (drive >= N_DRIVE || !floppy_available(drive) ||
 	    type >= ARRAY_SIZE(floppy_type))
-		return;
+		return -EINVAL;
 
 	mutex_lock(&floppy_probe_lock);
 	if (!disks[drive][type]) {
-		if (floppy_alloc_disk(drive, type) == 0)
-			add_disk(disks[drive][type]);
+		err = floppy_alloc_disk(drive, type);
+		if (err == 0) {
+			err = add_disk(disks[drive][type]);
+			if (err) {
+				blk_cleanup_disk(disks[drive][type]);
+				disks[drive][type] = NULL;
+			}
+		}
 	}
 	mutex_unlock(&floppy_probe_lock);
+
+	return err;
 }
 
 static int __init do_floppy_init(void)
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 3c09a33fa1c7..dfc2859274a4 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -2089,13 +2089,18 @@ static void loop_remove(struct loop_device *lo)
 	kfree(lo);
 }
 
-static void loop_probe(dev_t dev)
+static int loop_probe(dev_t dev)
 {
 	int idx = MINOR(dev) >> part_shift;
+	int ret;
 
 	if (max_loop && idx >= max_loop)
-		return;
-	loop_add(idx);
+		return -EINVAL;
+	ret = loop_add(idx);
+	if (ret == -EEXIST)
+		return 0;
+
+	return ret;
 }
 
 static int loop_control_remove(int idx)
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 5111ed966947..cdfabb90acb5 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -5737,12 +5737,18 @@ static int md_alloc(dev_t dev, char *name)
 	return error;
 }
 
-static void md_probe(dev_t dev)
+static int md_probe(dev_t dev)
 {
+	int error = 0;
+
 	if (MAJOR(dev) == MD_MAJOR && MINOR(dev) >= 512)
-		return;
+		return -EINVAL;
 	if (create_on_open)
-		md_alloc(dev, NULL);
+		error = md_alloc(dev, NULL);
+	if (error == -EEXIST)
+		return 0;
+
+	return error;
 }
 
 static int add_named_array(const char *val, const struct kernel_param *kp)
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 65875a598d62..a135d5c48829 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -632,8 +632,9 @@ static struct scsi_driver sd_template = {
  * Don't request a new module, as that could deadlock in multipath
  * environment.
  */
-static void sd_default_probe(dev_t devt)
+static int sd_default_probe(dev_t devt)
 {
+	return 0;
 }
 
 /*
diff --git a/include/linux/genhd.h b/include/linux/genhd.h
index 59eabbc3a36b..016623245725 100644
--- a/include/linux/genhd.h
+++ b/include/linux/genhd.h
@@ -290,7 +290,7 @@ struct gendisk *__blk_alloc_disk(int node, struct lock_class_key *lkclass);
 void blk_cleanup_disk(struct gendisk *disk);
 
 int __register_blkdev(unsigned int major, const char *name,
-		void (*probe)(dev_t devt));
+		int (*probe)(dev_t devt));
 #define register_blkdev(major, name) \
 	__register_blkdev(major, name, NULL)
 void unregister_blkdev(unsigned int major, const char *name);
@@ -322,7 +322,7 @@ static inline int bd_register_pending_holders(struct gendisk *disk)
 dev_t part_devt(struct gendisk *disk, u8 partno);
 void inc_diskseq(struct gendisk *disk);
 dev_t blk_lookup_devt(const char *name, int partno);
-void blk_request_module(dev_t devt);
+int blk_request_module(dev_t devt);
 #ifdef CONFIG_BLOCK
 void printk_all_partitions(void);
 #else /* CONFIG_BLOCK */
-- 
2.33.0


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 13/13] block: add __must_check for *add_disk*() callers
  2021-11-03 12:21 ` Luis Chamberlain
@ 2021-11-03 12:21   ` Luis Chamberlain
  -1 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

Now that we have done a spring cleaning on all drivers and added
error checking / handling, let's keep it that way and ensure
no new drivers fail to stick with it.

Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 block/genhd.c         | 6 +++---
 include/linux/genhd.h | 6 +++---
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/block/genhd.c b/block/genhd.c
index 7b56767e9e32..be4775c13760 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -397,8 +397,8 @@ static void disk_scan_partitions(struct gendisk *disk)
  * This function registers the partitioning information in @disk
  * with the kernel.
  */
-int device_add_disk(struct device *parent, struct gendisk *disk,
-		     const struct attribute_group **groups)
+int __must_check device_add_disk(struct device *parent, struct gendisk *disk,
+				 const struct attribute_group **groups)
 
 {
 	struct device *ddev = disk_to_dev(disk);
@@ -543,7 +543,7 @@ int device_add_disk(struct device *parent, struct gendisk *disk,
 out_free_ext_minor:
 	if (disk->major == BLOCK_EXT_MAJOR)
 		blk_free_ext_minor(disk->first_minor);
-	return WARN_ON_ONCE(ret); /* keep until all callers handle errors */
+	return ret;
 }
 EXPORT_SYMBOL(device_add_disk);
 
diff --git a/include/linux/genhd.h b/include/linux/genhd.h
index 016623245725..526ec4aaf85c 100644
--- a/include/linux/genhd.h
+++ b/include/linux/genhd.h
@@ -205,9 +205,9 @@ static inline dev_t disk_devt(struct gendisk *disk)
 void disk_uevent(struct gendisk *disk, enum kobject_action action);
 
 /* block/genhd.c */
-int device_add_disk(struct device *parent, struct gendisk *disk,
-		const struct attribute_group **groups);
-static inline int add_disk(struct gendisk *disk)
+int __must_check device_add_disk(struct device *parent, struct gendisk *disk,
+				 const struct attribute_group **groups);
+static inline int __must_check add_disk(struct gendisk *disk)
 {
 	return device_add_disk(NULL, disk, NULL);
 }
-- 
2.33.0


^ permalink raw reply related	[flat|nested] 62+ messages in thread

* [PATCH v2 13/13] block: add __must_check for *add_disk*() callers
@ 2021-11-03 12:21   ` Luis Chamberlain
  0 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 12:21 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, mcgrof
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

Now that we have done a spring cleaning on all drivers and added
error checking / handling, let's keep it that way and ensure
no new drivers fail to stick with it.

Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 block/genhd.c         | 6 +++---
 include/linux/genhd.h | 6 +++---
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/block/genhd.c b/block/genhd.c
index 7b56767e9e32..be4775c13760 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -397,8 +397,8 @@ static void disk_scan_partitions(struct gendisk *disk)
  * This function registers the partitioning information in @disk
  * with the kernel.
  */
-int device_add_disk(struct device *parent, struct gendisk *disk,
-		     const struct attribute_group **groups)
+int __must_check device_add_disk(struct device *parent, struct gendisk *disk,
+				 const struct attribute_group **groups)
 
 {
 	struct device *ddev = disk_to_dev(disk);
@@ -543,7 +543,7 @@ int device_add_disk(struct device *parent, struct gendisk *disk,
 out_free_ext_minor:
 	if (disk->major == BLOCK_EXT_MAJOR)
 		blk_free_ext_minor(disk->first_minor);
-	return WARN_ON_ONCE(ret); /* keep until all callers handle errors */
+	return ret;
 }
 EXPORT_SYMBOL(device_add_disk);
 
diff --git a/include/linux/genhd.h b/include/linux/genhd.h
index 016623245725..526ec4aaf85c 100644
--- a/include/linux/genhd.h
+++ b/include/linux/genhd.h
@@ -205,9 +205,9 @@ static inline dev_t disk_devt(struct gendisk *disk)
 void disk_uevent(struct gendisk *disk, enum kobject_action action);
 
 /* block/genhd.c */
-int device_add_disk(struct device *parent, struct gendisk *disk,
-		const struct attribute_group **groups);
-static inline int add_disk(struct gendisk *disk)
+int __must_check device_add_disk(struct device *parent, struct gendisk *disk,
+				 const struct attribute_group **groups);
+static inline int __must_check add_disk(struct gendisk *disk)
 {
 	return device_add_disk(NULL, disk, NULL);
 }
-- 
2.33.0


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply related	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 01/13] nvdimm/btt: do not call del_gendisk() if not needed
  2021-11-03 12:21   ` Luis Chamberlain
@ 2021-11-03 16:02     ` Christoph Hellwig
  -1 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 16:02 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:21:45AM -0700, Luis Chamberlain wrote:
> del_gendisk() is not required if the disk has not been added.
> On kernels prior to commit 40b3a52ffc5bc3 ("block: add a sanity
> check for a live disk in del_gendisk") it is mandatory to not
> call del_gendisk() if the underlying device has not been through
> device_add().

And even with the sanity check is it wrong, and will trigger a WARN_ON.
So maybe this commit log could use a little update?

With that fixed I think this should go into 5.16 and -stable.

Reviewed-by: Christoph Hellwig <hch@lst.de>

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 01/13] nvdimm/btt: do not call del_gendisk() if not needed
@ 2021-11-03 16:02     ` Christoph Hellwig
  0 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 16:02 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:21:45AM -0700, Luis Chamberlain wrote:
> del_gendisk() is not required if the disk has not been added.
> On kernels prior to commit 40b3a52ffc5bc3 ("block: add a sanity
> check for a live disk in del_gendisk") it is mandatory to not
> call del_gendisk() if the underlying device has not been through
> device_add().

And even with the sanity check is it wrong, and will trigger a WARN_ON.
So maybe this commit log could use a little update?

With that fixed I think this should go into 5.16 and -stable.

Reviewed-by: Christoph Hellwig <hch@lst.de>

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 02/13] nvdimm/btt: use goto error labels on btt_blk_init()
  2021-11-03 12:21   ` Luis Chamberlain
@ 2021-11-03 16:02     ` Christoph Hellwig
  -1 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 16:02 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

Looks good,

Reviewed-by: Christoph Hellwig <hch@lst.de>

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 02/13] nvdimm/btt: use goto error labels on btt_blk_init()
@ 2021-11-03 16:02     ` Christoph Hellwig
  0 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 16:02 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

Looks good,

Reviewed-by: Christoph Hellwig <hch@lst.de>

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 03/13] nvdimm/btt: add error handling support for add_disk()
  2021-11-03 12:21   ` Luis Chamberlain
@ 2021-11-03 16:04     ` Christoph Hellwig
  -1 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 16:04 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:21:47AM -0700, Luis Chamberlain wrote:
> We never checked for errors on add_disk() as this function
> returned void. Now that this is fixed, use the shiny new
> error handling.

Look good:

Reviewed-by: Christoph Hellwig <hch@lst.de>

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 03/13] nvdimm/btt: add error handling support for add_disk()
@ 2021-11-03 16:04     ` Christoph Hellwig
  0 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 16:04 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:21:47AM -0700, Luis Chamberlain wrote:
> We never checked for errors on add_disk() as this function
> returned void. Now that this is fixed, use the shiny new
> error handling.

Look good:

Reviewed-by: Christoph Hellwig <hch@lst.de>

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 04/13] nvdimm/blk: avoid calling del_gendisk() on early failures
  2021-11-03 12:21   ` Luis Chamberlain
@ 2021-11-03 16:05     ` Christoph Hellwig
  -1 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 16:05 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:21:48AM -0700, Luis Chamberlain wrote:
> If nd_integrity_init() fails we'd get del_gendisk() called,
> but that's not correct as we should only call that if we're
> done with device_add_disk(). Fix this by providing unwinding
> prior to the devm call being registered and moving the devm
> registration to the very end.
> 
> This should fix calling del_gendisk() if nd_integrity_init()
> fails. I only spotted this issue through code inspection. It
> does not fix any real world bug.

Looks good,

Reviewed-by: Christoph Hellwig <hch@lst.de>

Should this grow a Fixes tag for the commit adding the problem?

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 04/13] nvdimm/blk: avoid calling del_gendisk() on early failures
@ 2021-11-03 16:05     ` Christoph Hellwig
  0 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 16:05 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:21:48AM -0700, Luis Chamberlain wrote:
> If nd_integrity_init() fails we'd get del_gendisk() called,
> but that's not correct as we should only call that if we're
> done with device_add_disk(). Fix this by providing unwinding
> prior to the devm call being registered and moving the devm
> registration to the very end.
> 
> This should fix calling del_gendisk() if nd_integrity_init()
> fails. I only spotted this issue through code inspection. It
> does not fix any real world bug.

Looks good,

Reviewed-by: Christoph Hellwig <hch@lst.de>

Should this grow a Fixes tag for the commit adding the problem?

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 05/13] nvdimm/blk: add error handling support for add_disk()
  2021-11-03 12:21   ` Luis Chamberlain
@ 2021-11-03 16:06     ` Christoph Hellwig
  -1 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 16:06 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

Looks good,

Reviewed-by: Christoph Hellwig <hch@lst.de>

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 05/13] nvdimm/blk: add error handling support for add_disk()
@ 2021-11-03 16:06     ` Christoph Hellwig
  0 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 16:06 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

Looks good,

Reviewed-by: Christoph Hellwig <hch@lst.de>

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 06/13] nvdimm/pmem: cleanup the disk if pmem_release_disk() is yet assigned
  2021-11-03 12:21   ` Luis Chamberlain
@ 2021-11-03 16:06     ` Christoph Hellwig
  -1 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 16:06 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:21:50AM -0700, Luis Chamberlain wrote:
> Prior to devm being able to use pmem_release_disk() there are other
> failure which can occur for which we must account for and release the
> disk for. Address those few cases.
> 
> Fixes: 3dd60fb9d95d ("nvdimm/pmem: stop using q_usage_count as external pgmap refcount")
> Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>

Looks good,

Reviewed-by: Christoph Hellwig <hch@lst.de>

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 06/13] nvdimm/pmem: cleanup the disk if pmem_release_disk() is yet assigned
@ 2021-11-03 16:06     ` Christoph Hellwig
  0 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 16:06 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:21:50AM -0700, Luis Chamberlain wrote:
> Prior to devm being able to use pmem_release_disk() there are other
> failure which can occur for which we must account for and release the
> disk for. Address those few cases.
> 
> Fixes: 3dd60fb9d95d ("nvdimm/pmem: stop using q_usage_count as external pgmap refcount")
> Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>

Looks good,

Reviewed-by: Christoph Hellwig <hch@lst.de>

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 07/13] nvdimm/pmem: use add_disk() error handling
  2021-11-03 12:21   ` Luis Chamberlain
@ 2021-11-03 16:06     ` Christoph Hellwig
  -1 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 16:06 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:21:51AM -0700, Luis Chamberlain wrote:
> Now that device_add_disk() supports returning an error, use
> that. We must unwind alloc_dax() on error.

Looks good,

Reviewed-by: Christoph Hellwig <hch@lst.de>

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 07/13] nvdimm/pmem: use add_disk() error handling
@ 2021-11-03 16:06     ` Christoph Hellwig
  0 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 16:06 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:21:51AM -0700, Luis Chamberlain wrote:
> Now that device_add_disk() supports returning an error, use
> that. We must unwind alloc_dax() on error.

Looks good,

Reviewed-by: Christoph Hellwig <hch@lst.de>

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 08/13] z2ram: add error handling support for add_disk()
  2021-11-03 12:21   ` Luis Chamberlain
@ 2021-11-03 16:07     ` Christoph Hellwig
  -1 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 16:07 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:21:52AM -0700, Luis Chamberlain wrote:
> We never checked for errors on add_disk() as this function
> returned void. Now that this is fixed, use the shiny new
> error handling. Only the disk is cleaned up inside
> z2ram_register_disk() as the caller deals with the rest.

Looks good,

Reviewed-by: Christoph Hellwig <hch@lst.de>

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 08/13] z2ram: add error handling support for add_disk()
@ 2021-11-03 16:07     ` Christoph Hellwig
  0 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 16:07 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:21:52AM -0700, Luis Chamberlain wrote:
> We never checked for errors on add_disk() as this function
> returned void. Now that this is fixed, use the shiny new
> error handling. Only the disk is cleaned up inside
> z2ram_register_disk() as the caller deals with the rest.

Looks good,

Reviewed-by: Christoph Hellwig <hch@lst.de>

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 09/13] block/sunvdc: add error handling support for add_disk()
  2021-11-03 12:21   ` Luis Chamberlain
@ 2021-11-03 16:07     ` Christoph Hellwig
  -1 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 16:07 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:21:53AM -0700, Luis Chamberlain wrote:
> We never checked for errors on add_disk() as this function
> returned void. Now that this is fixed, use the shiny new
> error handling.
> 
> We re-use the same free tag call, so we also add a label for
> that as well.

Looks good,

Reviewed-by: Christoph Hellwig <hch@lst.de>

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 09/13] block/sunvdc: add error handling support for add_disk()
@ 2021-11-03 16:07     ` Christoph Hellwig
  0 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 16:07 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:21:53AM -0700, Luis Chamberlain wrote:
> We never checked for errors on add_disk() as this function
> returned void. Now that this is fixed, use the shiny new
> error handling.
> 
> We re-use the same free tag call, so we also add a label for
> that as well.

Looks good,

Reviewed-by: Christoph Hellwig <hch@lst.de>

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 10/13] mtd/ubi/block: add error handling support for add_disk()
  2021-11-03 12:21   ` Luis Chamberlain
@ 2021-11-03 16:07     ` Christoph Hellwig
  -1 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 16:07 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:21:54AM -0700, Luis Chamberlain wrote:
> We never checked for errors on add_disk() as this function
> returned void. Now that this is fixed, use the shiny new
> error handling.

Looks good,

Reviewed-by: Christoph Hellwig <hch@lst.de>

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 10/13] mtd/ubi/block: add error handling support for add_disk()
@ 2021-11-03 16:07     ` Christoph Hellwig
  0 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 16:07 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:21:54AM -0700, Luis Chamberlain wrote:
> We never checked for errors on add_disk() as this function
> returned void. Now that this is fixed, use the shiny new
> error handling.

Looks good,

Reviewed-by: Christoph Hellwig <hch@lst.de>

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 12/13] block: make __register_blkdev() return an error
  2021-11-03 12:21   ` Luis Chamberlain
@ 2021-11-03 16:09     ` Christoph Hellwig
  -1 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 16:09 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:21:56AM -0700, Luis Chamberlain wrote:
> This makes __register_blkdev() return an error, and also changes the
> probe() call to return an error as well.
> 
> We expand documentation for the probe call to ensure that if the block
> device already exists we don't return on error on that condition. We do
> this as otherwise we loose ability to handle concurrent requests if the
> block device already existed.

I'm still not really sold on this - if the probe fails no bdev will
be registered and the lookup will fail.  What is the benefit of
propagating the exact error here?

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 12/13] block: make __register_blkdev() return an error
@ 2021-11-03 16:09     ` Christoph Hellwig
  0 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 16:09 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:21:56AM -0700, Luis Chamberlain wrote:
> This makes __register_blkdev() return an error, and also changes the
> probe() call to return an error as well.
> 
> We expand documentation for the probe call to ensure that if the block
> device already exists we don't return on error on that condition. We do
> this as otherwise we loose ability to handle concurrent requests if the
> block device already existed.

I'm still not really sold on this - if the probe fails no bdev will
be registered and the lookup will fail.  What is the benefit of
propagating the exact error here?

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 12/13] block: make __register_blkdev() return an error
  2021-11-03 16:09     ` Christoph Hellwig
@ 2021-11-03 16:44       ` Luis Chamberlain
  -1 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 16:44 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: axboe, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:09:33PM +0100, Christoph Hellwig wrote:
> On Wed, Nov 03, 2021 at 05:21:56AM -0700, Luis Chamberlain wrote:
> > This makes __register_blkdev() return an error, and also changes the
> > probe() call to return an error as well.
> > 
> > We expand documentation for the probe call to ensure that if the block
> > device already exists we don't return on error on that condition. We do
> > this as otherwise we loose ability to handle concurrent requests if the
> > block device already existed.
> 
> I'm still not really sold on this - if the probe fails no bdev will
> be registered and the lookup will fail.  What is the benefit of
> propagating the exact error here?

Here's the thing, prober call a form of add_disk(), and so do we want
to always ignore the errors on probe? If so we should document why that
is sane then. I think this approach is a bit more sane though.

  Luis

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 12/13] block: make __register_blkdev() return an error
@ 2021-11-03 16:44       ` Luis Chamberlain
  0 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 16:44 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: axboe, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:09:33PM +0100, Christoph Hellwig wrote:
> On Wed, Nov 03, 2021 at 05:21:56AM -0700, Luis Chamberlain wrote:
> > This makes __register_blkdev() return an error, and also changes the
> > probe() call to return an error as well.
> > 
> > We expand documentation for the probe call to ensure that if the block
> > device already exists we don't return on error on that condition. We do
> > this as otherwise we loose ability to handle concurrent requests if the
> > block device already existed.
> 
> I'm still not really sold on this - if the probe fails no bdev will
> be registered and the lookup will fail.  What is the benefit of
> propagating the exact error here?

Here's the thing, prober call a form of add_disk(), and so do we want
to always ignore the errors on probe? If so we should document why that
is sane then. I think this approach is a bit more sane though.

  Luis

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 04/13] nvdimm/blk: avoid calling del_gendisk() on early failures
  2021-11-03 16:05     ` Christoph Hellwig
@ 2021-11-03 16:47       ` Luis Chamberlain
  -1 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 16:47 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: axboe, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:05:47PM +0100, Christoph Hellwig wrote:
> On Wed, Nov 03, 2021 at 05:21:48AM -0700, Luis Chamberlain wrote:
> > If nd_integrity_init() fails we'd get del_gendisk() called,
> > but that's not correct as we should only call that if we're
> > done with device_add_disk(). Fix this by providing unwinding
> > prior to the devm call being registered and moving the devm
> > registration to the very end.
> > 
> > This should fix calling del_gendisk() if nd_integrity_init()
> > fails. I only spotted this issue through code inspection. It
> > does not fix any real world bug.
> 
> Looks good,
> 
> Reviewed-by: Christoph Hellwig <hch@lst.de>
> 
> Should this grow a Fixes tag for the commit adding the problem?

Given this driver is going to be removed, do we care? The only
reason I re-added the patch was Dan could not remove the driver
on time.

  Luis

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 04/13] nvdimm/blk: avoid calling del_gendisk() on early failures
@ 2021-11-03 16:47       ` Luis Chamberlain
  0 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 16:47 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: axboe, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:05:47PM +0100, Christoph Hellwig wrote:
> On Wed, Nov 03, 2021 at 05:21:48AM -0700, Luis Chamberlain wrote:
> > If nd_integrity_init() fails we'd get del_gendisk() called,
> > but that's not correct as we should only call that if we're
> > done with device_add_disk(). Fix this by providing unwinding
> > prior to the devm call being registered and moving the devm
> > registration to the very end.
> > 
> > This should fix calling del_gendisk() if nd_integrity_init()
> > fails. I only spotted this issue through code inspection. It
> > does not fix any real world bug.
> 
> Looks good,
> 
> Reviewed-by: Christoph Hellwig <hch@lst.de>
> 
> Should this grow a Fixes tag for the commit adding the problem?

Given this driver is going to be removed, do we care? The only
reason I re-added the patch was Dan could not remove the driver
on time.

  Luis

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 01/13] nvdimm/btt: do not call del_gendisk() if not needed
  2021-11-03 16:02     ` Christoph Hellwig
@ 2021-11-03 16:58       ` Luis Chamberlain
  -1 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 16:58 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: axboe, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:02:43PM +0100, Christoph Hellwig wrote:
> On Wed, Nov 03, 2021 at 05:21:45AM -0700, Luis Chamberlain wrote:
> > del_gendisk() is not required if the disk has not been added.
> > On kernels prior to commit 40b3a52ffc5bc3 ("block: add a sanity
> > check for a live disk in del_gendisk") it is mandatory to not
> > call del_gendisk() if the underlying device has not been through
> > device_add().
> 
> And even with the sanity check is it wrong, and will trigger a WARN_ON.
> So maybe this commit log could use a little update?
> 
> With that fixed I think this should go into 5.16 and -stable.
> 
> Reviewed-by: Christoph Hellwig <hch@lst.de>

OK true, the first WARN_ON() was added on v5.11 through commit 6b3ba9762f9f9
("block: cleanup del_gendisk a bit") though, before that, it is still
wrong. Will send a v3 for this patch alone.

  Luis

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 01/13] nvdimm/btt: do not call del_gendisk() if not needed
@ 2021-11-03 16:58       ` Luis Chamberlain
  0 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 16:58 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: axboe, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:02:43PM +0100, Christoph Hellwig wrote:
> On Wed, Nov 03, 2021 at 05:21:45AM -0700, Luis Chamberlain wrote:
> > del_gendisk() is not required if the disk has not been added.
> > On kernels prior to commit 40b3a52ffc5bc3 ("block: add a sanity
> > check for a live disk in del_gendisk") it is mandatory to not
> > call del_gendisk() if the underlying device has not been through
> > device_add().
> 
> And even with the sanity check is it wrong, and will trigger a WARN_ON.
> So maybe this commit log could use a little update?
> 
> With that fixed I think this should go into 5.16 and -stable.
> 
> Reviewed-by: Christoph Hellwig <hch@lst.de>

OK true, the first WARN_ON() was added on v5.11 through commit 6b3ba9762f9f9
("block: cleanup del_gendisk a bit") though, before that, it is still
wrong. Will send a v3 for this patch alone.

  Luis

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 12/13] block: make __register_blkdev() return an error
  2021-11-03 16:44       ` Luis Chamberlain
@ 2021-11-03 17:00         ` Christoph Hellwig
  -1 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 17:00 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: Christoph Hellwig, axboe, penguin-kernel, dan.j.williams,
	vishal.l.verma, dave.jiang, ira.weiny, richard, miquel.raynal,
	vigneshr, efremov, song, martin.petersen, hare, jack, ming.lei,
	tj, linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 09:44:53AM -0700, Luis Chamberlain wrote:
> Here's the thing, prober call a form of add_disk(), and so do we want
> to always ignore the errors on probe? If so we should document why that
> is sane then. I think this approach is a bit more sane though.

I suspect the right thing is to just kill of ->probe.

The only thing it supports is pre-devtmpfs, pre-udev semantics that
want to magically create disks when their pre-created device node
is accesses.  But if we don't remove it, yes I think not reporting
the error is best.  Just clean up whatever local resources were set
up in the ->probe method and let the open fail without the need of
passing on the actual error.

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 12/13] block: make __register_blkdev() return an error
@ 2021-11-03 17:00         ` Christoph Hellwig
  0 siblings, 0 replies; 62+ messages in thread
From: Christoph Hellwig @ 2021-11-03 17:00 UTC (permalink / raw)
  To: Luis Chamberlain
  Cc: Christoph Hellwig, axboe, penguin-kernel, dan.j.williams,
	vishal.l.verma, dave.jiang, ira.weiny, richard, miquel.raynal,
	vigneshr, efremov, song, martin.petersen, hare, jack, ming.lei,
	tj, linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 09:44:53AM -0700, Luis Chamberlain wrote:
> Here's the thing, prober call a form of add_disk(), and so do we want
> to always ignore the errors on probe? If so we should document why that
> is sane then. I think this approach is a bit more sane though.

I suspect the right thing is to just kill of ->probe.

The only thing it supports is pre-devtmpfs, pre-udev semantics that
want to magically create disks when their pre-created device node
is accesses.  But if we don't remove it, yes I think not reporting
the error is best.  Just clean up whatever local resources were set
up in the ->probe method and let the open fail without the need of
passing on the actual error.

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 12/13] block: make __register_blkdev() return an error
  2021-11-03 17:00         ` Christoph Hellwig
@ 2021-11-03 17:03           ` Luis Chamberlain
  -1 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 17:03 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: axboe, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 06:00:49PM +0100, Christoph Hellwig wrote:
> On Wed, Nov 03, 2021 at 09:44:53AM -0700, Luis Chamberlain wrote:
> > Here's the thing, prober call a form of add_disk(), and so do we want
> > to always ignore the errors on probe? If so we should document why that
> > is sane then. I think this approach is a bit more sane though.
> 
> I suspect the right thing is to just kill of ->probe.
> 
> The only thing it supports is pre-devtmpfs, pre-udev semantics that
> want to magically create disks when their pre-created device node
> is accesses.

That sounds like a possible userspace impact? And so not for v5.16 for
sure.

> But if we don't remove it, yes I think not reporting
> the error is best.  Just clean up whatever local resources were set
> up in the ->probe method and let the open fail without the need of
> passing on the actual error.

Alright, I'll do that and send a final v3 for the last 2 patches.

  Luis

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 12/13] block: make __register_blkdev() return an error
@ 2021-11-03 17:03           ` Luis Chamberlain
  0 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 17:03 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: axboe, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj, linux-mtd,
	linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 06:00:49PM +0100, Christoph Hellwig wrote:
> On Wed, Nov 03, 2021 at 09:44:53AM -0700, Luis Chamberlain wrote:
> > Here's the thing, prober call a form of add_disk(), and so do we want
> > to always ignore the errors on probe? If so we should document why that
> > is sane then. I think this approach is a bit more sane though.
> 
> I suspect the right thing is to just kill of ->probe.
> 
> The only thing it supports is pre-devtmpfs, pre-udev semantics that
> want to magically create disks when their pre-created device node
> is accesses.

That sounds like a possible userspace impact? And so not for v5.16 for
sure.

> But if we don't remove it, yes I think not reporting
> the error is best.  Just clean up whatever local resources were set
> up in the ->probe method and let the open fail without the need of
> passing on the actual error.

Alright, I'll do that and send a final v3 for the last 2 patches.

  Luis

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 00/13] block: add_disk() error handling stragglers
  2021-11-03 12:21 ` Luis Chamberlain
@ 2021-11-03 17:41   ` Luis Chamberlain
  -1 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 17:41 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:21:44AM -0700, Luis Chamberlain wrote:
> This is the last pending changes to address add_disk() error handling
> completely. Changes on this v2 series:
> 
>   o dropped all patches which folks have said they'd pick up on their
>     own trees or that I already see present on linux-next
>   o rebased onto next-20211103
>   o Added Reviewed-by tag by Dan Williams and addressed his recommended
>     changes.
>   o Re-added the nvdimm/blk changes given Dan Williams was not able to
>     remove the driver in time for v5.16
>   o Added new nvdimm/pmem driver changes, not sure how I missed addressing
>     this before.
>   o Just note that I keep Tetsuo Handa's patch in this series as it is
>     a requirement for the __register_blkdev() changes.

I'll just send a v3 series which collects all reviewed-by tags and with
the updates.

  Luis

^ permalink raw reply	[flat|nested] 62+ messages in thread

* Re: [PATCH v2 00/13] block: add_disk() error handling stragglers
@ 2021-11-03 17:41   ` Luis Chamberlain
  0 siblings, 0 replies; 62+ messages in thread
From: Luis Chamberlain @ 2021-11-03 17:41 UTC (permalink / raw)
  To: axboe, hch, penguin-kernel, dan.j.williams, vishal.l.verma,
	dave.jiang, ira.weiny, richard, miquel.raynal, vigneshr, efremov,
	song, martin.petersen, hare, jack, ming.lei, tj
  Cc: linux-mtd, linux-scsi, linux-raid, linux-block, linux-kernel

On Wed, Nov 03, 2021 at 05:21:44AM -0700, Luis Chamberlain wrote:
> This is the last pending changes to address add_disk() error handling
> completely. Changes on this v2 series:
> 
>   o dropped all patches which folks have said they'd pick up on their
>     own trees or that I already see present on linux-next
>   o rebased onto next-20211103
>   o Added Reviewed-by tag by Dan Williams and addressed his recommended
>     changes.
>   o Re-added the nvdimm/blk changes given Dan Williams was not able to
>     remove the driver in time for v5.16
>   o Added new nvdimm/pmem driver changes, not sure how I missed addressing
>     this before.
>   o Just note that I keep Tetsuo Handa's patch in this series as it is
>     a requirement for the __register_blkdev() changes.

I'll just send a v3 series which collects all reviewed-by tags and with
the updates.

  Luis

______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

^ permalink raw reply	[flat|nested] 62+ messages in thread

end of thread, other threads:[~2021-11-03 17:42 UTC | newest]

Thread overview: 62+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-03 12:21 [PATCH v2 00/13] block: add_disk() error handling stragglers Luis Chamberlain
2021-11-03 12:21 ` Luis Chamberlain
2021-11-03 12:21 ` [PATCH v2 01/13] nvdimm/btt: do not call del_gendisk() if not needed Luis Chamberlain
2021-11-03 12:21   ` Luis Chamberlain
2021-11-03 16:02   ` Christoph Hellwig
2021-11-03 16:02     ` Christoph Hellwig
2021-11-03 16:58     ` Luis Chamberlain
2021-11-03 16:58       ` Luis Chamberlain
2021-11-03 12:21 ` [PATCH v2 02/13] nvdimm/btt: use goto error labels on btt_blk_init() Luis Chamberlain
2021-11-03 12:21   ` Luis Chamberlain
2021-11-03 16:02   ` Christoph Hellwig
2021-11-03 16:02     ` Christoph Hellwig
2021-11-03 12:21 ` [PATCH v2 03/13] nvdimm/btt: add error handling support for add_disk() Luis Chamberlain
2021-11-03 12:21   ` Luis Chamberlain
2021-11-03 16:04   ` Christoph Hellwig
2021-11-03 16:04     ` Christoph Hellwig
2021-11-03 12:21 ` [PATCH v2 04/13] nvdimm/blk: avoid calling del_gendisk() on early failures Luis Chamberlain
2021-11-03 12:21   ` Luis Chamberlain
2021-11-03 16:05   ` Christoph Hellwig
2021-11-03 16:05     ` Christoph Hellwig
2021-11-03 16:47     ` Luis Chamberlain
2021-11-03 16:47       ` Luis Chamberlain
2021-11-03 12:21 ` [PATCH v2 05/13] nvdimm/blk: add error handling support for add_disk() Luis Chamberlain
2021-11-03 12:21   ` Luis Chamberlain
2021-11-03 16:06   ` Christoph Hellwig
2021-11-03 16:06     ` Christoph Hellwig
2021-11-03 12:21 ` [PATCH v2 06/13] nvdimm/pmem: cleanup the disk if pmem_release_disk() is yet assigned Luis Chamberlain
2021-11-03 12:21   ` Luis Chamberlain
2021-11-03 16:06   ` Christoph Hellwig
2021-11-03 16:06     ` Christoph Hellwig
2021-11-03 12:21 ` [PATCH v2 07/13] nvdimm/pmem: use add_disk() error handling Luis Chamberlain
2021-11-03 12:21   ` Luis Chamberlain
2021-11-03 16:06   ` Christoph Hellwig
2021-11-03 16:06     ` Christoph Hellwig
2021-11-03 12:21 ` [PATCH v2 08/13] z2ram: add error handling support for add_disk() Luis Chamberlain
2021-11-03 12:21   ` Luis Chamberlain
2021-11-03 16:07   ` Christoph Hellwig
2021-11-03 16:07     ` Christoph Hellwig
2021-11-03 12:21 ` [PATCH v2 09/13] block/sunvdc: " Luis Chamberlain
2021-11-03 12:21   ` Luis Chamberlain
2021-11-03 16:07   ` Christoph Hellwig
2021-11-03 16:07     ` Christoph Hellwig
2021-11-03 12:21 ` [PATCH v2 10/13] mtd/ubi/block: " Luis Chamberlain
2021-11-03 12:21   ` Luis Chamberlain
2021-11-03 16:07   ` Christoph Hellwig
2021-11-03 16:07     ` Christoph Hellwig
2021-11-03 12:21 ` [PATCH v2 11/13] ataflop: remove ataflop_probe_lock mutex Luis Chamberlain
2021-11-03 12:21   ` Luis Chamberlain
2021-11-03 12:21 ` [PATCH v2 12/13] block: make __register_blkdev() return an error Luis Chamberlain
2021-11-03 12:21   ` Luis Chamberlain
2021-11-03 16:09   ` Christoph Hellwig
2021-11-03 16:09     ` Christoph Hellwig
2021-11-03 16:44     ` Luis Chamberlain
2021-11-03 16:44       ` Luis Chamberlain
2021-11-03 17:00       ` Christoph Hellwig
2021-11-03 17:00         ` Christoph Hellwig
2021-11-03 17:03         ` Luis Chamberlain
2021-11-03 17:03           ` Luis Chamberlain
2021-11-03 12:21 ` [PATCH v2 13/13] block: add __must_check for *add_disk*() callers Luis Chamberlain
2021-11-03 12:21   ` Luis Chamberlain
2021-11-03 17:41 ` [PATCH v2 00/13] block: add_disk() error handling stragglers Luis Chamberlain
2021-11-03 17:41   ` Luis Chamberlain

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.