On 14.04.2011 19:00, Jaakko Heinonen wrote:
On 2011-04-14, Alexander Motin wrote:
   Fix typo in write_cache tunable name and move TUNABLE_INT_FETCH() out of
   the SIM lock to fix WITNESS warning.

Thanks!

Does this analogous patch for cd(4) and da(4) look good?

Looks fine.

I am not
completely sure if it's safe to move setting of minimum_cmd_size in
daregister().

I see no problem. dastart() in NORMAL state, that using it, won't be called until device created (to be opened) and hold will not be dropped.

---

Move TUNABLE_INT_FETCH() out of the SIM lock to avoid sleeping while
holding the lock. The fix is analogous to r220618 for ada(4).

%%%
Index: sys/cam/scsi/scsi_cd.c
===================================================================
--- sys/cam/scsi/scsi_cd.c      (revision 220619)
+++ sys/cam/scsi/scsi_cd.c      (working copy)
@@ -687,6 +687,8 @@ cdregister(struct cam_periph *periph, vo
        else
                softc->minimum_command_size = 6;

+       (void)cam_periph_hold(periph, PRIBIO);
+       cam_periph_unlock(periph);
        /*
         * Load the user's default, if any.
         */
@@ -712,7 +714,6 @@ cdregister(struct cam_periph *periph, vo
         * WORM peripheral driver.  WORM drives will also have the WORM
         * driver attached to them.
         */
-       cam_periph_unlock(periph);
        softc->disk = disk_alloc();
        softc->disk->d_devstat = devstat_new_entry("cd",
                          periph->unit_number, 0,
@@ -745,6 +746,7 @@ cdregister(struct cam_periph *periph, vo
        softc->disk->d_hba_subdevice = cpi.hba_subdevice;
        disk_create(softc->disk, DISK_VERSION);
        cam_periph_lock(periph);
+       cam_periph_unhold(periph);

        /*
         * Add an async callback so that we get
Index: sys/cam/scsi/scsi_da.c
===================================================================
--- sys/cam/scsi/scsi_da.c      (revision 220619)
+++ sys/cam/scsi/scsi_da.c      (working copy)
@@ -1231,35 +1231,6 @@ daregister(struct cam_periph *periph, vo
        TASK_INIT(&softc->sysctl_task, 0, dasysctlinit, periph);

        /*
-        * RBC devices don't have to support READ(6), only READ(10).
-        */
-       if (softc->quirks&  DA_Q_NO_6_BYTE || SID_TYPE(&cgd->inq_data) == T_RBC)
-               softc->minimum_cmd_size = 10;
-       else
-               softc->minimum_cmd_size = 6;
-
-       /*
-        * Load the user's default, if any.
-        */
-       snprintf(tmpstr, sizeof(tmpstr), "kern.cam.da.%d.minimum_cmd_size",
-                periph->unit_number);
-       TUNABLE_INT_FETCH(tmpstr,&softc->minimum_cmd_size);
-
-       /*
-        * 6, 10, 12 and 16 are the currently permissible values.
-        */
-       if (softc->minimum_cmd_size<  6)
-               softc->minimum_cmd_size = 6;
-       else if ((softc->minimum_cmd_size>  6)
-       &&  (softc->minimum_cmd_size<= 10))
-               softc->minimum_cmd_size = 10;
-       else if ((softc->minimum_cmd_size>  10)
-       &&  (softc->minimum_cmd_size<= 12))
-               softc->minimum_cmd_size = 12;
-       else if (softc->minimum_cmd_size>  12)
-               softc->minimum_cmd_size = 16;
-
-       /*
         * Register this media as a disk
         */

@@ -1291,6 +1262,35 @@ daregister(struct cam_periph *periph, vo
            dasendorderedtag, softc);

        mtx_unlock(periph->sim->mtx);
+       /*
+        * RBC devices don't have to support READ(6), only READ(10).
+        */
+       if (softc->quirks&  DA_Q_NO_6_BYTE || SID_TYPE(&cgd->inq_data) == T_RBC)
+               softc->minimum_cmd_size = 10;
+       else
+               softc->minimum_cmd_size = 6;
+
+       /*
+        * Load the user's default, if any.
+        */
+       snprintf(tmpstr, sizeof(tmpstr), "kern.cam.da.%d.minimum_cmd_size",
+                periph->unit_number);
+       TUNABLE_INT_FETCH(tmpstr,&softc->minimum_cmd_size);
+
+       /*
+        * 6, 10, 12 and 16 are the currently permissible values.
+        */
+       if (softc->minimum_cmd_size<  6)
+               softc->minimum_cmd_size = 6;
+       else if ((softc->minimum_cmd_size>  6)
+       &&  (softc->minimum_cmd_size<= 10))
+               softc->minimum_cmd_size = 10;
+       else if ((softc->minimum_cmd_size>  10)
+       &&  (softc->minimum_cmd_size<= 12))
+               softc->minimum_cmd_size = 12;
+       else if (softc->minimum_cmd_size>  12)
+               softc->minimum_cmd_size = 16;
+
        softc->disk = disk_alloc();
        softc->disk->d_open = daopen;
        softc->disk->d_close = daclose;
%%%



--
Alexander Motin
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to