svn commit: r221071 - in head: . sys/amd64/conf sys/arm/conf sys/cam sys/cam/ata sys/conf sys/geom sys/i386/conf sys/mips/conf sys/modules/cam sys/pc98/conf

Alexander Motin mav at FreeBSD.org
Tue Apr 26 17:01:49 UTC 2011


Author: mav
Date: Tue Apr 26 17:01:49 2011
New Revision: 221071
URL: http://svn.freebsd.org/changeset/base/221071

Log:
   - Add shim to simplify migration to the CAM-based ATA. For each new adaX
  device in /dev/ create symbolic link with adY name, trying to mimic old ATA
  numbering. Imitation is not complete, but should be enough in most cases to
  mount file systems without touching /etc/fstab.
   - To know what behavior to mimic, restore ATA_STATIC_ID option in cases
  where it was present before.
   - Add some more details to UPDATING.

Modified:
  head/UPDATING
  head/sys/amd64/conf/GENERIC
  head/sys/arm/conf/CRB
  head/sys/arm/conf/EP80219
  head/sys/arm/conf/IQ31244
  head/sys/cam/ata/ata_da.c
  head/sys/cam/cam_xpt.c
  head/sys/cam/cam_xpt.h
  head/sys/conf/NOTES
  head/sys/geom/geom_dev.c
  head/sys/i386/conf/GENERIC
  head/sys/i386/conf/XBOX
  head/sys/mips/conf/OCTEON1
  head/sys/mips/conf/std.SWARM
  head/sys/modules/cam/Makefile
  head/sys/pc98/conf/GENERIC

Modified: head/UPDATING
==============================================================================
--- head/UPDATING	Tue Apr 26 16:56:43 2011	(r221070)
+++ head/UPDATING	Tue Apr 26 17:01:49 2011	(r221071)
@@ -30,7 +30,17 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 9.
 	them respectively (adX -> adaY, acdX -> cdY, afdX -> daY, astX -> saY,
 	where 'Y's are the sequential numbers starting from zero for each type
 	in order of detection, unless configured otherwise with tunables,
-	see cam(4)).
+	see cam(4)). There will be symbolic links created in /dev/ to map
+	old adX devices to the respective adaY. They should provide basic
+	compatibility for file systems mounting in most cases, but they do
+	not support old user-level APIs and do not have respective providers
+	in GEOM. Consider using updated management tools with new device names.
+
+	It is possible to load devices ahci, ata, siis and mvs as modules,
+	but option ATA_CAM should remain in kernel configuration to make ata
+	module work as CAM driver supporting legacy ATA controllers. Device ata
+	still can be used in modular fashion (atacore + ...). Modules atadisk
+	and atapi* are not used and won't affect operation in ATA_CAM mode.
 
 	ataraid(4) functionality is now supported by the RAID GEOM class.
 	To use it you can load geom_raid kernel module and use graid(8) tool
@@ -49,7 +59,6 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 9.
 	    device         atapicd         # ATAPI CDROM drives
 	    device         atapifd         # ATAPI floppy drives
 	    device         atapist         # ATAPI tape drives
-	    options        ATA_STATIC_ID   # Static device numbering
 
 20110423:
 	The default NFS server has been changed to the new server, which

Modified: head/sys/amd64/conf/GENERIC
==============================================================================
--- head/sys/amd64/conf/GENERIC	Tue Apr 26 16:56:43 2011	(r221070)
+++ head/sys/amd64/conf/GENERIC	Tue Apr 26 17:01:49 2011	(r221071)
@@ -93,6 +93,7 @@ device		fdc
 device		ahci		# AHCI-compatible SATA controllers
 device		ata		# Legacy ATA/SATA controllers
 options 	ATA_CAM		# Handle legacy controllers with CAM
+options 	ATA_STATIC_ID	# Static device numbering
 device		mvs		# Marvell 88SX50XX/88SX60XX/88SX70XX/SoC SATA
 device		siis		# SiliconImage SiI3124/SiI3132/SiI3531 SATA
 

