linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] Introduce device_add_disk() to kill gendisk.driverfs_dev
@ 2016-02-25 20:04 Dan Williams
  2016-02-25 20:04 ` [PATCH 1/3] block: introduce device_add_disk() Dan Williams
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Dan Williams @ 2016-02-25 20:04 UTC (permalink / raw)
  To: axboe
  Cc: linux-block, Ulf Hansson, Martin K. Petersen,
	Konrad Rzeszutek Wilk, James E.J. Bottomley, linux-kernel,
	David S. Miller, Keith Busch, Michael S. Tsirkin, Ross Zwisler,
	David Woodhouse, hch

Answer the "// FIXME: remove" include/linux/genhd.h.  This should be
functionally equivalent to the previous state.  Now that the WARN_ON()
for the registration failure case is up-levelled to some drivers, they
can take on the follow on work to handle device_add_disk() failures.

Note, a full run from the kbuild robot is still pending.  I'll post v2
if it reports anything against this set on top of current -next.

---

Dan Williams (3):
      block: introduce device_add_disk()
      block: convert to device_add_disk()
      block: remove ->driverfs_dev


 arch/powerpc/sysdev/axonram.c       |    3 +--
 arch/um/drivers/ubd_kern.c          |    3 +--
 block/genhd.c                       |   27 ++++++++++++---------------
 drivers/block/cciss.c               |    3 +--
 drivers/block/floppy.c              |    4 ++--
 drivers/block/mtip32xx/mtip32xx.c   |    5 ++---
 drivers/block/ps3disk.c             |    3 +--
 drivers/block/ps3vram.c             |    3 +--
 drivers/block/rsxx/dev.c            |    4 +---
 drivers/block/skd_main.c            |    8 +++-----
 drivers/block/sunvdc.c              |    3 +--
 drivers/block/virtio_blk.c          |    3 +--
 drivers/block/xen-blkfront.c        |    3 +--
 drivers/ide/ide-cd.c                |    3 +--
 drivers/ide/ide-gd.c                |    3 +--
 drivers/memstick/core/ms_block.c    |    3 +--
 drivers/memstick/core/mspro_block.c |    3 +--
 drivers/mmc/card/block.c            |    3 +--
 drivers/mtd/mtd_blkdevs.c           |    4 +---
 drivers/nvdimm/blk.c                |    3 +--
 drivers/nvdimm/btt.c                |    3 +--
 drivers/nvdimm/bus.c                |    2 +-
 drivers/nvdimm/pmem.c               |    3 +--
 drivers/nvme/host/core.c            |    3 +--
 drivers/s390/block/dasd_genhd.c     |    3 +--
 drivers/s390/block/dcssblk.c        |    3 +--
 drivers/s390/block/scm_blk.c        |    3 +--
 drivers/scsi/sd.c                   |    3 +--
 drivers/scsi/sr.c                   |    3 +--
 include/linux/genhd.h               |    8 ++++++--
 30 files changed, 50 insertions(+), 78 deletions(-)

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

* [PATCH 1/3] block: introduce device_add_disk()
  2016-02-25 20:04 [PATCH 0/3] Introduce device_add_disk() to kill gendisk.driverfs_dev Dan Williams
@ 2016-02-25 20:04 ` Dan Williams
  2016-03-10  8:09   ` Christoph Hellwig
  2016-02-25 20:04 ` [PATCH 2/3] block: convert to device_add_disk() Dan Williams
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 9+ messages in thread
From: Dan Williams @ 2016-02-25 20:04 UTC (permalink / raw)
  To: axboe; +Cc: linux-block, linux-kernel, hch

In preparation for removing the ->driverfs_dev member of a gendisk, add
an api that takes the parent device as a parameter to add_disk().

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
---
 block/genhd.c         |   22 ++++++++++------------
 include/linux/genhd.h |    8 +++++++-
 2 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/block/genhd.c b/block/genhd.c
index eb05dfc1dffe..3fa2654ada52 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -506,7 +506,7 @@ static int exact_lock(dev_t devt, void *data)
 	return 0;
 }
 
-static void register_disk(struct gendisk *disk)
+static void register_disk(struct device *parent, struct gendisk *disk)
 {
 	struct device *ddev = disk_to_dev(disk);
 	struct block_device *bdev;
@@ -514,7 +514,7 @@ static void register_disk(struct gendisk *disk)
 	struct hd_struct *part;
 	int err;
 
-	ddev->parent = disk->driverfs_dev;
+	ddev->parent = parent;
 
 	dev_set_name(ddev, "%s", disk->disk_name);
 
@@ -573,7 +573,8 @@ exit:
 }
 
 /**
- * add_disk - add partitioning information to kernel list
+ * device_add_disk - add partitioning information to kernel list
+ * @parent: parent device for the disk
  * @disk: per-device partitioning information
  *
  * This function registers the partitioning information in @disk
@@ -581,7 +582,7 @@ exit:
  *
  * FIXME: error handling
  */
