Date: Fri, 3 Aug 2012 14:20:12 GMT From: "Steven Hartland" <steven.hartland@multiplay.co.uk> To: freebsd-scsi@FreeBSD.org Subject: Re: kern/169801: [cam] [patc] make changes to delete_method in scsi_da consistent Message-ID: <201208031420.q73EKCr5075272@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/169801; it has been noted by GNATS. 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--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201208031420.q73EKCr5075272>