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
 
_______________________________________________
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