From 98bbd7aa596240300d49b9f370e199468686458c Mon Sep 17 00:00:00 2001
From: Poul-Henning Kamp <phk@FreeBSD.org>
Date: Fri, 28 Feb 2003 10:02:02 +0000
Subject: [PATCH] NO_GEOM cleanup:

Retire the "dev_t" centric version of the disk mini-layer.
Remove now unneeded linkage field in dev_t and struct disk.
---
 sys/geom/geom_disk.c | 64 +++++++-------------------------------------
 sys/sys/conf.h       |  2 --
 sys/sys/disk.h       |  7 +----
 sys/sys/linedisc.h   |  2 --
 4 files changed, 11 insertions(+), 64 deletions(-)

diff --git a/sys/geom/geom_disk.c b/sys/geom/geom_disk.c
index 22c510e91b70..dc04afbfa995 100644
--- a/sys/geom/geom_disk.c
+++ b/sys/geom/geom_disk.c
@@ -96,7 +96,6 @@ static int
 g_disk_access(struct g_provider *pp, int r, int w, int e)
 {
 	struct disk *dp;
-	dev_t dev;
 	int error;
 
 	g_trace(G_T_ACCESS, "g_disk_access(%s, %d, %d, %d)",
@@ -106,15 +105,11 @@ g_disk_access(struct g_provider *pp, int r, int w, int e)
 	w += pp->acw;
 	e += pp->ace;
 	dp = pp->geom->softc;
-	dev = dp->d_dev;
 	error = 0;
 	if ((pp->acr + pp->acw + pp->ace) == 0 && (r + w + e) > 0) {
-		if (dp->d_open != NULL || dp->d_copen != NULL) {
+		if (dp->d_open != NULL) {
 			g_disk_lock_giant(dp);
-			if (dp->d_open != NULL)
-				error = dp->d_open(dp);
-			else
-				error = dp->d_copen(dev, FREAD|FWRITE, 0, NULL);
+			error = dp->d_open(dp);
 			if (error != 0)
 				printf("Opened disk %s -> %d\n",
 				    pp->name, error);
@@ -123,20 +118,15 @@ g_disk_access(struct g_provider *pp, int r, int w, int e)
 		pp->mediasize = dp->d_mediasize;
 		pp->sectorsize = dp->d_sectorsize;
 		dp->d_flags |= DISKFLAG_OPEN;
-		if (dp->d_maxsize == 0 && dp->d_dev->si_iosize_max != 0)
-			dp->d_maxsize = dp->d_dev->si_iosize_max;
 		if (dp->d_maxsize == 0) {
 			printf("WARNING: Disk drive %s%d has no d_maxsize\n",
 			    dp->d_name, dp->d_unit);
 			dp->d_maxsize = DFLTPHYS;
 		}
 	} else if ((pp->acr + pp->acw + pp->ace) > 0 && (r + w + e) == 0) {
-		if (dp->d_close != NULL || dp->d_cclose != NULL) {
+		if (dp->d_close != NULL) {
 			g_disk_lock_giant(dp);
-			if (dp->d_close != NULL)
-				error = dp->d_close(dp);
-			else
-				error = dp->d_cclose(dev, FREAD|FWRITE, 0, NULL);
+			error = dp->d_close(dp);
 			if (error != 0)
 				printf("Closed disk %s -> %d\n",
 				    pp->name, error);
@@ -184,14 +174,12 @@ static void
 g_disk_start(struct bio *bp)
 {
 	struct bio *bp2, *bp3;
-	dev_t dev;
 	struct disk *dp;
 	struct g_ioctl *gio;
 	int error;
 	off_t off;
 
 	dp = bp->bio_to->geom->softc;
-	dev = dp->d_dev;
 	error = EJUSTRETURN;
 	switch(bp->bio_cmd) {
 	case BIO_DELETE:
@@ -232,7 +220,6 @@ g_disk_start(struct bio *bp)
 			bp2->bio_blkno = bp2->bio_offset >> DEV_BSHIFT;
 			bp2->bio_pblkno = bp2->bio_offset / dp->d_sectorsize;
 			bp2->bio_bcount = bp2->bio_length;
-			bp2->bio_dev = dev;
 			bp2->bio_disk = dp;
 			g_disk_lock_giant(dp);
 			dp->d_strategy(bp2);
@@ -250,30 +237,18 @@ g_disk_start(struct bio *bp)
 			break;
 		else if (!strcmp(bp->bio_attribute, "GEOM::kerneldump"))
 			g_disk_kerneldump(bp, dp);
-		else if ((dp->d_ioctl != NULL || dp->d_cioctl != NULL) &&
+		else if ((dp->d_ioctl != NULL) &&
 		    !strcmp(bp->bio_attribute, "GEOM::ioctl") &&
 		    bp->bio_length == sizeof *gio) {
 			gio = (struct g_ioctl *)bp->bio_data;
-			if (dp->d_ioctl != NULL) {
-				gio->func = (d_ioctl_t *)(dp->d_ioctl);
-				gio->dev =  dp;
-			} else {
-				gio->func = dp->d_cioctl;
-				gio->dev =  dp->d_dev;
-			}
+			gio->dev =  dp;
+			gio->func = (d_ioctl_t *)(dp->d_ioctl);
 			error = EDIRIOCTL;
 		} else 
 			error = ENOIOCTL;
 		break;
 	case BIO_SETATTR:
-		if (!strcmp(bp->bio_attribute, "GEOM::ioctl") &&
-		    bp->bio_length == sizeof *gio) {
-			gio = (struct g_ioctl *)bp->bio_data;
-			gio->func = devsw(dp->d_dev)->d_ioctl;
-			gio->dev =  dp->d_dev;
-			error = EDIRIOCTL;
-		} else 
-			error = ENOIOCTL;
+		error = ENOIOCTL;
 		break;
 	default:
 		error = EOPNOTSUPP;
@@ -332,35 +307,17 @@ g_disk_create(void *arg)
 
 
 
-dev_t
-disk_create(int unit, struct disk *dp, int flags, struct cdevsw *cdevsw, void * unused __unused)
+void
+disk_create(int unit, struct disk *dp, int flags, void *unused __unused, void * unused2 __unused)
 {
-	dev_t dev;
 
-	dev = g_malloc(sizeof *dev, M_WAITOK | M_ZERO);
 	dp->d_unit = unit;
-	dp->d_dev = dev;
 	dp->d_flags = flags;
-	dp->d_devsw = cdevsw;
-	dev->si_devsw = cdevsw;
-	if (cdevsw != NULL) {
-		dp->d_copen = cdevsw->d_open;
-		dp->d_cclose = cdevsw->d_close;
-		dp->d_cioctl = cdevsw->d_ioctl;
-		dp->d_strategy = cdevsw->d_strategy;
-		dp->d_dump = cdevsw->d_dump;
-		dp->d_name = cdevsw->d_name;
-	} 
 	KASSERT(dp->d_strategy != NULL, ("disk_create need d_strategy"));
 	KASSERT(dp->d_name != NULL, ("disk_create need d_name"));
 	KASSERT(*dp->d_name != 0, ("disk_create need d_name"));
 	KASSERT(strlen(dp->d_name) < SPECNAMELEN - 4, ("disk name too long"));
-	dev->si_disk = dp;
-	dev->si_udev = 0x10002; /* XXX: Needed ? */
-	dev->si_name = dev->__si_namebuf;
-	sprintf(dev->si_name, "%s%d", dp->d_name, unit);
 	g_call_me(g_disk_create, dp);
-	return (dev);
 }
 
 void
@@ -369,7 +326,6 @@ disk_destroy(struct disk *dp)
 	struct g_geom *gp;
 
 	gp = dp->d_geom;
-	g_free(dp->d_dev);
 	gp->flags |= G_GEOM_WITHER;
 	gp->softc = NULL;
 	g_orphan_provider(LIST_FIRST(&gp->provider), ENXIO);
diff --git a/sys/sys/conf.h b/sys/sys/conf.h
index 9183dcc1b8f7..c9791e6c6d02 100644
--- a/sys/sys/conf.h
+++ b/sys/sys/conf.h
@@ -89,7 +89,6 @@ struct cdev {
 			struct tty *__sit_tty;
 		} __si_tty;
 		struct {
-			struct disk *__sid_disk;
 			struct mount *__sid_mountpoint;
 			int __sid_bsize_phys; /* min physical block size */
 			int __sid_bsize_best; /* optimal block size */
@@ -103,7 +102,6 @@ struct cdev {
 };
 
 #define si_tty		__si_u.__si_tty.__sit_tty
-#define si_disk		__si_u.__si_disk.__sid_disk
 #define si_mountpoint	__si_u.__si_disk.__sid_mountpoint
 #define si_bsize_phys	__si_u.__si_disk.__sid_bsize_phys
 #define si_bsize_best	__si_u.__si_disk.__sid_bsize_best
diff --git a/sys/sys/disk.h b/sys/sys/disk.h
index fc098f53670a..7031e1528535 100644
--- a/sys/sys/disk.h
+++ b/sys/sys/disk.h
@@ -34,17 +34,12 @@ struct g_geom;
 
 struct disk {
 	/* Fields which are private to geom_disk */
-	struct cdevsw		*d_devsw;
-	d_open_t		*d_copen;	/* Compat */
-	d_close_t		*d_cclose;	/* Compat */
-	d_ioctl_t		*d_cioctl;	/* Compat */
 	struct g_geom		*d_geom;
 
 	/* Shared fields */
 	u_int			d_flags;
 	const char		*d_name;
 	u_int			d_unit;
-	dev_t			d_dev;		/* Compat */
 
 	/* Disk methods  */
 	disk_open_t		*d_open;
@@ -70,7 +65,7 @@ struct disk {
 #define DISKFLAG_OPEN		0x2
 #define DISKFLAG_CANDELETE	0x4
 
-dev_t disk_create(int unit, struct disk *disk, int flags, struct cdevsw *cdevsw, void *unused);
+void disk_create(int unit, struct disk *disk, int flags, void *unused, void *unused2);
 void disk_destroy(struct disk *disk);
 struct disk *disk_enumerate(struct disk *disk);
 void disk_err(struct bio *bp, const char *what, int blkdone, int nl);
diff --git a/sys/sys/linedisc.h b/sys/sys/linedisc.h
index 9183dcc1b8f7..c9791e6c6d02 100644
--- a/sys/sys/linedisc.h
+++ b/sys/sys/linedisc.h
@@ -89,7 +89,6 @@ struct cdev {
 			struct tty *__sit_tty;
 		} __si_tty;
 		struct {
-			struct disk *__sid_disk;
 			struct mount *__sid_mountpoint;
 			int __sid_bsize_phys; /* min physical block size */
 			int __sid_bsize_best; /* optimal block size */
@@ -103,7 +102,6 @@ struct cdev {
 };
 
 #define si_tty		__si_u.__si_tty.__sit_tty
-#define si_disk		__si_u.__si_disk.__sid_disk
 #define si_mountpoint	__si_u.__si_disk.__sid_mountpoint
 #define si_bsize_phys	__si_u.__si_disk.__sid_bsize_phys
 #define si_bsize_best	__si_u.__si_disk.__sid_bsize_best