[OpenAFS-devel] afsd & libafs module version checking??
Jeffrey Hutzelman
jhutz@cmu.edu
Wed, 14 Dec 2005 12:31:00 -0500
On Wednesday, December 14, 2005 09:04:57 AM -0500 Tom Keiser
<tkeiser@gmail.com> wrote:
> Basing this on cml_version_number has a few disadvantages:
>
> (1)compile date becomes part of the decision
> (2)autoconf flags cannot change syscall and ioctl interface behavior
> (3)it's overly brittle; the kernel interfaces shouldn't be assumed to
> change between every minor revision
> (4)because of the packaging issues Russ brought up, we would end up
> sending spurious warnings to users (who would probably send in
> unnecessary bug reports)
Indeed, this is not what the CML version number is for, and overloading it
for that purpose is a bad idea. I've had too many bad experiences with
software that breaks because it insists on exact matching of software
version numbers instead of using interface versions.
> Instead, I'd propose we define a monotonically increasing kernel
> interface version counter that gets incremented by the developer
> whenever backwards-incompatible changes are made to a syscall or ioctl
> interface. Even this seems a bit harsh since a change to an
> afsd-specific syscall would cause the fs command to issue warnings.
> Should there instead be a few version counters that codify stability
> of different subsets of the kernel interfaces in a way that is
> meaningful to our userspace apps (e.g. common interfaces,
> afsd-specific interfaces, inode interfaces, pioctl interfaces, etc.)?
I think there is a distinction to be made here. The afsd-libafs interface
is an internal interface, and while we'd like it to be backward compatible,
the components are tightly bound and it is reasonable to expect that if you
upgrade one you might have to upgrade the other. Introducing an interface
version for this interface (particularly, AFSCALL_CALL) is probably a good
idea.
However, the pioctl interface is a _public_ interface. It's expected to
interoperate not only with other versions of OpenAFS, but also with other
implementations, including arla and a number of utilities that make their
own system calls. The operation codes are coordinated, and the parameters
and behavior for each operation are reasonably well-defined. I can think
of only one occasion in which a change was made to one of these interfaces,
and that was over 10 years ago, when the code was maintained by a different
entity which did not consider these to be public interfaces (and even then,
it was an ill-considered change). I don't think it will be repeated any
time soon.
In short, I think it's entirely reasonable to introduce an afsd-libafs
interface version, and a mechanism for querying it. But I don't think we
need such a version for the public interfaces, and I suspect it would be
counterproductive to introduce one.
> Personally, i'd rather see it added as a syscall since you're not
> dealing with a path. Regardless, the version query interface should
> be defined carefully, and declared immutable.
A query-version for the afsd-libafs interface is part of that interface,
and so should be provided as an operation of AFSCALL_CALL, like the rest of
that interface.
If we really wanted to provide a query-version operation for the public
pioctl interface, that should be done as a pioctl, preferably with an
opcode in the coordinated 'C' space, rather than in the openafs-private 'O'
space (note that we decided some time ago not to add new ioctl or pioctl
opcodes in the 'V' space, to avoid potential conflicts with codes assigned
by IBM without coordination).
While I agree that it would be desirable to separate cache manager
configuration, status, and control operations from true path-based
operations, at the moment they are part of the same interface, and as I
noted above, that is a public, coordinated interface, which we can
reasonably expect other implementors to support. And, because it is quite
regular, it is possible to provide a pioctl() syscall stub which does not
know the details of every possible pioctl; in fact, both OpenAFS and
libkafs include such a stub. Adding a new syscall for querying an
interface version would unnecessarily place an undue burden on users of
such libraries, as they would be unable to perform a version query without
a new enough library.
-- Jeff