Modified: head/sys/arm/conf/CRB
==============================================================================
--- head/sys/arm/conf/CRB	Tue Apr 26 16:56:43 2011	(r221070)
+++ head/sys/arm/conf/CRB	Tue Apr 26 17:01:49 2011	(r221071)
@@ -74,6 +74,7 @@ device		pci
 
 device		ata
 options 	ATA_CAM
+options 	ATA_STATIC_ID	# Static device numbering
 
 device		scbus		# SCSI bus (required for ATA/SCSI)
 device		cd		# CD

Modified: head/sys/arm/conf/EP80219
==============================================================================
--- head/sys/arm/conf/EP80219	Tue Apr 26 16:56:43 2011	(r221070)
+++ head/sys/arm/conf/EP80219	Tue Apr 26 17:01:49 2011	(r221071)
@@ -74,6 +74,7 @@ device		pci
 
 device		ata
 options 	ATA_CAM
+options 	ATA_STATIC_ID	# Static device numbering
 
 device		scbus		# SCSI bus (required for ATA/SCSI)
 device		cd		# CD

Modified: head/sys/arm/conf/IQ31244
==============================================================================
--- head/sys/arm/conf/IQ31244	Tue Apr 26 16:56:43 2011	(r221070)
+++ head/sys/arm/conf/IQ31244	Tue Apr 26 17:01:49 2011	(r221071)
@@ -73,6 +73,7 @@ device		pci
 
 device		ata
 options 	ATA_CAM
+options 	ATA_STATIC_ID	# Static device numbering
 
 device		scbus		# SCSI bus (required for ATA/SCSI)
 device		cd		# CD

Modified: head/sys/cam/ata/ata_da.c
==============================================================================
--- head/sys/cam/ata/ata_da.c	Tue Apr 26 16:56:43 2011	(r221070)
+++ head/sys/cam/ata/ata_da.c	Tue Apr 26 17:01:49 2011	(r221071)
@@ -28,6 +28,7 @@
 __FBSDID("$FreeBSD$");
 
 #include "opt_ada.h"
+#include "opt_ata.h"
 
 #include <sys/param.h>
 
