Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 2 May 2012 06:52:00 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r234912 - in stable/8/sys: cam cam/ata geom modules/cam
Message-ID:  <201205020652.q426q0nO069704@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Wed May  2 06:52:00 2012
New Revision: 234912
URL: http://svn.freebsd.org/changeset/base/234912

Log:
  Merge ATA_CAM compatibility shims. While 8-STABLE doesn't have ATA_CAM
  enabled by default, this should make migration easier for users enabling
  it manually.
  
  r221071:
  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.
  
  r221384:
  Do not report legacy unit numbers (do not create legacy aliases) for disks
  on port multiplier ports above first two. They don't fit into ATA_STATIC_ID
  scheme and so can't be mapped properly. No need to pollute dev.

Modified:
  stable/8/sys/cam/ata/ata_da.c
  stable/8/sys/cam/cam_xpt.c
  stable/8/sys/cam/cam_xpt.h
  stable/8/sys/geom/geom_dev.c
  stable/8/sys/modules/cam/Makefile
Directory Properties:
  stable/8/sys/   (props changed)

Modified: stable/8/sys/cam/ata/ata_da.c
==============================================================================
--- stable/8/sys/cam/ata/ata_da.c	Wed May  2 06:19:26 2012	(r234911)
+++ stable/8/sys/cam/ata/ata_da.c	Wed May  2 06:52:00 2012	(r234912)
@@ -28,6 +28,7 @@
 __FBSDID("$FreeBSD$");
 
 #include "opt_ada.h"
+#include "opt_ata.h"
 
 #include <sys/param.h>
 
@@ -295,6 +296,14 @@ static void		adagetparams(struct cam_per
 static timeout_t	adasendorderedtag;
 static void		adashutdown(void *arg, int howto);
 
+#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
@@ -332,6 +341,7 @@ static void		adashutdown(void *arg, int 
 #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;
@@ -341,6 +351,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);
@@ -841,11 +854,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 quirks;
+	int legacy_id, quirks;
 
 	cgd = (struct ccb_getdev *)arg;
 	if (periph == NULL) {
@@ -986,6 +999,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);
@@ -999,6 +1028,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: stable/8/sys/cam/cam_xpt.c
==============================================================================
--- stable/8/sys/cam/cam_xpt.c	Wed May  2 06:19:26 2012	(r234911)
+++ stable/8/sys/cam/cam_xpt.c	Wed May  2 06:52:00 2012	(r234912)
@@ -3668,6 +3668,45 @@ 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) {
+		if (path->target->target_id < 2)
+			return (bus_id * 2 + path->target->target_id);
+		else
+			return (-1);
+	} 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: stable/8/sys/cam/cam_xpt.h
==============================================================================
--- stable/8/sys/cam/cam_xpt.h	Wed May  2 06:19:26 2012	(r234911)
+++ stable/8/sys/cam/cam_xpt.h	Wed May  2 06:52:00 2012	(r234912)
@@ -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: stable/8/sys/geom/geom_dev.c
==============================================================================
--- stable/8/sys/geom/geom_dev.c	Wed May  2 06:19:26 2012	(r234911)
+++ stable/8/sys/geom/geom_dev.c	Wed May  2 06:52:00 2012	(r234912)
@@ -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();
@@ -128,12 +129,35 @@ g_dev_taste(struct g_class *mp, struct g
 	    ("g_dev_taste(%s) failed to g_attach, err=%d", pp->name, error));
 	dev = make_dev(&g_dev_cdevsw, 0,
 	    UID_ROOT, GID_OPERATOR, 0640, "%s", gp->name);
+
+	/* 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: stable/8/sys/modules/cam/Makefile
==============================================================================
--- stable/8/sys/modules/cam/Makefile	Wed May  2 06:19:26 2012	(r234911)
+++ stable/8/sys/modules/cam/Makefile	Wed May  2 06:52:00 2012	(r234912)
@@ -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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201205020652.q426q0nO069704>