Introduce no_poll() default method for device drivers. Have it

do exactly the same as vop_nopoll() for consistency and put a
comment in the two pointing at each other.

Retire seltrue() in favour of no_poll().

Create private default functions in kern_conf.c instead of public
ones.

Change default strategy to return the bio with ENODEV instead of
doing nothing which would lead the bio stranded.

Retire public nullopen() and nullclose() as well as the entire band
of public no{read,write,ioctl,mmap,kqfilter,strategy,poll,dump}
funtions, they are the default actions now.

Move the final two trivial functions from subr_xxx.c to kern_conf.c
and retire the now empty subr_xxx.c
This commit is contained in:
Poul-Henning Kamp 2003-09-27 12:53:33 +00:00
parent 41cbb0b237
commit b294143142
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=120514
8 changed files with 76 additions and 236 deletions

View File

@ -1147,7 +1147,6 @@ kern/subr_smp.c optional smp
kern/subr_taskqueue.c standard
kern/subr_trap.c standard
kern/subr_witness.c optional witness
kern/subr_xxx.c standard
kern/sys_generic.c standard
kern/sys_pipe.c standard
kern/sys_process.c standard

View File

@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$");
#include <sys/conf.h>
#include <sys/vnode.h>
#include <sys/queue.h>
#include <sys/poll.h>
#include <sys/ctype.h>
#include <machine/stdarg.h>
@ -68,7 +69,19 @@ static int ready_for_devs;
static int free_devt;
SYSCTL_INT(_debug, OID_AUTO, free_devt, CTLFLAG_RW, &free_devt, 0, "");
/* Define a dead_cdevsw for use when devices leave unexpectedly. */
int
nullop(void)
{
return (0);
}
int
eopnotsupp(void)
{
return (EOPNOTSUPP);
}
static int
enxio(void)
@ -76,13 +89,21 @@ enxio(void)
return (ENXIO);
}
static int
enodev(void)
{
return (ENODEV);
}
/* Define a dead_cdevsw for use when devices leave unexpectedly. */
#define dead_open (d_open_t *)enxio
#define dead_close (d_close_t *)enxio
#define dead_read (d_read_t *)enxio
#define dead_write (d_write_t *)enxio
#define dead_ioctl (d_ioctl_t *)enxio
#define dead_poll nopoll
#define dead_mmap nommap
#define dead_poll (d_poll_t *)enodev
#define dead_mmap (d_mmap_t *)enodev
static void
dead_strategy(struct bio *bp)
@ -92,7 +113,6 @@ dead_strategy(struct bio *bp)
}
#define dead_dump (dumper_t *)enxio
#define dead_kqfilter (d_kqfilter_t *)enxio
static struct cdevsw dead_cdevsw = {
@ -110,6 +130,47 @@ static struct cdevsw dead_cdevsw = {
.d_kqfilter = dead_kqfilter
};
/* Default methods if driver does not specify method */
#define null_open (d_open_t *)nullop
#define null_close (d_close_t *)nullop
#define no_read (d_read_t *)enodev
#define no_write (d_write_t *)enodev
#define no_ioctl (d_ioctl_t *)enodev
#define no_mmap (d_mmap_t *)enodev
static int
no_kqfilter(dev_t dev __unused, struct knote *kn __unused)
{
return (1);
}
static void
no_strategy(struct bio *bp)
{
biofinish(bp, NULL, ENODEV);
}
static int
no_poll(dev_t dev __unused, int events, struct thread *td __unused)
{
/*
* Return true for read/write. If the user asked for something
* special, return POLLNVAL, so that clients have a way of
* determining reliably whether or not the extended
* functionality is present without hard-coding knowledge
* of specific filesystem implementations.
* Stay in sync with vop_nopoll().
*/
if (events & ~POLLSTANDARD)
return (POLLNVAL);
return (events & (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM));
}
#define no_dump (dumper_t *)enodev
struct cdevsw *
devsw(dev_t dev)
@ -276,16 +337,16 @@ make_dev(struct cdevsw *devsw, int minor, uid_t uid, gid_t gid, int perms, const
KASSERT((minor & ~0xffff00ff) == 0,
("Invalid minor (0x%x) in make_dev", minor));
if (devsw->d_open == NULL) devsw->d_open = nullopen;
if (devsw->d_close == NULL) devsw->d_close = nullclose;
if (devsw->d_read == NULL) devsw->d_read = noread;
if (devsw->d_write == NULL) devsw->d_write = nowrite;
if (devsw->d_ioctl == NULL) devsw->d_ioctl = noioctl;
if (devsw->d_poll == NULL) devsw->d_poll = nopoll;
if (devsw->d_mmap == NULL) devsw->d_mmap = nommap;
if (devsw->d_strategy == NULL) devsw->d_strategy = nostrategy;
if (devsw->d_dump == NULL) devsw->d_dump = nodump;
if (devsw->d_kqfilter == NULL) devsw->d_kqfilter = nokqfilter;
if (devsw->d_open == NULL) devsw->d_open = null_open;
if (devsw->d_close == NULL) devsw->d_close = null_close;
if (devsw->d_read == NULL) devsw->d_read = no_read;
if (devsw->d_write == NULL) devsw->d_write = no_write;
if (devsw->d_ioctl == NULL) devsw->d_ioctl = no_ioctl;
if (devsw->d_poll == NULL) devsw->d_poll = no_poll;
if (devsw->d_mmap == NULL) devsw->d_mmap = no_mmap;
if (devsw->d_strategy == NULL) devsw->d_strategy = no_strategy;
if (devsw->d_dump == NULL) devsw->d_dump = no_dump;
if (devsw->d_kqfilter == NULL) devsw->d_kqfilter = no_kqfilter;
if (devsw->d_maj == MAJOR_AUTO) {
for (i = NUMCDEVSW - 1; i > 0; i--)

View File

@ -1,185 +0,0 @@
/*
* Copyright (c) 1982, 1986, 1991, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)subr_xxx.c 8.1 (Berkeley) 6/10/93
*/
/*
* Miscellaneous trivial functions.
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
/*
* Return error for operation not supported
* on a specific object or file type.
*/
int
eopnotsupp()
{
return (EOPNOTSUPP);
}
/*
* Generic null operation, always returns success.
*/
int
nullop()
{
return (0);
}
#include <sys/conf.h>
/*
* Unsupported devswitch functions (e.g. for writing to read-only device).
* XXX may belong elsewhere.
*/
int
noopen(dev, flags, fmt, td)
dev_t dev;
int flags;
int fmt;
struct thread *td;
{
return (ENODEV);
}
int
noclose(dev, flags, fmt, td)
dev_t dev;
int flags;
int fmt;
struct thread *td;
{
return (ENODEV);
}
int
noread(dev, uio, ioflag)
dev_t dev;
struct uio *uio;
int ioflag;
{
return (ENODEV);
}
int
nowrite(dev, uio, ioflag)
dev_t dev;
struct uio *uio;
int ioflag;
{
return (ENODEV);
}
int
noioctl(dev, cmd, data, flags, td)
dev_t dev;
u_long cmd;
caddr_t data;
int flags;
struct thread *td;
{
return (ENODEV);
}
int
nokqfilter(dev, kn)
dev_t dev;
struct knote *kn;
{
return (1);
}
int
nommap(dev, offset, paddr, nprot)
dev_t dev;
vm_offset_t offset;
vm_paddr_t *paddr;
int nprot;
{
return (ENODEV);
}
int
nodump(void *arg, void *virtual __unused, vm_offset_t physical __unused, off_t offset __unused, size_t length __unused)
{
return (ENODEV);
}
/*
* Null devswitch functions (for when the operation always succeeds).
* XXX may belong elsewhere.
* XXX not all are here (e.g., seltrue() isn't).
*/
/*
* XXX this is probably bogus. Any device that uses it isn't checking the
* minor number.
*/
int
nullopen(dev, flags, fmt, td)
dev_t dev;
int flags;
int fmt;
struct thread *td;
{
return (0);
}
int
nullclose(dev, flags, fmt, td)
dev_t dev;
int flags;
int fmt;
struct thread *td;
{
return (0);
}

View File

@ -1132,17 +1132,6 @@ clear_selinfo_list(td)
TAILQ_INIT(&td->td_selq);
}
/*ARGSUSED*/
int
seltrue(dev, events, td)
dev_t dev;
int events;
struct thread *td;
{
return (events & (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM));
}
/*
* Record a select request.
*/

View File

@ -343,6 +343,7 @@ vop_nopoll(ap)
* determining reliably whether or not the extended
* functionality is present without hard-coding knowledge
* of specific filesystem implementations.
* Stay in sync with kern_conf.c::no_poll().
*/
if (ap->a_events & ~POLLSTANDARD)
return (POLLNVAL);

View File

@ -258,23 +258,11 @@ void ldisc_deregister(int);
#endif /* _KERNEL */
#ifdef _KERNEL
d_read_t noread;
d_write_t nowrite;
d_ioctl_t noioctl;
d_mmap_t nommap;
d_kqfilter_t nokqfilter;
#define nostrategy ((d_strategy_t *)NULL)
#define nopoll seltrue
dumper_t nodump;
#define NUMCDEVSW 256
#define MAJOR_AUTO 0 /* XXX: Not GM */
d_open_t nullopen;
d_close_t nullclose;
l_ioctl_t l_nullioctl;
l_read_t l_noread;
l_write_t l_nowrite;

View File

@ -258,23 +258,11 @@ void ldisc_deregister(int);
#endif /* _KERNEL */
#ifdef _KERNEL
d_read_t noread;
d_write_t nowrite;
d_ioctl_t noioctl;
d_mmap_t nommap;
d_kqfilter_t nokqfilter;
#define nostrategy ((d_strategy_t *)NULL)
#define nopoll seltrue
dumper_t nodump;
#define NUMCDEVSW 256
#define MAJOR_AUTO 0 /* XXX: Not GM */
d_open_t nullopen;
d_close_t nullclose;
l_ioctl_t l_nullioctl;
l_read_t l_noread;
l_write_t l_nowrite;

View File

@ -126,7 +126,6 @@ void Debugger(const char *msg) __nonnull(1);
int dumpstatus(vm_offset_t addr, off_t count);
int nullop(void);
int eopnotsupp(void);
int seltrue(dev_t dev, int which, struct thread *td);
int ureadc(int, struct uio *);
void hashdestroy(void *, struct malloc_type *, u_long);
void *hashinit(int count, struct malloc_type *type, u_long *hashmask);