Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 14 Oct 2016 11:34:45 -0700
From:      John Baldwin <jhb@freebsd.org>
To:        Andriy Gapon <avg@freebsd.org>
Cc:        Lewis Donzis <lew@perftech.com>, freebsd-current@freebsd.org, "freebsd-arch@freebsd.org" <freebsd-arch@freebsd.org>
Subject:   Re: SM bus ioctls incorrect in FreeBSD 11
Message-ID:  <13130323.4rNJusEcix@ralph.baldwin.cx>
In-Reply-To: <fe780e23-f014-1c84-b702-12727cd68ef0@FreeBSD.org>
References:  <06929AC5-D350-4236-A813-56C862B58174@perftech.com> <fe780e23-f014-1c84-b702-12727cd68ef0@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Friday, October 14, 2016 05:50:40 PM Andriy Gapon wrote:
> On 14/10/2016 00:39, Lewis Donzis wrote:
> > After upgrading to FreeBSD 11.0 and changing source code to use the=
 new
> > version of =E2=80=9Cstruct smbcmd=E2=80=9D, some commands are not w=
orking as documented,
> > specifically those that read data.
> >=20
> > As an example, SMB_READW is documented as returning the word read f=
rom the
> > device in rdata.word.  However, this doesn=E2=80=99t happen, I thin=
k because the
> > ioctl request value is defined using _IOW(), so the kernel doesn=E2=
=80=99t copy the
> > data it read back out.
> >=20
> > In prior versions, the structure had only a pointer to the data, an=
d the
> > smb.c code used copyout() to transfer the data back to userland.
> >=20
> > As a temporary work-around, we added code to set rbuf to point to r=
data.word
> > and rcount to two.
>=20
> Lewis,
>=20
> thank you for the report.  This is a bug indeed and your analysis is =
correct.
> Could you please open a bugzilla issue for the bug?
> https://bugs.freebsd.org/bugzilla/
>=20
> Looking at ports commit 385155
> https://svnweb.freebsd.org/ports/head/sysutils/xmbmon/files/patch-get=
MB-smb_ioctl.c?r1=3D385155&r2=3D385154&pathrev=3D385155
> I see that it also used the approach that you use as a workaround.
> And that port commit is by Michael Gmelin who made the change to smb.=
h in
> r281985 https://svnweb.freebsd.org/base?view=3Drevision&revision=3D28=
1985
> So, I am not sure if the documented approach was known to not work.
>=20
> The src change is described as "Expand SMBUS API ...", but in fact it=
 also
> _changed_ the existing ioctls.  And both binary compatibility and pro=
gramming
> compatibility were broken because of how struct smbcmd was changed.
> In FreeBSD we try to not do that without a very strong reason, but al=
as.
> And, as you report, the change was not done entirely correctly.
>=20
> I see several possibilities now.
>=20
> Option 1.  Change the documentation to reflect the actual behavior.
> In this case data.rdata will remain unusable and unused.  No interfac=
e changes.
>=20
> Option 2. Redefine SMB_READB, SMB_READW and SMB_PCALL ioctls using _I=
OWR, so
> that data.rdata could be returned from kernel.  This seems like a pro=
per fix,
> but it is another binary level incompatibility.
>=20
> Option 3.  Use a horrible hack to discover a userland address of smbc=
md and
> explicitly copyout to data.rdata.  No interface incompatibilities, bu=
t it will
> be a horrible hack.  Besides, not sure how feasible it is.
>=20
> Option 4.  Revert smb ioctl changes to what they used to be before r2=
81985.
> Personally, I would prefer this approach.  But now that the new inter=
face is in
> 11.0, it means another interface change just like Option 2.
>=20
> I would like to hear other developers' opinions about this situation.=

>=20
> P.S.
> Two changes that I want to do no matter which course of action we sel=
ect are:
> - revert SMB_MAXBLOCKSIZE to 32
> - remove SMB_TRANS as it does not map to anything defined by the SMBu=
s
>   specification and it can not be implemented for most, if not all,
>   SMBus controllers

During the review the assumption was that breaking the ABI wasn't great=
, but that
we could always fix it by adding compat handlers for the old ioctl valu=
es.  If
those are needed then they need to be restored.  If the new API is usef=
ul then it
needs to be fixed which I think is option 2.  I think it is new enough =
to just
fix without support compat shims for the broken version of it.

Unfortunately I don't know SMBus well enough to comment on your latter =
changes,
so I will defer to your call on those.

--=20
John Baldwin



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