-void add_disk(struct gendisk *disk)
+int device_add_disk(struct device *parent, struct gendisk *disk)
 {
 	struct backing_dev_info *bdi;
 	dev_t devt;
@@ -597,10 +598,8 @@ void add_disk(struct gendisk *disk)
 	disk->flags |= GENHD_FL_UP;
 
 	retval = blk_alloc_devt(&disk->part0, &devt);
-	if (retval) {
-		WARN_ON(1);
-		return;
-	}
+	if (retval)
+		return retval;
 	disk_to_dev(disk)->devt = devt;
 
 	/* ->major and ->first_minor aren't supposed to be
@@ -617,7 +616,7 @@ void add_disk(struct gendisk *disk)
 
 	blk_register_region(disk_devt(disk), disk->minors, NULL,
 			    exact_match, exact_lock, disk);
-	register_disk(disk);
+	register_disk(parent, disk);
 	blk_register_queue(disk);
 
 	/*
@@ -628,12 +627,11 @@ void add_disk(struct gendisk *disk)
 
 	retval = sysfs_create_link(&disk_to_dev(disk)->kobj, &bdi->dev->kobj,
 				   "bdi");
-	WARN_ON(retval);
-
 	disk_add_events(disk);
 	blk_integrity_add(disk);
+	return retval;
 }
-EXPORT_SYMBOL(add_disk);
+EXPORT_SYMBOL(device_add_disk);
 
 void del_gendisk(struct gendisk *disk)
 {
diff --git a/include/linux/genhd.h b/include/linux/genhd.h
index 5c706765404a..6fa03fe589ad 100644
--- a/include/linux/genhd.h
+++ b/include/linux/genhd.h
@@ -431,7 +431,13 @@ static inline void free_part_info(struct hd_struct *part)
 extern void part_round_stats(int cpu, struct hd_struct *part);
 
 /* block/genhd.c */
-extern void add_disk(struct gendisk *disk);
+extern int device_add_disk(struct device *parent, struct gendisk *disk);
+static inline void add_disk(struct gendisk *disk)
+{
+	/* temporary while we convert callers to device_add_disk */
+	WARN_ON(device_add_disk(disk->driverfs_dev, disk) != 0);
+}
+
 extern void del_gendisk(struct gendisk *gp);
 extern struct gendisk *get_gendisk(dev_t dev, int *partno);
 extern struct block_device *bdget_disk(struct gendisk *disk, int partno);

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

* [PATCH 2/3] block: convert to device_add_disk()
  2016-02-25 20:04 [PATCH 0/3] Introduce device_add_disk() to kill gendisk.driverfs_dev Dan Williams
  2016-02-25 20:04 ` [PATCH 1/3] block: introduce device_add_disk() Dan Williams
@ 2016-02-25 20:04 ` Dan Williams
  2016-02-25 20:04 ` [PATCH 3/3] block: remove ->driverfs_dev Dan Williams
  2016-03-09 17:38 ` [PATCH 0/3] Introduce device_add_disk() to kill gendisk.driverfs_dev Dan Williams
  3 siblings, 0 replies; 9+ messages in thread
From: Dan Williams @ 2016-02-25 20:04 UTC (permalink / raw)
  To: axboe
  Cc: linux-block, Ulf Hansson, Martin K. Petersen, Michael S. Tsirkin,
	linux-kernel, James E.J. Bottomley, hch, Konrad Rzeszutek Wilk,
	Keith Busch, Ross Zwisler, David Woodhouse, David S. Miller

For block drivers that specify a parent device, convert them to use
device_add_disk().  For now this is functionally equivalent to the
previous state in that errors are just reported with a WARN_ON().

This conversion was done with the following semantic patch:

    @@
    struct gendisk *disk;
    expression E;
    @@

    - disk->driverfs_dev = E;
    ...
    - add_disk(disk);
    + WARN_ON(device_add_disk(E, disk) != 0);

    @@
    struct gendisk *disk;
    expression E1, E2;
    @@

    - disk->driverfs_dev = E1;
    ...
    E2 = disk;
    ...
    - add_disk(E2);
    + WARN_ON(device_add_disk(E1, E2));

...plus some manual fixups for a few missed conversions.

Cc: Jens Axboe <axboe@fb.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Keith Busch <keith.busch@intel.com>
Cc: Michael S. Tsirkin <mst@redhat.com>
Cc: Ulf Hansson <ulf.hansson@linaro.org>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: David S. Miller <davem@davemloft.net>
Cc: James E.J. Bottomley <JBottomley@odin.com>
Cc: Ross Zwisler <ross.zwisler@linux.intel.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
---
 arch/powerpc/sysdev/axonram.c       |    3 +--
 arch/um/drivers/ubd_kern.c          |    3 +--
 drivers/block/cciss.c               |    3 +--
 drivers/block/floppy.c              |    4 ++--
 drivers/block/mtip32xx/mtip32xx.c   |    5 ++---
 drivers/block/ps3disk.c             |    3 +--
 drivers/block/ps3vram.c             |    3 +--
 drivers/block/rsxx/dev.c            |    4 +---
 drivers/block/skd_main.c            |    8 +++-----
 drivers/block/sunvdc.c              |    3 +--
 drivers/block/virtio_blk.c          |    3 +--
 drivers/block/xen-blkfront.c        |    3 +--
 drivers/ide/ide-cd.c                |    3 +--
 drivers/ide/ide-gd.c                |    3 +--
 drivers/memstick/core/ms_block.c    |    3 +--
 drivers/memstick/core/mspro_block.c |    3 +--
 drivers/mmc/card/block.c            |    3 +--
 drivers/mtd/mtd_blkdevs.c           |    4 +---
 drivers/nvdimm/blk.c                |    3 +--
 drivers/nvdimm/btt.c                |    3 +--
 drivers/nvdimm/pmem.c               |    3 +--
 drivers/nvme/host/core.c            |    3 +--
 drivers/s390/block/dasd_genhd.c     |    3 +--
 drivers/s390/block/dcssblk.c        |    3 +--
 drivers/s390/block/scm_blk.c        |    3 +--
 drivers/scsi/sd.c                   |    3 +--
 drivers/scsi/sr.c                   |    3 +--
 27 files changed, 31 insertions(+), 60 deletions(-)

diff --git a/arch/powerpc/sysdev/axonram.c b/arch/powerpc/sysdev/axonram.c
index 0d112b94d91d..01837c08b605 100644
--- a/arch/powerpc/sysdev/axonram.c
+++ b/arch/powerpc/sysdev/axonram.c
@@ -223,7 +223,6 @@ static int axon_ram_probe(struct platform_device *device)
 	bank->disk->first_minor = azfs_minor;
 	bank->disk->fops = &axon_ram_devops;
 	bank->disk->private_data = bank;
-	bank->disk->driverfs_dev = &device->dev;
 
 	sprintf(bank->disk->disk_name, "%s%d",
 			AXON_RAM_DEVICE_NAME, axon_ram_bank_id);
@@ -238,7 +237,7 @@ static int axon_ram_probe(struct platform_device *device)
 	set_capacity(bank->disk, bank->size >> AXON_RAM_SECTOR_SHIFT);
 	blk_queue_make_request(bank->disk->queue, axon_ram_make_request);
 	blk_queue_logical_block_size(bank->disk->queue, AXON_RAM_SECTOR_SIZE);
-	add_disk(bank->disk);
+	WARN_ON(device_add_disk(&device->dev, bank->disk) != 0);
 
 	bank->irq_id = irq_of_parse_and_map(device->dev.of_node, 0);
 	if (bank->irq_id == NO_IRQ) {
diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c
index 39ba20755e03..6eed85f0508f 100644
--- a/arch/um/drivers/ubd_kern.c
+++ b/arch/um/drivers/ubd_kern.c
@@ -823,12 +823,11 @@ static int ubd_disk_register(int major, u64 size, int unit,
 		ubd_devs[unit].pdev.dev.release = ubd_device_release;
 		dev_set_drvdata(&ubd_devs[unit].pdev.dev, &ubd_devs[unit]);
 		platform_device_register(&ubd_devs[unit].pdev);
-		disk->driverfs_dev = &ubd_devs[unit].pdev.dev;
 	}
 
 	disk->private_data = &ubd_devs[unit];
 	disk->queue = ubd_devs[unit].queue;
-	add_disk(disk);
+	WARN_ON(device_add_disk(&ubd_devs[unit].pdev.dev, disk) != 0);
 
 	*disk_out = disk;
 	return 0;
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
index 63c2064689f8..7f7324fee7d6 100644
--- a/drivers/block/cciss.c
+++ b/drivers/block/cciss.c
@@ -1951,7 +1951,6 @@ static int cciss_add_disk(ctlr_info_t *h, struct gendisk *disk,
 	if (cciss_create_ld_sysfs_entry(h, drv_index))
 		goto cleanup_queue;
 	disk->private_data = h->drv[drv_index];
-	disk->driverfs_dev = &h->drv[drv_index]->dev;
 
 	/* Set up queue information */
 	blk_queue_bounce_limit(disk->queue, h->pdev->dma_mask);
@@ -1973,7 +1972,7 @@ static int cciss_add_disk(ctlr_info_t *h, struct gendisk *disk,
 	/* allows the interrupt handler to start the queue */
 	wmb();
 	h->drv[drv_index]->queue = disk->queue;
-	add_disk(disk);
+	WARN_ON(device_add_disk(&h->drv[drv_index]->dev, disk) != 0);
 	return 0;
 
 cleanup_queue:
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
index 84708a5f8c52..d0b397a80c5c 100644
--- a/drivers/block/floppy.c
+++ b/drivers/block/floppy.c
@@ -4349,8 +4349,8 @@ static int __init do_floppy_init(void)
 		/* to be cleaned up... */
 		disks[drive]->private_data = (void *)(long)drive;
 		disks[drive]->flags |= GENHD_FL_REMOVABLE;
-		disks[drive]->driverfs_dev = &floppy_device[drive].dev;
-		add_disk(disks[drive]);
+		WARN_ON(device_add_disk(&floppy_device[drive].dev,
+					disks[drive]) != 0);
 	}
 
 	return 0;
diff --git a/drivers/block/mtip32xx/mtip32xx.c b/drivers/block/mtip32xx/mtip32xx.c
index 9b180dbbd03c..098ed0cb8b9f 100644
--- a/drivers/block/mtip32xx/mtip32xx.c
+++ b/drivers/block/mtip32xx/mtip32xx.c
@@ -3840,7 +3840,6 @@ static int mtip_block_initialize(struct driver_data *dd)
 	if (rv)
 		goto disk_index_error;
 
-	dd->disk->driverfs_dev	= &dd->pdev->dev;
 	dd->disk->major		= dd->major;
 	dd->disk->first_minor	= index * MTIP_MAX_MINORS;
 	dd->disk->minors 	= MTIP_MAX_MINORS;
@@ -3891,7 +3890,7 @@ skip_create_disk:
 
 	/*
 	 * if rebuild pending, start the service thread, and delay the block
-	 * queue creation and add_disk()
+	 * queue creation and device_add_disk()
 	 */
 	if (wait_for_rebuild == MTIP_FTL_REBUILD_MAGIC)
 		goto start_service_thread;
@@ -3931,7 +3930,7 @@ skip_create_disk:
 	set_capacity(dd->disk, capacity);
 
 	/* Enable the block device and add it to /dev */
-	add_disk(dd->disk);
+	WARN_ON(device_add_disk(&dd->pdev->dev, dd->disk) != 0);
 
 	dd->bdev = bdget_disk(dd->disk, 0);
 	/*
diff --git a/drivers/block/ps3disk.c b/drivers/block/ps3disk.c
index c120d70d3fb3..6d8181d79733 100644
--- a/drivers/block/ps3disk.c
+++ b/drivers/block/ps3disk.c
@@ -487,7 +487,6 @@ static int ps3disk_probe(struct ps3_system_bus_device *_dev)
 	gendisk->fops = &ps3disk_fops;
 	gendisk->queue = queue;
 	gendisk->private_data = dev;
-	gendisk->driverfs_dev = &dev->sbd.core;
 	snprintf(gendisk->disk_name, sizeof(gendisk->disk_name), PS3DISK_NAME,
 		 devidx+'a');
 	priv->blocking_factor = dev->blk_size >> 9;
@@ -499,7 +498,7 @@ static int ps3disk_probe(struct ps3_system_bus_device *_dev)
 		 gendisk->disk_name, priv->model, priv->raw_capacity >> 11,
 		 get_capacity(gendisk) >> 11);
 
-	add_disk(gendisk);
+	WARN_ON(device_add_disk(&dev->sbd.core, gendisk) != 0);
 	return 0;
 
 fail_cleanup_queue:
diff --git a/drivers/block/ps3vram.c b/drivers/block/ps3vram.c
index 56847fcda086..38da9070321b 100644
--- a/drivers/block/ps3vram.c
+++ b/drivers/block/ps3vram.c
@@ -773,14 +773,13 @@ static int ps3vram_probe(struct ps3_system_bus_device *dev)
 	gendisk->fops = &ps3vram_fops;
 	gendisk->queue = queue;
 	gendisk->private_data = dev;
-	gendisk->driverfs_dev = &dev->core;
 	strlcpy(gendisk->disk_name, DEVICE_NAME, sizeof(gendisk->disk_name));
 	set_capacity(gendisk, priv->size >> 9);
 
 	dev_info(&dev->core, "%s: Using %lu MiB of GPU memory\n",
 		 gendisk->disk_name, get_capacity(gendisk) >> 11);
 
-	add_disk(gendisk);
+	WARN_ON(device_add_disk(&dev->core, gendisk) != 0);
 	return 0;
 
 fail_cleanup_queue:
diff --git a/drivers/block/rsxx/dev.c b/drivers/block/rsxx/dev.c
index e1b8b7061d2f..de69939eb421 100644
--- a/drivers/block/rsxx/dev.c
+++ b/drivers/block/rsxx/dev.c
@@ -230,8 +230,7 @@ int rsxx_attach_dev(struct rsxx_cardinfo *card)
 			set_capacity(card->gendisk, card->size8 >> 9);
 		else
 			set_capacity(card->gendisk, 0);
-		add_disk(card->gendisk);
-
+		WARN_ON(device_add_disk(&card->dev->dev, card->gendisk) != 0);
 		card->bdev_attached = 1;
 	}
 
@@ -308,7 +307,6 @@ int rsxx_setup_dev(struct rsxx_cardinfo *card)
 
 	snprintf(card->gendisk->disk_name, sizeof(card->gendisk->disk_name),
 		 "rsxx%d", card->disk_id);
-	card->gendisk->driverfs_dev = &card->dev->dev;
 	card->gendisk->major = card->major;
 	card->gendisk->first_minor = 0;
 	card->gendisk->fops = &rsxx_fops;
diff --git a/drivers/block/skd_main.c b/drivers/block/skd_main.c
index 586f9168ffa4..7e02311a2dde 100644
--- a/drivers/block/skd_main.c
+++ b/drivers/block/skd_main.c
@@ -4747,10 +4747,10 @@ static int skd_bdev_getgeo(struct block_device *bdev, struct hd_geometry *geo)
 	return -EIO;
 }
 
-static int skd_bdev_attach(struct skd_device *skdev)
+static int skd_bdev_attach(struct device *parent, struct skd_device *skdev)
 {
 	pr_debug("%s:%s:%d add_disk\n", skdev->name, __func__, __LINE__);
-	add_disk(skdev->disk);
+	WARN_ON(device_add_disk(parent, skdev->disk) != 0);
 	return 0;
 }
 
@@ -4869,8 +4869,6 @@ static int skd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
 	pci_set_drvdata(pdev, skdev);
 
-	skdev->disk->driverfs_dev = &pdev->dev;
-
 	for (i = 0; i < SKD_MAX_BARS; i++) {
 		skdev->mem_phys[i] = pci_resource_start(pdev, i);
 		skdev->mem_size[i] = (u32)pci_resource_len(pdev, i);
@@ -4908,7 +4906,7 @@ static int skd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 					      (SKD_START_WAIT_SECONDS * HZ));
 	if (skdev->gendisk_on > 0) {
 		/* device came on-line after reset */
-		skd_bdev_attach(skdev);
+		skd_bdev_attach(&pdev->dev, skdev);
 		rc = 0;
 	} else {
 		/* we timed out, something is wrong with the device,
diff --git a/drivers/block/sunvdc.c b/drivers/block/sunvdc.c
index 4b911ed96ea3..2f8770d714cd 100644
--- a/drivers/block/sunvdc.c
+++ b/drivers/block/sunvdc.c
@@ -804,7 +804,6 @@ static int probe_disk(struct vdc_port *port)
 	g->fops = &vdc_fops;
 	g->queue = q;
 	g->private_data = port;
-	g->driverfs_dev = &port->vio.vdev->dev;
 
 	set_capacity(g, port->vdisk_size);
 
@@ -835,7 +834,7 @@ static int probe_disk(struct vdc_port *port)
 	       port->vdisk_size, (port->vdisk_size >> (20 - 9)),
 	       port->vio.ver.major, port->vio.ver.minor);
 
-	add_disk(g);
+	WARN_ON(device_add_disk(&port->vio.vdev->dev, g) != 0);
 
 	return 0;
 }
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index 6ca35495a5be..c7d4e8675140 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -655,7 +655,6 @@ static int virtblk_probe(struct virtio_device *vdev)
 	vblk->disk->first_minor = index_to_minor(index);
 	vblk->disk->private_data = vblk;
 	vblk->disk->fops = &virtblk_fops;
-	vblk->disk->driverfs_dev = &vdev->dev;
 	vblk->disk->flags |= GENHD_FL_EXT_DEVT;
 	vblk->index = index;
 
@@ -732,7 +731,7 @@ static int virtblk_probe(struct virtio_device *vdev)
 
 	virtio_device_ready(vdev);
 
-	add_disk(vblk->disk);
+	WARN_ON(device_add_disk(&vdev->dev, vblk->disk) != 0);
 	err = device_create_file(disk_to_dev(vblk->disk), &dev_attr_serial);
 	if (err)
 		goto out_del_disk;
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index 83eb9e6bf8b0..2a5b21f8137e 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -1139,7 +1139,6 @@ static int xlvbd_alloc_gendisk(blkif_sector_t capacity,
 	gd->first_minor = minor;
 	gd->fops = &xlvbd_block_fops;
 	gd->private_data = info;
-	gd->driverfs_dev = &(info->xbdev->dev);
 	set_capacity(gd, capacity);
 
 	if (xlvbd_init_blk_queue(gd, sector_size, physical_sector_size,
@@ -2453,7 +2452,7 @@ static void blkfront_connect(struct blkfront_info *info)
 	for (i = 0; i < info->nr_rings; i++)
 		kick_pending_request_queues(&info->rinfo[i]);
 
-	add_disk(info->gd);
+	WARN_ON(device_add_disk(&info->xbdev->dev, info->gd) != 0);
 
 	info->is_ready = 1;
 }
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
index ef907fd5ba98..36eaccf572fb 100644
--- a/drivers/ide/ide-cd.c
+++ b/drivers/ide/ide-cd.c
@@ -1770,7 +1770,6 @@ static int ide_cd_probe(ide_drive_t *drive)
 	drive->driver_data = info;
 
 	g->minors = 1;
-	g->driverfs_dev = &drive->gendev;
 	g->flags = GENHD_FL_CD | GENHD_FL_REMOVABLE;
 	if (ide_cdrom_setup(drive)) {
 		put_device(&info->dev);
@@ -1780,7 +1779,7 @@ static int ide_cd_probe(ide_drive_t *drive)
 	ide_cd_read_toc(drive, &sense);
 	g->fops = &idecd_ops;
 	g->flags |= GENHD_FL_REMOVABLE | GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE;
-	add_disk(g);
+	WARN_ON(device_add_disk(&drive->gendev, g) != 0);
 	return 0;
 
 out_free_disk:
diff --git a/drivers/ide/ide-gd.c b/drivers/ide/ide-gd.c
index 838996a0039e..640777188285 100644
--- a/drivers/ide/ide-gd.c
+++ b/drivers/ide/ide-gd.c
@@ -412,12 +412,11 @@ static int ide_gd_probe(ide_drive_t *drive)
 	set_capacity(g, ide_gd_capacity(drive));
 
 	g->minors = IDE_DISK_MINORS;
-	g->driverfs_dev = &drive->gendev;
 	g->flags |= GENHD_FL_EXT_DEVT;
 	if (drive->dev_flags & IDE_DFLAG_REMOVABLE)
 		g->flags = GENHD_FL_REMOVABLE;
 	g->fops = &ide_gd_ops;
-	add_disk(g);
+	WARN_ON(device_add_disk(&drive->gendev, g) != 0);
 	return 0;
 
 out_free_disk:
diff --git a/drivers/memstick/core/ms_block.c b/drivers/memstick/core/ms_block.c
index 84abf9d3c24e..3028a0f72adf 100644
--- a/drivers/memstick/core/ms_block.c
+++ b/drivers/memstick/core/ms_block.c
@@ -2146,7 +2146,6 @@ static int msb_init_disk(struct memstick_dev *card)
 	msb->disk->fops = &msb_bdops;
 	msb->disk->private_data = msb;
 	msb->disk->queue = msb->queue;
-	msb->disk->driverfs_dev = &card->dev;
 	msb->disk->flags |= GENHD_FL_EXT_DEVT;
 
 	capacity = msb->pages_in_block * msb->logical_block_count;
@@ -2163,7 +2162,7 @@ static int msb_init_disk(struct memstick_dev *card)
 		set_disk_ro(msb->disk, 1);
 
 	msb_start(card);
-	add_disk(msb->disk);
+	WARN_ON(device_add_disk(&card->dev, msb->disk) != 0);
 	dbg("Disk added");
 	return 0;
 
diff --git a/drivers/memstick/core/mspro_block.c b/drivers/memstick/core/mspro_block.c
index 922a750640e8..b068f8aa9648 100644
--- a/drivers/memstick/core/mspro_block.c
+++ b/drivers/memstick/core/mspro_block.c
@@ -1244,7 +1244,6 @@ static int mspro_block_init_disk(struct memstick_dev *card)
 	msb->usage_count = 1;
 	msb->disk->private_data = msb;
 	msb->disk->queue = msb->queue;
-	msb->disk->driverfs_dev = &card->dev;
 
 	sprintf(msb->disk->disk_name, "mspblk%d", disk_id);
 
@@ -1256,7 +1255,7 @@ static int mspro_block_init_disk(struct memstick_dev *card)
 	set_capacity(msb->disk, capacity);
 	dev_dbg(&card->dev, "capacity set %ld\n", capacity);
 
-	add_disk(msb->disk);
+	WARN_ON(device_add_disk(&card->dev, msb->disk) != 0);
 	msb->active = 1;
 	return 0;
 
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index 47bc87dafb00..a1aafd9a1731 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -2237,7 +2237,6 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card,
 	md->disk->fops = &mmc_bdops;
 	md->disk->private_data = md;
 	md->disk->queue = md->queue.queue;
-	md->disk->driverfs_dev = parent;
 	set_disk_ro(md->disk, md->read_only || default_ro);
 	md->disk->flags = GENHD_FL_EXT_DEVT;
 	if (area_type & (MMC_BLK_DATA_AREA_RPMB | MMC_BLK_DATA_AREA_BOOT))
@@ -2423,7 +2422,7 @@ static int mmc_add_disk(struct mmc_blk_data *md)
 	int ret;
 	struct mmc_card *card = md->queue.card;
 
-	add_disk(md->disk);
+	WARN_ON(device_add_disk(&card->dev, md->disk) != 0);
 	md->force_ro.show = force_ro_show;
 	md->force_ro.store = force_ro_store;
 	sysfs_attr_init(&md->force_ro.attr);
diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c
index f4701182b558..e37feb5c9d07 100644
--- a/drivers/mtd/mtd_blkdevs.c
+++ b/drivers/mtd/mtd_blkdevs.c
@@ -431,12 +431,10 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
 		goto error4;
 	INIT_WORK(&new->work, mtd_blktrans_work);
 
-	gd->driverfs_dev = &new->mtd->dev;
-
 	if (new->readonly)
 		set_disk_ro(gd, 1);
 
-	add_disk(gd);
+	WARN_ON(device_add_disk(&new->mtd->dev, gd) != 0);
 
 	if (new->disk_attributes) {
 		ret = sysfs_create_group(&disk_to_dev(gd)->kobj,
diff --git a/drivers/nvdimm/blk.c b/drivers/nvdimm/blk.c
index 91a336ea8c4f..475d07e3fc59 100644
--- a/drivers/nvdimm/blk.c
+++ b/drivers/nvdimm/blk.c
@@ -263,7 +263,6 @@ static int nd_blk_attach_disk(struct nd_namespace_common *ndns,
 		return -ENOMEM;
 	}
 
-	disk->driverfs_dev	= &ndns->dev;
 	disk->major		= nd_blk_major;
 	disk->first_minor	= 0;
 	disk->fops		= &nd_blk_fops;
@@ -272,7 +271,7 @@ static int nd_blk_attach_disk(struct nd_namespace_common *ndns,
 	disk->flags		= GENHD_FL_EXT_DEVT;
 	nvdimm_namespace_disk_name(ndns, disk->disk_name);
 	set_capacity(disk, 0);
-	add_disk(disk);
+	WARN_ON(device_add_disk(&ndns->dev, disk) != 0);
 
 	if (nd_blk_meta_size(blk_dev)) {
 		int rc = nd_integrity_init(disk, nd_blk_meta_size(blk_dev));
diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
index efb2c1ceef98..46ff074b2389 100644
--- a/drivers/nvdimm/btt.c
+++ b/drivers/nvdimm/btt.c
@@ -1245,7 +1245,6 @@ static int btt_blk_init(struct btt *btt)
 	}
 
 	nvdimm_namespace_disk_name(ndns, btt->btt_disk->disk_name);
-	btt->btt_disk->driverfs_dev = &btt->nd_btt->dev;
 	btt->btt_disk->major = btt_major;
 	btt->btt_disk->first_minor = 0;
 	btt->btt_disk->fops = &btt_fops;
@@ -1261,7 +1260,7 @@ static int btt_blk_init(struct btt *btt)
 	btt->btt_queue->queuedata = btt;
 
 	set_capacity(btt->btt_disk, 0);
-	add_disk(btt->btt_disk);
+	WARN_ON(device_add_disk(&btt->nd_btt->dev, btt->btt_disk) != 0);
 	if (btt_meta_size(btt)) {
 		int rc = nd_integrity_init(btt->btt_disk, btt_meta_size(btt));
 
diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
index 7edf31671dab..75ab1da55724 100644
--- a/drivers/nvdimm/pmem.c
+++ b/drivers/nvdimm/pmem.c
@@ -235,7 +235,6 @@ static int pmem_attach_disk(struct device *dev,
 	disk->queue		= pmem->pmem_queue;
 	disk->flags		= GENHD_FL_EXT_DEVT;
 	nvdimm_namespace_disk_name(ndns, disk->disk_name);
-	disk->driverfs_dev = dev;
 	set_capacity(disk, (pmem->size - pmem->data_offset) / 512);
 	pmem->pmem_disk = disk;
 	devm_exit_badblocks(dev, &pmem->bb);
@@ -244,7 +243,7 @@ static int pmem_attach_disk(struct device *dev,
 	nvdimm_namespace_add_poison(ndns, &pmem->bb, pmem->data_offset);
 
 	disk->bb = &pmem->bb;
-	add_disk(disk);
+	WARN_ON(device_add_disk(dev, disk) != 0);
 	revalidate_disk(disk);
 
 	return 0;
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 504a6045985c..01c54f2f7202 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -1186,7 +1186,6 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid)
 	disk->fops = &nvme_fops;
 	disk->private_data = ns;
 	disk->queue = ns->queue;
-	disk->driverfs_dev = ctrl->device;
 	disk->flags = GENHD_FL_EXT_DEVT;
 	sprintf(disk->disk_name, "nvme%dn%d", ctrl->instance, nsid);
 
@@ -1198,7 +1197,7 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid)
 	if (ns->type == NVME_NS_LIGHTNVM)
 		return;
 
-	add_disk(ns->disk);
+	WARN_ON(device_add_disk(ctrl->device, ns->disk));
 	if (sysfs_create_group(&disk_to_dev(ns->disk)->kobj,
 					&nvme_ns_attr_group))
 		pr_warn("%s: failed to create sysfs group for identification\n",
diff --git a/drivers/s390/block/dasd_genhd.c b/drivers/s390/block/dasd_genhd.c
index ef1d9fb06cab..1d18e31e86ae 100644
--- a/drivers/s390/block/dasd_genhd.c
+++ b/drivers/s390/block/dasd_genhd.c
@@ -45,7 +45,6 @@ int dasd_gendisk_alloc(struct dasd_block *block)
 	gdp->major = DASD_MAJOR;
 	gdp->first_minor = base->devindex << DASD_PARTN_BITS;
 	gdp->fops = &dasd_device_operations;
-	gdp->driverfs_dev = &base->cdev->dev;
 
 	/*
 	 * Set device name.
@@ -76,7 +75,7 @@ int dasd_gendisk_alloc(struct dasd_block *block)
 	gdp->queue = block->request_queue;
 	block->gdp = gdp;
 	set_capacity(block->gdp, 0);
-	add_disk(block->gdp);
+	WARN_ON(device_add_disk(&base->cdev->dev, block->gdp));
 	return 0;
 }
 
diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c
index ce7b70181740..7d3d91553c7f 100644
--- a/drivers/s390/block/dcssblk.c
+++ b/drivers/s390/block/dcssblk.c
@@ -615,7 +615,6 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char
 	dev_info->dcssblk_queue = blk_alloc_queue(GFP_KERNEL);
 	dev_info->gd->queue = dev_info->dcssblk_queue;
 	dev_info->gd->private_data = dev_info;
-	dev_info->gd->driverfs_dev = &dev_info->dev;
 	blk_queue_make_request(dev_info->dcssblk_queue, dcssblk_make_request);
 	blk_queue_logical_block_size(dev_info->dcssblk_queue, 4096);
 
@@ -655,7 +654,7 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char
 		goto put_dev;
 
 	get_device(&dev_info->dev);
-	add_disk(dev_info->gd);
+	WARN_ON(device_add_disk(&dev_info->dev, dev_info->gd) != 0);
 
 	switch (dev_info->segment_type) {
 		case SEG_TYPE_SR:
diff --git a/drivers/s390/block/scm_blk.c b/drivers/s390/block/scm_blk.c
index 75d9896deccb..846c4ec4f811 100644
--- a/drivers/s390/block/scm_blk.c
+++ b/drivers/s390/block/scm_blk.c
@@ -512,7 +512,6 @@ int scm_blk_dev_setup(struct scm_blk_dev *bdev, struct scm_device *scmdev)
 		goto out_queue;
 
 	rq->queuedata = scmdev;
-	bdev->gendisk->driverfs_dev = &scmdev->dev;
 	bdev->gendisk->private_data = scmdev;
 	bdev->gendisk->fops = &scm_blk_devops;
 	bdev->gendisk->queue = rq;
@@ -531,7 +530,7 @@ int scm_blk_dev_setup(struct scm_blk_dev *bdev, struct scm_device *scmdev)
 
 	/* 512 byte sectors */
 	set_capacity(bdev->gendisk, scmdev->size >> 9);
-	add_disk(bdev->gendisk);
+	WARN_ON(device_add_disk(&scmdev->dev, bdev->gendisk) != 0);
 	return 0;
 
 out_queue:
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index d749da765df1..1b06f3e6a210 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -3012,7 +3012,6 @@ static void sd_probe_async(void *data, async_cookie_t cookie)
 
 	sd_revalidate_disk(gd);
 
-	gd->driverfs_dev = &sdp->sdev_gendev;
 	gd->flags = GENHD_FL_EXT_DEVT;
 	if (sdp->removable) {
 		gd->flags |= GENHD_FL_REMOVABLE;
@@ -3020,7 +3019,7 @@ static void sd_probe_async(void *data, async_cookie_t cookie)
 	}
 
 	blk_pm_runtime_init(sdp->request_queue, dev);
-	add_disk(gd);
+	WARN_ON(device_add_disk(&sdp->sdev_gendev, gd) != 0);
 	if (sdkp->capacity)
 		sd_dif_config_host(sdkp);
 
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c
index 64c867405ad4..ab89f983862a 100644
--- a/drivers/scsi/sr.c
+++ b/drivers/scsi/sr.c
@@ -713,7 +713,6 @@ static int sr_probe(struct device *dev)
 	get_capabilities(cd);
 	sr_vendor_init(cd);
 
-	disk->driverfs_dev = &sdev->sdev_gendev;
 	set_capacity(disk, cd->capacity);
 	disk->private_data = &cd->driver;
 	disk->queue = sdev->request_queue;
@@ -730,7 +729,7 @@ static int sr_probe(struct device *dev)
 
 	dev_set_drvdata(dev, cd);
 	disk->flags |= GENHD_FL_REMOVABLE;
-	add_disk(disk);
+	WARN_ON(device_add_disk(&sdev->sdev_gendev, disk) != 0);
 
 	sdev_printk(KERN_DEBUG, sdev,
 		    "Attached scsi CD-ROM %s\n", cd->cdi.name);

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

* [PATCH 3/3] block: remove ->driverfs_dev
  2016-02-25 20:04 [PATCH 0/3] Introduce device_add_disk() to kill gendisk.driverfs_dev Dan Williams
  2016-02-25 20:04 ` [PATCH 1/3] block: introduce device_add_disk() Dan Williams
  2016-02-25 20:04 ` [PATCH 2/3] block: convert to device_add_disk() Dan Williams
@ 2016-02-25 20:04 ` Dan Williams
  2016-03-09 17:38 ` [PATCH 0/3] Introduce device_add_disk() to kill gendisk.driverfs_dev Dan Williams
  3 siblings, 0 replies; 9+ messages in thread
From: Dan Williams @ 2016-02-25 20:04 UTC (permalink / raw)
  To: axboe; +Cc: linux-block, Ross Zwisler, hch, linux-kernel

Now that all drivers that specify a ->driverfs_dev have been converted
to device_add_disk(), the pointer can be removed from struct gendisk.

Cc: Jens Axboe <axboe@fb.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Ross Zwisler <ross.zwisler@linux.intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
---
 block/genhd.c         |    5 ++---
 drivers/nvdimm/bus.c  |    2 +-
 include/linux/genhd.h |    4 +---
 3 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/block/genhd.c b/block/genhd.c
index 3fa2654ada52..d20f36bf42fa 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -797,10 +797,9 @@ void __init printk_all_partitions(void)
 			       , disk_name(disk, part->partno, name_buf),
 			       part->info ? part->info->uuid : "");
 			if (is_part0) {
-				if (disk->driverfs_dev != NULL &&
-				    disk->driverfs_dev->driver != NULL)
+				if (dev->parent && dev->parent->driver)
 					printk(" driver: %s\n",
-					      disk->driverfs_dev->driver->name);
+					      dev->parent->driver->name);
 				else
 					printk(" (driver?)\n");
 			} else
diff --git a/drivers/nvdimm/bus.c b/drivers/nvdimm/bus.c
index 2b2181cdeb63..f2540bfaa65a 100644
--- a/drivers/nvdimm/bus.c
+++ b/drivers/nvdimm/bus.c
@@ -235,7 +235,7 @@ EXPORT_SYMBOL(__nd_driver_register);
 
 int nvdimm_revalidate_disk(struct gendisk *disk)
 {
-	struct device *dev = disk->driverfs_dev;
+	struct device *dev = disk_to_dev(disk)->parent;
 	struct nd_region *nd_region = to_nd_region(dev->parent);
 	const char *pol = nd_region->ro ? "only" : "write";
 
diff --git a/include/linux/genhd.h b/include/linux/genhd.h
index 6fa03fe589ad..0c065e8549f1 100644
--- a/include/linux/genhd.h
+++ b/include/linux/genhd.h
@@ -204,7 +204,6 @@ struct gendisk {
 	void *private_data;
 
 	int flags;
-	struct device *driverfs_dev;  // FIXME: remove
 	struct kobject *slave_dir;
 
 	struct timer_rand_state *random;
@@ -434,8 +433,7 @@ extern void part_round_stats(int cpu, struct hd_struct *part);
 extern int device_add_disk(struct device *parent, struct gendisk *disk);
 static inline void add_disk(struct gendisk *disk)
 {
-	/* temporary while we convert callers to device_add_disk */
-	WARN_ON(device_add_disk(disk->driverfs_dev, disk) != 0);
+	WARN_ON(device_add_disk(NULL, disk) != 0);
 }
 
 extern void del_gendisk(struct gendisk *gp);

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

* Re: [PATCH 0/3] Introduce device_add_disk() to kill gendisk.driverfs_dev
  2016-02-25 20:04 [PATCH 0/3] Introduce device_add_disk() to kill gendisk.driverfs_dev Dan Williams
                   ` (2 preceding siblings ...)
  2016-02-25 20:04 ` [PATCH 3/3] block: remove ->driverfs_dev Dan Williams
@ 2016-03-09 17:38 ` Dan Williams
  3 siblings, 0 replies; 9+ messages in thread
From: Dan Williams @ 2016-03-09 17:38 UTC (permalink / raw)
  To: Jens Axboe
  Cc: linux-block, Ulf Hansson, Martin K. Petersen,
	Konrad Rzeszutek Wilk, James E.J. Bottomley,
	Linux Kernel Mailing List, David S. Miller, Keith Busch,
	Michael S. Tsirkin, Ross Zwisler, David Woodhouse,
	Christoph Hellwig

On Thu, Feb 25, 2016 at 12:04 PM, Dan Williams <dan.j.williams@intel.com> wrote:
> Answer the "// FIXME: remove" include/linux/genhd.h.  This should be
> functionally equivalent to the previous state.  Now that the WARN_ON()
> for the registration failure case is up-levelled to some drivers, they
> can take on the follow on work to handle device_add_disk() failures.
>
> Note, a full run from the kbuild robot is still pending.  I'll post v2
> if it reports anything against this set on top of current -next.
>
> ---
>
> Dan Williams (3):
>       block: introduce device_add_disk()
>       block: convert to device_add_disk()
>       block: remove ->driverfs_dev
>

Yes, no, maybe so for 4.6?

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

* Re: [PATCH 1/3] block: introduce device_add_disk()
  2016-02-25 20:04 ` [PATCH 1/3] block: introduce device_add_disk() Dan Williams
@ 2016-03-10  8:09   ` Christoph Hellwig
  2016-03-10 15:15     ` Dan Williams
  0 siblings, 1 reply; 9+ messages in thread
From: Christoph Hellwig @ 2016-03-10  8:09 UTC (permalink / raw)
  To: Dan Williams; +Cc: axboe, linux-block, linux-kernel, viro

>  /**
> - * add_disk - add partitioning information to kernel list
> + * device_add_disk - add partitioning information to kernel list
> + * @parent: parent device for the disk
>   * @disk: per-device partitioning information
>   *
>   * This function registers the partitioning information in @disk
> @@ -581,7 +582,7 @@ exit:
>   *
>   * FIXME: error handling
>   */
> -void add_disk(struct gendisk *disk)
> +int device_add_disk(struct device *parent, struct gendisk *disk)
>  {
>  	struct backing_dev_info *bdi;
>  	dev_t devt;
> @@ -597,10 +598,8 @@ void add_disk(struct gendisk *disk)
>  	disk->flags |= GENHD_FL_UP;
>  
>  	retval = blk_alloc_devt(&disk->part0, &devt);
> -	if (retval) {
> -		WARN_ON(1);
> -		return;
> -	}
> +	if (retval)
> +		return retval;
>  	disk_to_dev(disk)->devt = devt;
>  
>  	/* ->major and ->first_minor aren't supposed to be
> @@ -617,7 +616,7 @@ void add_disk(struct gendisk *disk)
>  
>  	blk_register_region(disk_devt(disk), disk->minors, NULL,
>  			    exact_match, exact_lock, disk);
> -	register_disk(disk);
> +	register_disk(parent, disk);
>  	blk_register_queue(disk);
>  
>  	/*
> @@ -628,12 +627,11 @@ void add_disk(struct gendisk *disk)
>  
>  	retval = sysfs_create_link(&disk_to_dev(disk)->kobj, &bdi->dev->kobj,
>  				   "bdi");
> -	WARN_ON(retval);
> -
>  	disk_add_events(disk);
>  	blk_integrity_add(disk);
> +	return retval;

How are the callers expected to unwind after already having added the
disk?

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

* Re: [PATCH 1/3] block: introduce device_add_disk()
  2016-03-10  8:09   ` Christoph Hellwig
@ 2016-03-10 15:15     ` Dan Williams
  2016-03-10 15:18       ` Christoph Hellwig
  0 siblings, 1 reply; 9+ messages in thread
From: Dan Williams @ 2016-03-10 15:15 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: Jens Axboe, linux-block, linux-kernel, Al Viro

On Thu, Mar 10, 2016 at 12:09 AM, Christoph Hellwig <hch@lst.de> wrote:
>>  /**
>> - * add_disk - add partitioning information to kernel list
>> + * device_add_disk - add partitioning information to kernel list
>> + * @parent: parent device for the disk
>>   * @disk: per-device partitioning information
>>   *
>>   * This function registers the partitioning information in @disk
>> @@ -581,7 +582,7 @@ exit:
>>   *
>>   * FIXME: error handling
>>   */
>> -void add_disk(struct gendisk *disk)
>> +int device_add_disk(struct device *parent, struct gendisk *disk)
>>  {
>>       struct backing_dev_info *bdi;
>>       dev_t devt;
>> @@ -597,10 +598,8 @@ void add_disk(struct gendisk *disk)
>>       disk->flags |= GENHD_FL_UP;
>>
>>       retval = blk_alloc_devt(&disk->part0, &devt);
>> -     if (retval) {
>> -             WARN_ON(1);
>> -             return;
>> -     }
>> +     if (retval)
>> +             return retval;
>>       disk_to_dev(disk)->devt = devt;
>>
>>       /* ->major and ->first_minor aren't supposed to be
>> @@ -617,7 +616,7 @@ void add_disk(struct gendisk *disk)
>>
>>       blk_register_region(disk_devt(disk), disk->minors, NULL,
>>                           exact_match, exact_lock, disk);
>> -     register_disk(disk);
>> +     register_disk(parent, disk);
>>       blk_register_queue(disk);
>>
>>       /*
>> @@ -628,12 +627,11 @@ void add_disk(struct gendisk *disk)
>>
>>       retval = sysfs_create_link(&disk_to_dev(disk)->kobj, &bdi->dev->kobj,
>>                                  "bdi");
>> -     WARN_ON(retval);
>> -
>>       disk_add_events(disk);
>>       blk_integrity_add(disk);
>> +     return retval;
>
> How are the callers expected to unwind after already having added the
> disk?

True, I overlooked making add_disk() unwind-able, will re-spin...

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

* Re: [PATCH 1/3] block: introduce device_add_disk()
  2016-03-10 15:15     ` Dan Williams
@ 2016-03-10 15:18       ` Christoph Hellwig
  2016-03-10 15:27         ` Dan Williams
  0 siblings, 1 reply; 9+ messages in thread
From: Christoph Hellwig @ 2016-03-10 15:18 UTC (permalink / raw)
  To: Dan Williams
  Cc: Christoph Hellwig, Jens Axboe, linux-block, linux-kernel, Al Viro

On Thu, Mar 10, 2016 at 07:15:19AM -0800, Dan Williams wrote:
> > How are the callers expected to unwind after already having added the
> > disk?
> 
> True, I overlooked making add_disk() unwind-able, will re-spin...

I think this will take more work than we can finish in the next
days.  It would be good to simply respin it without adding the error
propagation.

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

* Re: [PATCH 1/3] block: introduce device_add_disk()
  2016-03-10 15:18       ` Christoph Hellwig
@ 2016-03-10 15:27         ` Dan Williams
  0 siblings, 0 replies; 9+ messages in thread
From: Dan Williams @ 2016-03-10 15:27 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: Jens Axboe, linux-block, linux-kernel, Al Viro

On Thu, Mar 10, 2016 at 7:18 AM, Christoph Hellwig <hch@lst.de> wrote:
> On Thu, Mar 10, 2016 at 07:15:19AM -0800, Dan Williams wrote:
>> > How are the callers expected to unwind after already having added the
>> > disk?
>>
>> True, I overlooked making add_disk() unwind-able, will re-spin...
>
> I think this will take more work than we can finish in the next
> days.  It would be good to simply respin it without adding the error
> propagation.

Sounds good.

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

end of thread, other threads:[~2016-03-10 15:27 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-02-25 20:04 [PATCH 0/3] Introduce device_add_disk() to kill gendisk.driverfs_dev Dan Williams
2016-02-25 20:04 ` [PATCH 1/3] block: introduce device_add_disk() Dan Williams
2016-03-10  8:09   ` Christoph Hellwig
2016-03-10 15:15     ` Dan Williams
2016-03-10 15:18       ` Christoph Hellwig
2016-03-10 15:27         ` Dan Williams
2016-02-25 20:04 ` [PATCH 2/3] block: convert to device_add_disk() Dan Williams
2016-02-25 20:04 ` [PATCH 3/3] block: remove ->driverfs_dev Dan Williams
2016-03-09 17:38 ` [PATCH 0/3] Introduce device_add_disk() to kill gendisk.driverfs_dev Dan Williams

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).