Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 5 Aug 2011 10:59:57 +0300
From:      Kostik Belousov <kostikbel@gmail.com>
To:        Steven Hartland <killing@multiplay.co.uk>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: cam / ata timeout limited to 2147 due to overflow bug?
Message-ID:  <20110805075957.GP17489@deviant.kiev.zoral.com.ua>
In-Reply-To: <4CAD348034DD463E80C89DD5A0BDD71B@multiplay.co.uk>
References:  <4CAD348034DD463E80C89DD5A0BDD71B@multiplay.co.uk>

next in thread | previous in thread | raw e-mail | index | archive | help

--MRe2Ouhm04S76NDZ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Fri, Aug 05, 2011 at 12:02:19AM +0100, Steven Hartland wrote:
> I'm working on adding security methods to camcontrol and have
> come up against a strange issue. It seems that the timeout
> value for cam, at least on ata (ahci), is limited to less than
> 2148 seconds.
>=20
> This can be seen by running:-
> camcontrol identify ada0 -t 2148 -v
> (pass0:ahcich0:0:0:0): ATA_IDENTIFY. ACB: ec 00 00 00 00 40 00 00 00 00 0=
0=20
> 00
> (pass0:ahcich0:0:0:0): CAM status: Command timeout
>=20
> Also seen in /var/log/messages at this time is:-
> Aug  4 23:29:51 cfdev kernel: ahcich0: Timeout on slot 24
> Aug  4 23:29:51 cfdev kernel: ahcich0: is 00000000 cs 01000000 ss 0000000=
0=20
> rs 01000000 tfd d0 serr 00000000
>=20
> Dropping the timeout down to 2147 and the command runs fine.
>=20
> I've done some digging and it seems like this is implemented via:-
> sys/dev/ahci/ahci.c
> ahci_execute_transaction(struct ahci_slot *slot)
> {
> ...
>    /* Start command execution timeout */
>    callout_reset(&slot->timeout, (int)ccb->ccb_h.timeout * hz / 2000,
>        (timeout_t*)ahci_timeout, slot);
>=20
> Now its documented that:-
> "Non-positive values of ticks are silently converted to the value 1"
>=20
> So I suspect that this is what's happening resulting in an extremely
> small timeout instead of a large one. Now I know that passed in value
> to the timeout is seconds * 1000 so we should be seeing 2148000
> for ccb->ccb_h.timeout now multiply that by 1000 (hz) and your over
> the int wrap point 2147483647.
>=20
> So instead of the wrap point being 2147483 seconds (24 days), I suspect
> because of the way this is structured its actually 2147 seconds (26mins).
>=20
> If this is the case the fix is likely to be something like:-
> callout_reset(&slot->timeout, (int)(ccb->ccb_h.timeout * (hz / 2000)),
For hz =3D=3D 1000, hz / 2000 =3D=3D 0 according to the C rules, so the
result will be 0 always.

>=20
> Does this sound reasonable? What I don't understand is why the /2000?
>=20
> For reference the reason for wanting a large timeout is that a
> secure erase of large media could take many hours so I'm using
> the erase time reported by the drive for this, in my case here is
> 400 minutes.
>=20
> Currently this instantly fails with a Command timeout which is
> clearly not right.
>=20
>    Regards
>    Steve
>=20
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> This e.mail is private and confidential between Multiplay (UK) Ltd. and t=
he=20
> person or entity to whom it is addressed. In the event of misdirection, t=
he=20
> recipient is prohibited from using, copying, printing or otherwise=20
> disseminating it or any information contained in it.=20
> In the event of misdirection, illegible or incomplete transmission please=
=20
> telephone +44 845 868 1337
> or return the E.mail to postmaster@multiplay.co.uk.
>=20
> _______________________________________________
> freebsd-hackers@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"

--MRe2Ouhm04S76NDZ
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (FreeBSD)

iEYEARECAAYFAk47ovwACgkQC3+MBN1Mb4iaPQCfbbcO3Vu0DEBP7h7umwZoYXW7
ttIAoKgMITHEs0YyuHfeMaYQ08cTc4qX
=0hCw
-----END PGP SIGNATURE-----

--MRe2Ouhm04S76NDZ--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20110805075957.GP17489>