@@ -183,6 +184,14 @@ static void		adashutdown(void *arg, int 
 static void		adasuspend(void *arg);
 static void		adaresume(void *arg);
 
+#ifndef	ADA_DEFAULT_LEGACY_ALIASES
+#ifdef ATA_CAM
+#define	ADA_DEFAULT_LEGACY_ALIASES	1
+#else
+#define	ADA_DEFAULT_LEGACY_ALIASES	0
+#endif
+#endif
+
 #ifndef ADA_DEFAULT_TIMEOUT
 #define ADA_DEFAULT_TIMEOUT 30	/* Timeout in seconds */
 #endif
@@ -215,6 +224,7 @@ static void		adaresume(void *arg);
 #define	ata_disk_firmware_geom_adjust(disk)
 #endif
 
+static int ada_legacy_aliases = ADA_DEFAULT_LEGACY_ALIASES;
 static int ada_retry_count = ADA_DEFAULT_RETRY;
 static int ada_default_timeout = ADA_DEFAULT_TIMEOUT;
 static int ada_send_ordered = ADA_DEFAULT_SEND_ORDERED;
@@ -224,6 +234,9 @@ static int ada_write_cache = ADA_DEFAULT
 
 SYSCTL_NODE(_kern_cam, OID_AUTO, ada, CTLFLAG_RD, 0,
             "CAM Direct Access Disk driver");
+SYSCTL_INT(_kern_cam_ada, OID_AUTO, legacy_aliases, CTLFLAG_RW,
+           &ada_legacy_aliases, 0, "Create legacy-like device aliases");
+TUNABLE_INT("kern.cam.ada.legacy_aliases", &ada_legacy_aliases);
 SYSCTL_INT(_kern_cam_ada, OID_AUTO, retry_count, CTLFLAG_RW,
            &ada_retry_count, 0, "Normal I/O retry count");
 TUNABLE_INT("kern.cam.ada.retry_count", &ada_retry_count);
@@ -723,10 +736,11 @@ adaregister(struct cam_periph *periph, v
 	struct ada_softc *softc;
 	struct ccb_pathinq cpi;
 	struct ccb_getdev *cgd;
-	char   announce_buf[80];
+	char   announce_buf[80], buf1[32];
 	struct disk_params *dp;
 	caddr_t match;
 	u_int maxio;
+	int legacy_id;
 
 	cgd = (struct ccb_getdev *)arg;
 	if (periph == NULL) {
@@ -861,6 +875,22 @@ adaregister(struct cam_periph *periph, v
 	softc->disk->d_fwheads = softc->params.heads;
 	ata_disk_firmware_geom_adjust(softc->disk);
 
+	if (ada_legacy_aliases) {
+#ifdef ATA_STATIC_ID
+		legacy_id = xpt_path_legacy_ata_id(periph->path);
+#else
+		legacy_id = softc->disk->d_unit;
+#endif
+		if (legacy_id >= 0) {
+			snprintf(announce_buf, sizeof(announce_buf),
+			    "kern.devalias.%s%d",
+			    softc->disk->d_name, softc->disk->d_unit);
+			snprintf(buf1, sizeof(buf1),
+			    "ad%d", legacy_id);
+			setenv(announce_buf, buf1);
+		}
+	} else
+		legacy_id = -1;
 	disk_create(softc->disk, DISK_VERSION);
 	mtx_lock(periph->sim->mtx);
 	cam_periph_unhold(periph);
@@ -874,6 +904,9 @@ adaregister(struct cam_periph *periph, v
 		dp->secsize, dp->heads,
 		dp->secs_per_track, dp->cylinders);
 	xpt_announce_periph(periph, announce_buf);
+	if (legacy_id >= 0)
+		printf("%s%d: Previously was known as ad%d\n",
+		       periph->periph_name, periph->unit_number, legacy_id);
 
 	/*
 	 * Create our sysctl variables, now that we know

Modified: head/sys/cam/cam_xpt.c
==============================================================================
--- head/sys/cam/cam_xpt.c	Tue Apr 26 16:56:43 2011	(r221070)
+++ head/sys/cam/cam_xpt.c	Tue Apr 26 17:01:49 2011	(r221071)
@@ -3569,6 +3569,42 @@ xpt_path_periph(struct cam_path *path)
 	return (path->periph);
 }
 
+int
+xpt_path_legacy_ata_id(struct cam_path *path)
+{
+	struct cam_eb *bus;
+	int bus_id;
+
+	if ((strcmp(path->bus->sim->sim_name, "ata") != 0) &&
+	    strcmp(path->bus->sim->sim_name, "ahcich") != 0 &&
+	    strcmp(path->bus->sim->sim_name, "mvsch") != 0 &&
+	    strcmp(path->bus->sim->sim_name, "siisch") != 0)
+		return (-1);
+
+	if (strcmp(path->bus->sim->sim_name, "ata") == 0 &&
+	    path->bus->sim->unit_number < 2) {
+		bus_id = path->bus->sim->unit_number;
+	} else {
+		bus_id = 2;
+		xpt_lock_buses();
+		TAILQ_FOREACH(bus, &xsoftc.xpt_busses, links) {
+			if (bus == path->bus)
+				break;
+			if ((strcmp(bus->sim->sim_name, "ata") == 0 &&
+			     bus->sim->unit_number >= 2) ||
+			    strcmp(bus->sim->sim_name, "ahcich") == 0 ||
+			    strcmp(bus->sim->sim_name, "mvsch") == 0 ||
+			    strcmp(bus->sim->sim_name, "siisch") == 0)
+				bus_id++;
+		}
+		xpt_unlock_buses();
+	}
+	if (path->target != NULL)
+		return (bus_id * 2 + path->target->target_id);
+	else
+		return (bus_id * 2);
+}
+
 /*
  * Release a CAM control block for the caller.  Remit the cost of the structure
  * to the device referenced by the path.  If the this device had no 'credits'

Modified: head/sys/cam/cam_xpt.h
==============================================================================
--- head/sys/cam/cam_xpt.h	Tue Apr 26 16:56:43 2011	(r221070)
+++ head/sys/cam/cam_xpt.h	Tue Apr 26 17:01:49 2011	(r221071)
@@ -113,6 +113,7 @@ int			xpt_path_string(struct cam_path *p
 path_id_t		xpt_path_path_id(struct cam_path *path);
 target_id_t		xpt_path_target_id(struct cam_path *path);
 lun_id_t		xpt_path_lun_id(struct cam_path *path);
+int			xpt_path_legacy_ata_id(struct cam_path *path);
 struct cam_sim		*xpt_path_sim(struct cam_path *path);
 struct cam_periph	*xpt_path_periph(struct cam_path *path);
 void			xpt_async(u_int32_t async_code, struct cam_path *path,

Modified: head/sys/conf/NOTES
==============================================================================
--- head/sys/conf/NOTES	Tue Apr 26 16:56:43 2011	(r221070)
+++ head/sys/conf/NOTES	Tue Apr 26 17:01:49 2011	(r221071)
@@ -1754,7 +1754,7 @@ hint.ata.1.irq="15"
 #			atapifd, atapist, atapicam) and all user-level APIs.
 #			cam(4) drivers and APIs will be connected instead.
 
-#options 	ATA_STATIC_ID
+options 	ATA_STATIC_ID
 #options 	ATA_REQUEST_TIMEOUT=10
 options 	ATA_CAM
 

Modified: head/sys/geom/geom_dev.c
==============================================================================
--- head/sys/geom/geom_dev.c	Tue Apr 26 16:56:43 2011	(r221070)
+++ head/sys/geom/geom_dev.c	Tue Apr 26 17:01:49 2011	(r221071)
@@ -113,8 +113,9 @@ g_dev_taste(struct g_class *mp, struct g
 {
 	struct g_geom *gp;
 	struct g_consumer *cp;
-	int error;
-	struct cdev *dev;
+	int error, len;
+	struct cdev *dev, *adev;
+	char buf[64], *val;
 
 	g_trace(G_T_TOPOLOGY, "dev_taste(%s,%s)", mp->name, pp->name);
 	g_topology_assert();
@@ -136,12 +137,35 @@ g_dev_taste(struct g_class *mp, struct g
 		g_destroy_geom(gp);
 		return (NULL);
 	}
+
+	/* Search for device alias name and create it if found. */
+	adev = NULL;
+	for (len = MIN(strlen(gp->name), sizeof(buf) - 15); len > 0; len--) {
+		snprintf(buf, sizeof(buf), "kern.devalias.%s", gp->name);
+		buf[14 + len] = 0;
+		val = getenv(buf);
+		if (val != NULL) {
+			snprintf(buf, sizeof(buf), "%s%s",
+			    val, gp->name + len);
+			freeenv(val);
+			adev = make_dev_alias(dev, buf);
+			break;
+		}
+	}
+
 	if (pp->flags & G_PF_CANDELETE)
 		dev->si_flags |= SI_CANDELETE;
 	dev->si_iosize_max = MAXPHYS;
 	gp->softc = dev;
 	dev->si_drv1 = gp;
 	dev->si_drv2 = cp;
+	if (adev != NULL) {
+		if (pp->flags & G_PF_CANDELETE)
+			adev->si_flags |= SI_CANDELETE;
+		adev->si_iosize_max = MAXPHYS;
+		adev->si_drv1 = gp;
+		adev->si_drv2 = cp;
+	}
 	return (gp);
 }
 

Modified: head/sys/i386/conf/GENERIC
==============================================================================
--- head/sys/i386/conf/GENERIC	Tue Apr 26 16:56:43 2011	(r221070)
+++ head/sys/i386/conf/GENERIC	Tue Apr 26 17:01:49 2011	(r221071)
@@ -95,6 +95,7 @@ device		fdc
 device		ahci		# AHCI-compatible SATA controllers
 device		ata		# Legacy ATA/SATA controllers
 options 	ATA_CAM		# Handle legacy controllers with CAM
+options 	ATA_STATIC_ID	# Static device numbering
 device		mvs		# Marvell 88SX50XX/88SX60XX/88SX70XX/SoC SATA
 device		siis		# SiliconImage SiI3124/SiI3132/SiI3531 SATA
 

Modified: head/sys/i386/conf/XBOX
==============================================================================
--- head/sys/i386/conf/XBOX	Tue Apr 26 16:56:43 2011	(r221070)
+++ head/sys/i386/conf/XBOX	Tue Apr 26 17:01:49 2011	(r221071)
@@ -52,6 +52,7 @@ device		pci
 # ATA and ATAPI devices
 device		ata
 options 	ATA_CAM
+options 	ATA_STATIC_ID	# Static device numbering
 
 # ATA/SCSI peripherals
 device		scbus		# SCSI bus (required for ATA/SCSI)

Modified: head/sys/mips/conf/OCTEON1
==============================================================================
--- head/sys/mips/conf/OCTEON1	Tue Apr 26 16:56:43 2011	(r221070)
+++ head/sys/mips/conf/OCTEON1	Tue Apr 26 17:01:49 2011	(r221071)
@@ -99,6 +99,7 @@ device		pci
 device		ahci		# AHCI-compatible SATA controllers
 device		ata		# Legacy ATA/SATA controllers
 options 	ATA_CAM		# Handle legacy controllers with CAM
+options 	ATA_STATIC_ID	# Static device numbering
 device		mvs		# Marvell 88SX50XX/88SX60XX/88SX70XX/SoC SATA
 device		siis		# SiliconImage SiI3124/SiI3132/SiI3531 SATA
 

Modified: head/sys/mips/conf/std.SWARM
==============================================================================
--- head/sys/mips/conf/std.SWARM	Tue Apr 26 16:56:43 2011	(r221070)
+++ head/sys/mips/conf/std.SWARM	Tue Apr 26 17:01:49 2011	(r221071)
@@ -58,3 +58,4 @@ device pass
 
 device		ata
 options 	ATA_CAM
+options 	ATA_STATIC_ID	# Static device numbering

Modified: head/sys/modules/cam/Makefile
==============================================================================
--- head/sys/modules/cam/Makefile	Tue Apr 26 16:56:43 2011	(r221070)
+++ head/sys/modules/cam/Makefile	Tue Apr 26 17:01:49 2011	(r221071)
@@ -9,6 +9,7 @@ KMOD=	cam
 # See sys/conf/options for the flags that go into the different opt_*.h files.
 SRCS=	opt_cam.h
 SRCS+=	opt_ada.h
+SRCS+=	opt_ata.h
 SRCS+=	opt_scsi.h
 SRCS+=	opt_cd.h
 SRCS+=	opt_pt.h

Modified: head/sys/pc98/conf/GENERIC
==============================================================================
--- head/sys/pc98/conf/GENERIC	Tue Apr 26 16:56:43 2011	(r221070)
+++ head/sys/pc98/conf/GENERIC	Tue Apr 26 17:01:49 2011	(r221071)
@@ -91,6 +91,7 @@ device		fdc
 device		ahci		# AHCI-compatible SATA controllers
 device		ata		# Legacy ATA/SATA controllers
 options 	ATA_CAM		# Handle legacy controllers with CAM
+options 	ATA_STATIC_ID	# Static device numbering
 device		mvs		# Marvell 88SX50XX/88SX60XX/88SX70XX/SoC SATA
 device		siis		# SiliconImage SiI3124/SiI3132/SiI3531 SATA
 


More information about the svn-src-all mailing list