Subject: Re: fcntl changes once again.
To: Bill Studenmund <wrstuden@nas.nasa.gov>
From: Charles M. Hannum <root@ihack.net>
List: tech-kern
Date: 07/13/1999 18:14:22
> > Which is exactly *correct*. Having a single flag that may do
> > completely different things depending on the file system is completely
> > wrong.
>
> The thought was it's a flag with which you need to know what you're doing.
That's great. So why even bother naming it? After all; it's just a
magic flag. That train of logic leads only downward.
> > No. It's already done for other things (such as sockets), and the
> > interface is specifically designed to support it.
>
> ioctl's on sockets are handled differently because ioctl's go through the
> fo_ioctl vector. They aren't special-cased.
Oh, really?
/*
* Interface/routing/protocol specific ioctls:
* interface and routing ioctls should have a
* different entry since a socket's unnecessary
*/
if (IOCGROUP(cmd) == 'i')
return (ifioctl(so, cmd, data, p));
if (IOCGROUP(cmd) == 'r')
return (rtioctl(cmd, data, p));
return ((*so->so_proto->pr_usrreq)(so, PRU_CONTROL,
(struct mbuf *)cmd, (struct mbuf *)data, (struct mbuf *)0, p));
Looks to me like that code path does exactly what I'm talking about.
Indeed, one might even infer that was the entire reason for having the
ioctl(2) `groups' to begin with. (Or one could just RTFB.)
> Flagrant bastardization? fcntl is defined (in syscallargs.h) as taking two
> ints and a void *. How is letting some of them hit the fs a
> bastardization? They are a part of the command space which isn't used, and
> we still leave traditional fcntl's more than enough space to grow (i.e.
> 2^31 commands).
That's at best hand-waving. You're not merely `letting some of them
hit the fs'; you're specifically changing the fcntl(2) API to emulate
ioctl(2). If you want ioctl(2), then use ioctl(2).
> The thing I really prefer about fcntls over ioctls is what doing this with
> ioctl's will do to the vnode interface.
That's ridiculous. You're adding a new vnode op already; calling it
by a different name makes no difference.