cvs commit: src/sys/sys conf.h src/sys/fs/specfs spec_vnops.c
Nate Lawson
nate at root.org
Wed Oct 15 13:36:57 PDT 2003
On Wed, 15 Oct 2003, Poul-Henning Kamp wrote:
> Modified files:
> sys/sys conf.h
> sys/fs/specfs spec_vnops.c
> Log:
> Introduce a new optional memberfunction for cdevsw, fdopen() which
> passes the fdidx from VOP_OPEN down.
>
> This is for all I know the final API for this functionality, but
> the locking semantics for messing with the filedescriptor from
> the device driver are not settled at this time.
>
> Revision Changes Path
> 1.211 +7 -2 src/sys/fs/specfs/spec_vnops.c
> 1.178 +2 -0 src/sys/sys/conf.h
>
>
> Index: src/sys/fs/specfs/spec_vnops.c
> diff -u src/sys/fs/specfs/spec_vnops.c:1.210 src/sys/fs/specfs/spec_vnops.c:1.211
> --- src/sys/fs/specfs/spec_vnops.c:1.210 Sat Oct 4 02:20:00 2003
> +++ src/sys/fs/specfs/spec_vnops.c Wed Oct 15 13:00:59 2003
> @@ -196,9 +196,14 @@
> VOP_UNLOCK(vp, 0, td);
> if(dsw->d_flags & D_NOGIANT) {
> DROP_GIANT();
> - error = dsw->d_open(dev, ap->a_mode, S_IFCHR, td);
> + if (dsw->d_fdopen != NULL)
> + error = dsw->d_fdopen(dev, ap->a_mode, td, ap->a_fdidx);
> + else
> + error = dsw->d_open(dev, ap->a_mode, S_IFCHR, td);
> PICKUP_GIANT();
> - } else
> + } else if (dsw->d_fdopen != NULL)
> + error = dsw->d_fdopen(dev, ap->a_mode, td, ap->a_fdidx);
> + else
> error = dsw->d_open(dev, ap->a_mode, S_IFCHR, td);
> vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
I assume this is to avoid a trip through a vnode when doing IO to a
device? Can you point me at the analysis of this approach? I've heard
you talking about it before but don't have a reference.
> Index: src/sys/sys/conf.h
> diff -u src/sys/sys/conf.h:1.177 src/sys/sys/conf.h:1.178
> --- src/sys/sys/conf.h:1.177 Sun Sep 28 13:50:36 2003
> +++ src/sys/sys/conf.h Wed Oct 15 13:00:58 2003
> @@ -145,6 +145,7 @@
> typedef struct thread d_thread_t;
>
> typedef int d_open_t(dev_t dev, int oflags, int devtype, struct thread *td);
> +typedef int d_fdopen_t(dev_t dev, int oflags, struct thread *td, int fdidx);
> typedef int d_close_t(dev_t dev, int fflag, int devtype, struct thread *td);
> typedef void d_strategy_t(struct bio *bp);
> typedef int d_ioctl_t(dev_t dev, u_long cmd, caddr_t data,
> @@ -223,6 +224,7 @@
> u_int d_flags;
> const char *d_name;
> d_open_t *d_open;
> + d_fdopen_t *d_fdopen;
> d_close_t *d_close;
> d_read_t *d_read;
> d_write_t *d_write;
Sure we have C99 now but for binary compatibility with third party
drivers, shouldn't this be added at the end of the structure? Especially
since this is an optional function.
-Nate
More information about the cvs-src
mailing list