Author: mav
Date: Fri Apr  5 11:48:35 2013
New Revision: 249155
URL: http://svnweb.freebsd.org/changeset/base/249155

Log:
  MFC r245252 (by smh):
  Updates delete_method sysctl changes to always maintain disk d_flags
  DISKFLAG_CANDELETE. While this change makes this layer consistent
  other layers such as UFS and ZFS BIO_DELETE support may not notice
  any change made manually via these device sysctls until the device
  is reopened via a mount.
  
  Also corrected var order in dadeletemethodsysctl
  
  PR:             kern/169801

Modified:
  stable/9/sys/cam/scsi/scsi_da.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/cam/scsi/scsi_da.c
==============================================================================
--- stable/9/sys/cam/scsi/scsi_da.c     Fri Apr  5 11:45:52 2013        
(r249154)
+++ stable/9/sys/cam/scsi/scsi_da.c     Fri Apr  5 11:48:35 2013        
(r249155)
@@ -863,6 +863,8 @@ static      void            daasync(void *callback_arg,
 static void            dasysctlinit(void *context, int pending);
 static int             dacmdsizesysctl(SYSCTL_HANDLER_ARGS);
 static int             dadeletemethodsysctl(SYSCTL_HANDLER_ARGS);
+static int             dadeletemethodset(struct da_softc *softc,
+                                         da_delete_methods delete_method);
 static periph_ctor_t   daregister;
 static periph_dtor_t   dacleanup;
 static periph_start_t  dastart;
@@ -1489,7 +1491,7 @@ dasysctlinit(void *context, int pending)
         */
        SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
                OID_AUTO, "delete_method", CTLTYPE_STRING | CTLFLAG_RW,
-               &softc->delete_method, 0, dadeletemethodsysctl, "A",
+               softc, 0, dadeletemethodsysctl, "A",
                "BIO_DELETE execution method");
        SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
                OID_AUTO, "minimum_cmd_size", CTLTYPE_INT | CTLFLAG_RW,
@@ -1566,14 +1568,33 @@ dacmdsizesysctl(SYSCTL_HANDLER_ARGS)
 }
 
 static int
+dadeletemethodset(struct da_softc *softc, da_delete_methods delete_method)
+{
+
+       if (delete_method < 0 || delete_method > DA_DELETE_MAX)
+               return (EINVAL);
+
+       softc->delete_method = delete_method;
+
+       if (softc->delete_method > DA_DELETE_DISABLE)
+               softc->disk->d_flags |= DISKFLAG_CANDELETE;
+       else
+               softc->disk->d_flags &= ~DISKFLAG_CANDELETE;
+
+       return (0);
+}
+
+static int
 dadeletemethodsysctl(SYSCTL_HANDLER_ARGS)
 {
        char buf[16];
-       int error;
        const char *p;
-       int i, value;
+       struct da_softc *softc;
+       int i, error, value;
 
-       value = *(int *)arg1;
+       softc = (struct da_softc *)arg1;
+
+       value = softc->delete_method;
        if (value < 0 || value > DA_DELETE_MAX)
                p = "UNKNOWN";
        else
@@ -1585,8 +1606,7 @@ dadeletemethodsysctl(SYSCTL_HANDLER_ARGS
        for (i = 0; i <= DA_DELETE_MAX; i++) {
                if (strcmp(buf, da_delete_method_names[i]) != 0)
                        continue;
-               *(int *)arg1 = i;
-               return (0);
+               return dadeletemethodset(softc, i);
        }
        return (EINVAL);
 }
@@ -2081,24 +2101,24 @@ cmd6workaround(union ccb *ccb)
                if (softc->delete_method == DA_DELETE_UNMAP) {
                        xpt_print(ccb->ccb_h.path, "UNMAP is not supported, "
                            "switching to WRITE SAME(16) with UNMAP.\n");
-                       softc->delete_method = DA_DELETE_WS16;
+                       dadeletemethodset(softc, DA_DELETE_WS16);
                } else if (softc->delete_method == DA_DELETE_WS16) {
                        xpt_print(ccb->ccb_h.path,
                            "WRITE SAME(16) with UNMAP is not supported, "
                            "disabling BIO_DELETE.\n");
-                       softc->delete_method = DA_DELETE_DISABLE;
+                       dadeletemethodset(softc, DA_DELETE_DISABLE);
                } else if (softc->delete_method == DA_DELETE_WS10) {
                        xpt_print(ccb->ccb_h.path,
                            "WRITE SAME(10) with UNMAP is not supported, "
                            "disabling BIO_DELETE.\n");
-                       softc->delete_method = DA_DELETE_DISABLE;
+                       dadeletemethodset(softc, DA_DELETE_DISABLE);
                } else if (softc->delete_method == DA_DELETE_ZERO) {
                        xpt_print(ccb->ccb_h.path,
                            "WRITE SAME(10) is not supported, "
                            "disabling BIO_DELETE.\n");
-                       softc->delete_method = DA_DELETE_DISABLE;
+                       dadeletemethodset(softc, DA_DELETE_DISABLE);
                } else
-                       softc->delete_method = DA_DELETE_DISABLE;
+                       dadeletemethodset(softc, DA_DELETE_DISABLE);
                while ((bp = bioq_takefirst(&softc->delete_run_queue))
                    != NULL)
                        bioq_disksort(&softc->delete_queue, bp);
@@ -2344,7 +2364,7 @@ dadone(struct cam_periph *periph, union 
                                          rcaplong, sizeof(*rcaplong));
                                if ((lalba & SRC16_LBPME_A)
                                 && softc->delete_method == DA_DELETE_NONE)
-                                       softc->delete_method = DA_DELETE_UNMAP;
+                                       dadeletemethodset(softc, 
DA_DELETE_UNMAP);
                                dp = &softc->params;
                                snprintf(announce_buf, sizeof(announce_buf),
                                        "%juMB (%ju %u byte sectors: %dH %dS/T "
_______________________________________________
svn-src-stable-9@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "svn-src-stable-9-unsubscr...@freebsd.org"

Reply via email to