factor out the code that figures out whether you're probing or detaching
authordlg <dlg@openbsd.org>
Tue, 22 Apr 2014 07:29:11 +0000 (07:29 +0000)
committerdlg <dlg@openbsd.org>
Tue, 22 Apr 2014 07:29:11 +0000 (07:29 +0000)
a whole bus, a target, or a specific lun on a target from the bioctl
and scsi_req paths.

i want to reuse this factored code for something claudio wants.

sys/scsi/scsi_base.c
sys/scsi/scsiconf.c
sys/scsi/scsiconf.h

index 0487a95..769815b 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: scsi_base.c,v 1.210 2014/01/27 23:44:40 dlg Exp $     */
+/*     $OpenBSD: scsi_base.c,v 1.211 2014/04/22 07:29:11 dlg Exp $     */
 /*     $NetBSD: scsi_base.c,v 1.43 1997/04/02 02:29:36 mycroft Exp $   */
 
 /*
@@ -176,17 +176,7 @@ scsi_plug_probe(void *xsc, void *xp)
 
        pool_put(&scsi_plug_pool, p);
 
-       if (target == -1 && lun == -1)
-               scsi_probe_bus(sc);
-
-       /* specific lun and wildcard target is bad */
-       if (target == -1)
-               return;
-
-       if (lun == -1)
-               scsi_probe_target(sc, target);
-
-       scsi_probe_lun(sc, target, lun);
+       scsi_probe(sc, target, lun);
 }
 
 void
@@ -199,17 +189,7 @@ scsi_plug_detach(void *xsc, void *xp)
 
        pool_put(&scsi_plug_pool, p);
 
-       if (target == -1 && lun == -1)
-               scsi_detach_bus(sc, how);
-
-       /* specific lun and wildcard target is bad */
-       if (target == -1)
-               return;
-
-       if (lun == -1)
-               scsi_detach_target(sc, target, how);
-
-       scsi_detach_lun(sc, target, lun, how);
+       scsi_detach(sc, target, lun, how);
 }
 
 int
index ec60a46..43dcd48 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: scsiconf.c,v 1.186 2014/01/31 02:53:41 dlg Exp $      */
+/*     $OpenBSD: scsiconf.c,v 1.187 2014/04/22 07:29:11 dlg Exp $      */
 /*     $NetBSD: scsiconf.c,v 1.57 1996/05/02 01:09:01 neil Exp $       */
 
 /*
@@ -305,32 +305,11 @@ scsibus_bioctl(struct device *dev, u_long cmd, caddr_t addr)
        switch (cmd) {
        case SBIOCPROBE:
                sdev = (struct sbioc_device *)addr;
-
-               if (sdev->sd_target == -1 && sdev->sd_lun == -1)
-                       return (scsi_probe_bus(sc));
-
-               /* specific lun and wildcard target is bad */
-               if (sdev->sd_target == -1)
-                       return (EINVAL);
-
-               if (sdev->sd_lun == -1)
-                       return (scsi_probe_target(sc, sdev->sd_target));
-
-               return (scsi_probe_lun(sc, sdev->sd_target, sdev->sd_lun));
+               return (scsi_probe(sc, sdev->sd_target, sdev->sd_lun));
 
        case SBIOCDETACH:
                sdev = (struct sbioc_device *)addr;
-
-               if (sdev->sd_target == -1 && sdev->sd_lun == -1)
-                       return (scsi_detach_bus(sc, 0));
-
-               if (sdev->sd_target == -1)
-                       return (EINVAL);
-
-               if (sdev->sd_lun == -1)
-                       return (scsi_detach_target(sc, sdev->sd_target, 0));
-
-               return (scsi_detach_lun(sc, sdev->sd_target, sdev->sd_lun, 0));
+               return (scsi_detach(sc, sdev->sd_target, sdev->sd_lun, 0));
 
        default:
                return (ENOTTY);
@@ -412,6 +391,22 @@ dumbscan:
        return (0);
 }
 
+int
+scsi_probe(struct scsibus_softc *sc, int target, int lun)
+{
+       if (target == -1 && lun == -1)
+               return (scsi_probe_bus(sc));
+
+       /* specific lun and wildcard target is bad */
+       if (target == -1)
+               return (EINVAL);
+
+       if (lun == -1)
+               return (scsi_probe_target(sc, target));
+
+       return (scsi_probe_lun(sc, target, lun));
+}
+
 int
 scsi_probe_lun(struct scsibus_softc *sc, int target, int lun)
 {
@@ -440,6 +435,22 @@ scsi_detach_bus(struct scsibus_softc *sc, int flags)
        return (rv);
 }
 
+int
+scsi_detach(struct scsibus_softc *sc, int target, int lun, int flags)
+{
+       if (target == -1 && lun == -1)
+               return (scsi_detach_bus(sc, flags));
+
+       /* specific lun and wildcard target is bad */
+       if (target == -1)
+               return (EINVAL);
+
+       if (lun == -1)
+               return (scsi_detach_target(sc, target, flags));
+
+       return (scsi_detach_lun(sc, target, lun, flags));
+}
+
 int
 scsi_detach_target(struct scsibus_softc *sc, int target, int flags)
 {
index 511c44b..43cfb63 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: scsiconf.h,v 1.160 2014/01/31 02:53:41 dlg Exp $      */
+/*     $OpenBSD: scsiconf.h,v 1.161 2014/04/22 07:29:11 dlg Exp $      */
 /*     $NetBSD: scsiconf.h,v 1.35 1997/04/02 02:29:38 mycroft Exp $    */
 
 /*
@@ -507,10 +507,12 @@ void      scsi_show_mem(u_char *, int);
 void   scsi_strvis(u_char *, u_char *, int);
 int    scsi_delay(struct scsi_xfer *, int);
 
+int    scsi_probe(struct scsibus_softc *, int, int);
 int    scsi_probe_bus(struct scsibus_softc *);
 int    scsi_probe_target(struct scsibus_softc *, int);
 int    scsi_probe_lun(struct scsibus_softc *, int, int);
 
+int    scsi_detach(struct scsibus_softc *, int, int, int);
 int    scsi_detach_bus(struct scsibus_softc *, int);
 int    scsi_detach_target(struct scsibus_softc *, int, int);
 int    scsi_detach_lun(struct scsibus_softc *, int, int, int);