From nobody@FreeBSD.org  Thu Jul 12 10:02:10 2012
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52])
	by hub.freebsd.org (Postfix) with ESMTP id 9EA60106564A
	for <freebsd-gnats-submit@FreeBSD.org>; Thu, 12 Jul 2012 10:02:10 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from red.freebsd.org (red.freebsd.org [IPv6:2001:4f8:fff6::22])
	by mx1.freebsd.org (Postfix) with ESMTP id 7FD838FC16
	for <freebsd-gnats-submit@FreeBSD.org>; Thu, 12 Jul 2012 10:02:10 +0000 (UTC)
Received: from red.freebsd.org (localhost [127.0.0.1])
	by red.freebsd.org (8.14.4/8.14.4) with ESMTP id q6CA2978069567
	for <freebsd-gnats-submit@FreeBSD.org>; Thu, 12 Jul 2012 10:02:09 GMT
	(envelope-from nobody@red.freebsd.org)
Received: (from nobody@localhost)
	by red.freebsd.org (8.14.4/8.14.4/Submit) id q6CA2984069566;
	Thu, 12 Jul 2012 10:02:09 GMT
	(envelope-from nobody)
Message-Id: <201207121002.q6CA2984069566@red.freebsd.org>
Date: Thu, 12 Jul 2012 10:02:09 GMT
From: Steven Hartland <steven.hartland@multiplay.co.uk>
To: freebsd-gnats-submit@FreeBSD.org
Subject: Patch to make changes to delete_method in scsi_da consistent
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         169801
>Category:       kern
>Synopsis:       [cam] [patc] make changes to delete_method in scsi_da consistent
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    smh
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Jul 12 10:10:01 UTC 2012
>Closed-Date:    Fri Jun 07 14:59:50 UTC 2013
>Last-Modified:  Fri Jun 07 14:59:50 UTC 2013
>Originator:     Steven Hartland
>Release:        8.3-RELEASE
>Organization:
Multiplay
>Environment:
FreeBSD build 8.3-RELEASE-p3 FreeBSD 8.3-RELEASE-p3 #3: Tue Jul  3 13:16:31 UTC 2012     root@build:/usr/obj/usr/src/sys/MULTIPLAY  amd64
>Description:
Current when delete_method is changed the corresponding DISKFLAG_CANDELETE in d_flags is not always maintained causing the higher layers to get out of date information about the state of delete support on the device.
>How-To-Repeat:
N/A
>Fix:
Apply the attached patch which routes all all changes via a new method dadeletemethodset that ensures these two variables are consistent.

Note this version of the patch is against HEAD not 8.3.

Already spoken to Alexander Motin regards this change to which he said "Have no objections"

Patch attached with submission follows:

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.
--- sys/cam/scsi/scsi_da.c.orig	2012-07-12 08:41:10.697622095 +0000
+++ sys/cam/scsi/scsi_da.c	2012-07-12 09:46:43.309378867 +0000
@@ -841,6 +841,8 @@
 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;
@@ -1419,7 +1421,7 @@
 	 */
 	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,
@@ -1496,14 +1498,33 @@
 }
 
 static int
+dadeletemethodset(struct da_softc *softc, da_delete_methods delete_method)
+{
+	if (0 > delete_method || DA_DELETE_MAX < delete_method)
+		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;
 
-	value = *(int *)arg1;
+	softc = (struct da_softc *)arg1;
+
+	value = softc->delete_method;
 	if (value < 0 || value > DA_DELETE_MAX)
 		p = "UNKNOWN";
 	else
@@ -1515,8 +1536,7 @@
 	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);
 }
@@ -1995,24 +2015,24 @@
 		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);
@@ -2258,7 +2278,7 @@
 					  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 "


>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-bugs->freebsd-scsi 
Responsible-Changed-By: linimon 
Responsible-Changed-When: Mon Jul 16 03:14:07 UTC 2012 
Responsible-Changed-Why:  
Over to maintainer(s). 

http://www.freebsd.org/cgi/query-pr.cgi?pr=169801 

