Annotation of sys/dev/bio.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: bio.c,v 1.9 2007/03/20 02:35:55 marco Exp $ */
! 2:
! 3: /*
! 4: * Copyright (c) 2002 Niklas Hallqvist. All rights reserved.
! 5: *
! 6: * Redistribution and use in source and binary forms, with or without
! 7: * modification, are permitted provided that the following conditions
! 8: * are met:
! 9: * 1. Redistributions of source code must retain the above copyright
! 10: * notice, this list of conditions and the following disclaimer.
! 11: * 2. Redistributions in binary form must reproduce the above copyright
! 12: * notice, this list of conditions and the following disclaimer in the
! 13: * documentation and/or other materials provided with the distribution.
! 14: *
! 15: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 16: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 17: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 18: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
! 19: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
! 20: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
! 21: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
! 22: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! 23: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
! 24: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 25: */
! 26:
! 27: /* A device controller ioctl tunnelling device. */
! 28:
! 29: #include <sys/param.h>
! 30: #include <sys/device.h>
! 31: #include <sys/ioctl.h>
! 32: #include <sys/malloc.h>
! 33: #include <sys/queue.h>
! 34: #include <sys/systm.h>
! 35:
! 36: #include <dev/biovar.h>
! 37:
! 38: struct bio_mapping {
! 39: LIST_ENTRY(bio_mapping) bm_link;
! 40: struct device *bm_dev;
! 41: int (*bm_ioctl)(struct device *, u_long, caddr_t);
! 42: };
! 43:
! 44: LIST_HEAD(, bio_mapping) bios = LIST_HEAD_INITIALIZER(bios);
! 45:
! 46: void bioattach(int);
! 47: int bioclose(dev_t, int, int, struct proc *);
! 48: int bioioctl(dev_t, u_long, caddr_t, int, struct proc *);
! 49: int bioopen(dev_t, int, int, struct proc *);
! 50:
! 51: int bio_delegate_ioctl(struct bio_mapping *, u_long, caddr_t);
! 52: struct bio_mapping *bio_lookup(char *);
! 53: int bio_validate(void *);
! 54:
! 55: void
! 56: bioattach(int nunits)
! 57: {
! 58: }
! 59:
! 60: int
! 61: bioopen(dev_t dev, int flags, int mode, struct proc *p)
! 62: {
! 63: return (0);
! 64: }
! 65:
! 66: int
! 67: bioclose(dev_t dev, int flags, int mode, struct proc *p)
! 68: {
! 69: return (0);
! 70: }
! 71:
! 72: int
! 73: bioioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p)
! 74: {
! 75: struct bio_locate *locate;
! 76: struct bio_common *common;
! 77: char name[16];
! 78: int error;
! 79:
! 80: switch (cmd) {
! 81: case BIOCLOCATE:
! 82: locate = (struct bio_locate *)addr;
! 83: error = copyinstr(locate->bl_name, name, 16, NULL);
! 84: if (error != 0)
! 85: return (error);
! 86: locate->bl_cookie = bio_lookup(name);
! 87: if (locate->bl_cookie == NULL)
! 88: return (ENOENT);
! 89: break;
! 90:
! 91: default:
! 92: common = (struct bio_common *)addr;
! 93: if (!bio_validate(common->bc_cookie))
! 94: return (ENOENT);
! 95: return (bio_delegate_ioctl(
! 96: (struct bio_mapping *)common->bc_cookie, cmd, addr));
! 97: }
! 98: return (0);
! 99: }
! 100:
! 101: int
! 102: bio_register(struct device *dev, int (*ioctl)(struct device *, u_long, caddr_t))
! 103: {
! 104: struct bio_mapping *bm;
! 105:
! 106: MALLOC(bm, struct bio_mapping *, sizeof *bm, M_DEVBUF, M_NOWAIT);
! 107: if (bm == NULL)
! 108: return (ENOMEM);
! 109: bm->bm_dev = dev;
! 110: bm->bm_ioctl = ioctl;
! 111: LIST_INSERT_HEAD(&bios, bm, bm_link);
! 112: return (0);
! 113: }
! 114:
! 115: void
! 116: bio_unregister(struct device *dev)
! 117: {
! 118: struct bio_mapping *bm, *next;
! 119:
! 120: for (bm = LIST_FIRST(&bios); bm != NULL; bm = next) {
! 121: next = LIST_NEXT(bm, bm_link);
! 122:
! 123: if (dev == bm->bm_dev) {
! 124: LIST_REMOVE(bm, bm_link);
! 125: free(bm, M_DEVBUF);
! 126: }
! 127: }
! 128: }
! 129:
! 130: struct bio_mapping *
! 131: bio_lookup(char *name)
! 132: {
! 133: struct bio_mapping *bm;
! 134:
! 135: LIST_FOREACH(bm, &bios, bm_link)
! 136: if (strcmp(name, bm->bm_dev->dv_xname) == 0)
! 137: return (bm);
! 138: return (NULL);
! 139: }
! 140:
! 141: int
! 142: bio_validate(void *cookie)
! 143: {
! 144: struct bio_mapping *bm;
! 145:
! 146: LIST_FOREACH(bm, &bios, bm_link)
! 147: if (bm == cookie)
! 148: return (1);
! 149: return (0);
! 150: }
! 151:
! 152: int
! 153: bio_delegate_ioctl(struct bio_mapping *bm, u_long cmd, caddr_t addr)
! 154: {
! 155: return (bm->bm_ioctl(bm->bm_dev, cmd, addr));
! 156: }
CVSweb