1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-25 11:37:56 +00:00

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.
This commit is contained in:
Poul-Henning Kamp 2003-10-15 20:00:59 +00:00
parent 79adbf76d0
commit 0023f61848
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=121121
3 changed files with 11 additions and 2 deletions

View File

@ -196,9 +196,14 @@ spec_open(ap)
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);

View File

@ -145,6 +145,7 @@ struct knote;
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 @@ struct cdevsw {
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;

View File

@ -145,6 +145,7 @@ struct knote;
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 @@ struct cdevsw {
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;