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
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to