From: "Steven Hartland" <steven.hartland@multiplay.co.uk>
To: <bug-followup@freebsd.org>
Cc:  
Subject: Re: kern/169801: [cam] [patc] make changes to delete_method in scsi_da consistent
Date: Fri, 3 Aug 2012 15:11:52 +0100

 This is a multi-part message in MIME format.
 
 ------=_NextPart_000_0589_01CD718A.4FE9A470
 Content-Type: text/plain;
 	format=flowed;
 	charset="Windows-1252";
 	reply-type=original
 Content-Transfer-Encoding: 7bit
 
 Updated patch correcting var order in dadeletemethodsysctl
 as per feedback from Alexander Motin.
 
 ================================================
 This e.mail is private and confidential between Multiplay (UK) Ltd. and the person or entity to whom it is addressed. In the event of misdirection, the recipient is prohibited from using, copying, printing or otherwise disseminating it or any information contained in it. 
 
 In the event of misdirection, illegible or incomplete transmission please telephone +44 845 868 1337
 or return the E.mail to postmaster@multiplay.co.uk.
 ------=_NextPart_000_0589_01CD718A.4FE9A470
 Content-Type: text/plain;
 	format=flowed;
 	name="scsi_da_deleteset.txt";
 	reply-type=original
 Content-Transfer-Encoding: quoted-printable
 Content-Disposition: attachment;
 	filename="scsi_da_deleteset.txt"
 
 Updates delete_method sysctl changes to always maintain disk d_flags=0A=
 DISKFLAG_CANDELETE. While this change makes this layer consistent=0A=
 other layers such as UFS and ZFS BIO_DELETE support may not notice=0A=
 any change made manually via these device sysctls until the device=0A=
 is reopened via a mount.=0A=
 =0A=
 Also corrected var order in dadeletemethodsysctl=0A=
 --- sys/cam/scsi/scsi_da.c.orig	2012-08-03 08:48:12.519680130 +0000=0A=
 +++ sys/cam/scsi/scsi_da.c	2012-08-03 09:02:21.994117013 +0000=0A=
 @@ -897,6 +897,8 @@=0A=
  static	void		dasysctlinit(void *context, int pending);=0A=
  static	int		dacmdsizesysctl(SYSCTL_HANDLER_ARGS);=0A=
  static	int		dadeletemethodsysctl(SYSCTL_HANDLER_ARGS);=0A=
 +static	int		dadeletemethodset(struct da_softc *softc,=0A=
 +					  da_delete_methods delete_method);=0A=
  static	periph_ctor_t	daregister;=0A=
  static	periph_dtor_t	dacleanup;=0A=
  static	periph_start_t	dastart;=0A=
 @@ -1462,7 +1464,7 @@=0A=
  	 */=0A=
  	SYSCTL_ADD_PROC(&softc->sysctl_ctx,SYSCTL_CHILDREN(softc->sysctl_tree),=0A=
  		OID_AUTO, "delete_method", CTLTYPE_STRING | CTLFLAG_RW,=0A=
 -		&softc->delete_method, 0, dadeletemethodsysctl, "A",=0A=
 +		softc, 0, dadeletemethodsysctl, "A",=0A=
  		"BIO_DELETE execution method");=0A=
  	SYSCTL_ADD_PROC(&softc->sysctl_ctx, =
 SYSCTL_CHILDREN(softc->sysctl_tree),=0A=
  		OID_AUTO, "minimum_cmd_size", CTLTYPE_INT | CTLFLAG_RW,=0A=
 @@ -1505,14 +1507,32 @@=0A=
  }=0A=
  =0A=
  static int=0A=
 +dadeletemethodset(struct da_softc *softc, da_delete_methods =
 delete_method)=0A=
 +{=0A=
 +	if (0 > delete_method || DA_DELETE_MAX < delete_method)=0A=
 +		return (EINVAL);=0A=
 +=0A=
 +	softc->delete_method =3D delete_method;=0A=
 +=0A=
 +	if (softc->delete_method > DA_DELETE_DISABLE)=0A=
 +		softc->disk->d_flags |=3D DISKFLAG_CANDELETE;=0A=
 +	else=0A=
 +		softc->disk->d_flags &=3D ~DISKFLAG_CANDELETE;=0A=
 +=0A=
 +	return (0);=0A=
 +}=0A=
 +=0A=
 +static int=0A=
  dadeletemethodsysctl(SYSCTL_HANDLER_ARGS)=0A=
  {=0A=
  	char buf[16];=0A=
 -	int error;=0A=
  	const char *p;=0A=
 -	int i, value;=0A=
 +	struct da_softc *softc;=0A=
 +	int i, error, value;=0A=
  =0A=
 -	value =3D *(int *)arg1;=0A=
 +	softc =3D (struct da_softc *)arg1;=0A=
 +=0A=
 +	value =3D softc->delete_method;=0A=
  	if (value < 0 || value > DA_DELETE_MAX)=0A=
  		p =3D "UNKNOWN";=0A=
  	else=0A=
 @@ -1524,8 +1544,7 @@=0A=
  	for (i =3D 0; i <=3D DA_DELETE_MAX; i++) {=0A=
  		if (strcmp(buf, da_delete_method_names[i]) !=3D 0)=0A=
  			continue;=0A=
 -		*(int *)arg1 =3D i;=0A=
 -		return (0);=0A=
 +		return dadeletemethodset(softc, i);=0A=
  	}=0A=
  	return (EINVAL);=0A=
  }=0A=
 @@ -1968,24 +1987,24 @@=0A=
  		if (softc->delete_method =3D=3D DA_DELETE_UNMAP) {=0A=
  			xpt_print(ccb->ccb_h.path, "UNMAP is not supported, "=0A=
  			    "switching to WRITE SAME(16) with UNMAP.\n");=0A=
 -			softc->delete_method =3D DA_DELETE_WS16;=0A=
 +			dadeletemethodset(softc, DA_DELETE_WS16);=0A=
  		} else if (softc->delete_method =3D=3D DA_DELETE_WS16) {=0A=
  			xpt_print(ccb->ccb_h.path,=0A=
  			    "WRITE SAME(16) with UNMAP is not supported, "=0A=
  			    "disabling BIO_DELETE.\n");=0A=
 -			softc->delete_method =3D DA_DELETE_DISABLE;=0A=
 +			dadeletemethodset(softc, DA_DELETE_DISABLE);=0A=
  		} else if (softc->delete_method =3D=3D DA_DELETE_WS10) {=0A=
  			xpt_print(ccb->ccb_h.path,=0A=
  			    "WRITE SAME(10) with UNMAP is not supported, "=0A=
  			    "disabling BIO_DELETE.\n");=0A=
 -			softc->delete_method =3D DA_DELETE_DISABLE;=0A=
 +			dadeletemethodset(softc, DA_DELETE_DISABLE);=0A=
  		} else if (softc->delete_method =3D=3D DA_DELETE_ZERO) {=0A=
  			xpt_print(ccb->ccb_h.path,=0A=
  			    "WRITE SAME(10) is not supported, "=0A=
  			    "disabling BIO_DELETE.\n");=0A=
 -			softc->delete_method =3D DA_DELETE_DISABLE;=0A=
 +			dadeletemethodset(softc, DA_DELETE_DISABLE);=0A=
  		} else=0A=
 -			softc->delete_method =3D DA_DELETE_DISABLE;=0A=
 +			dadeletemethodset(softc, DA_DELETE_DISABLE);=0A=
  		while ((bp =3D bioq_takefirst(&softc->delete_run_queue))=0A=
  		    !=3D NULL)=0A=
  			bioq_disksort(&softc->delete_queue, bp);=0A=
 @@ -2213,7 +2232,7 @@=0A=
  				    lbppbe, lalba & SRC16_LALBA);=0A=
  				if ((lalba & SRC16_LBPME) &&=0A=
  				    softc->delete_method =3D=3D DA_DELETE_NONE)=0A=
 -					softc->delete_method =3D DA_DELETE_UNMAP;=0A=
 +					dadeletemethodset(softc, DA_DELETE_UNMAP);=0A=
  				dp =3D &softc->params;=0A=
  				snprintf(announce_buf, sizeof(announce_buf),=0A=
  				        "%juMB (%ju %u byte sectors: %dH %dS/T "=0A=
 @@ -2626,7 +2645,7 @@=0A=
  			    lbppbe, lalba & SRC16_LALBA);=0A=
  			if ((lalba & SRC16_LBPME) &&=0A=
  			    softc->delete_method =3D=3D DA_DELETE_NONE)=0A=
 -				softc->delete_method =3D DA_DELETE_UNMAP;=0A=
 +				dadeletemethodset(softc, DA_DELETE_UNMAP);=0A=
  		}=0A=
  	}=0A=
  =0A=
 
 ------=_NextPart_000_0589_01CD718A.4FE9A470--
 
Responsible-Changed-From-To: freebsd-scsi->smh 
Responsible-Changed-By: smh 
Responsible-Changed-When: Thu Dec 13 22:21:18 UTC 2012 
Responsible-Changed-Why:  
I'll take it. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=169801 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/169801: commit references a PR
Date: Thu, 10 Jan 2013 11:57:59 +0000 (UTC)

 Author: smh
 Date: Thu Jan 10 11:57:46 2013
 New Revision: 245252
 URL: http://svnweb.freebsd.org/changeset/base/245252
 
 Log:
   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
   Reviewed by:	pjd (mentor)
   Approved by:	mav
   MFC after:	2 weeks
 
 Modified:
   head/sys/cam/scsi/scsi_da.c
 
 Modified: head/sys/cam/scsi/scsi_da.c
 ==============================================================================
 --- head/sys/cam/scsi/scsi_da.c	Thu Jan 10 11:28:12 2013	(r245251)
 +++ head/sys/cam/scsi/scsi_da.c	Thu Jan 10 11:57:46 2013	(r245252)
 @@ -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);
  }
 @@ -2082,24 +2102,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);
 @@ -2345,7 +2365,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-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
State-Changed-From-To: open->patched 
State-Changed-By: smh 
State-Changed-When: Thu Jan 10 14:41:01 UTC 2013 
State-Changed-Why:  
Awaiting MFC 

http://www.freebsd.org/cgi/query-pr.cgi?pr=169801 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/169801: commit references a PR
Date: Fri,  5 Apr 2013 11:48:53 +0000 (UTC)

 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-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
State-Changed-From-To: patched->closed 
State-Changed-By: smh 
State-Changed-When: Fri Jun 7 14:59:49 UTC 2013 
State-Changed-Why:  
Committed. Thanks! 

http://www.freebsd.org/cgi/query-pr.cgi?pr=169801 
>Unformatted:
