The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/geom/geom.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 2002 Poul-Henning Kamp
    3  * Copyright (c) 2002 Networks Associates Technology, Inc.
    4  * All rights reserved.
    5  *
    6  * This software was developed for the FreeBSD Project by Poul-Henning Kamp
    7  * and NAI Labs, the Security Research Division of Network Associates, Inc.
    8  * under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the
    9  * DARPA CHATS research program.
   10  *
   11  * Redistribution and use in source and binary forms, with or without
   12  * modification, are permitted provided that the following conditions
   13  * are met:
   14  * 1. Redistributions of source code must retain the above copyright
   15  *    notice, this list of conditions and the following disclaimer.
   16  * 2. Redistributions in binary form must reproduce the above copyright
   17  *    notice, this list of conditions and the following disclaimer in the
   18  *    documentation and/or other materials provided with the distribution.
   19  * 3. The names of the authors may not be used to endorse or promote
   20  *    products derived from this software without specific prior written
   21  *    permission.
   22  *
   23  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   33  * SUCH DAMAGE.
   34  *
   35  * $FreeBSD: releng/5.0/sys/geom/geom.h 108141 2002-12-20 21:52:03Z phk $
   36  */
   37 
   38 #ifndef _GEOM_GEOM_H_
   39 #define _GEOM_GEOM_H_
   40 
   41 #include <sys/lock.h>
   42 #include <sys/mutex.h>
   43 #include <sys/sx.h>
   44 #include <sys/queue.h>
   45 #include <sys/ioccom.h>
   46 #include <sys/sbuf.h>
   47 
   48 #ifdef KERNELSIM
   49 /*
   50  * The GEOM subsystem makes a few concessions in order to be able to run as a
   51  * user-land simulation as well as a kernel component.
   52  */
   53 #include <geom_sim.h>
   54 #endif
   55 
   56 struct g_class;
   57 struct g_geom;
   58 struct g_consumer;
   59 struct g_provider;
   60 struct g_event;
   61 struct thread;
   62 struct bio;
   63 struct sbuf;
   64 struct g_configargs;
   65 
   66 typedef int g_config_t (struct g_configargs *ca);
   67 typedef struct g_geom * g_taste_t (struct g_class *, struct g_provider *,
   68     int flags);
   69 #define G_TF_NORMAL             0
   70 #define G_TF_INSIST             1
   71 #define G_TF_TRANSPARENT        2
   72 typedef int g_access_t (struct g_provider *, int, int, int);
   73 /* XXX: not sure about the thread arg */
   74 typedef void g_orphan_t (struct g_consumer *);
   75 
   76 typedef void g_start_t (struct bio *);
   77 typedef void g_spoiled_t (struct g_consumer *);
   78 typedef void g_dumpconf_t (struct sbuf *, const char *indent, struct g_geom *,
   79     struct g_consumer *, struct g_provider *);
   80 
   81 /*
   82  * The g_class structure describes a transformation class.  In other words
   83  * all BSD disklabel handlers share one g_class, all MBR handlers share
   84  * one common g_class and so on.
   85  * Certain operations are instantiated on the class, most notably the
   86  * taste and config_geom functions.
   87  */
   88 struct g_class {
   89         const char              *name;
   90         g_taste_t               *taste;
   91         g_config_t              *config;
   92         /*
   93          * The remaning elements are private and classes should use
   94          * the G_CLASS_INITIALIZER macro to initialize them.
   95          */
   96         LIST_ENTRY(g_class)     class;
   97         LIST_HEAD(,g_geom)      geom;
   98         struct g_event          *event;
   99         u_int                   protect;
  100 };
  101 
  102 #define G_CLASS_INITIALIZER { 0, 0 }, { 0 }, 0, 0
  103 
  104 /*
  105  * The g_geom is an instance of a g_class.
  106  */
  107 struct g_geom {
  108         u_int                   protect;
  109         char                    *name;
  110         struct g_class          *class;
  111         LIST_ENTRY(g_geom)      geom;
  112         LIST_HEAD(,g_consumer)  consumer;
  113         LIST_HEAD(,g_provider)  provider;
  114         TAILQ_ENTRY(g_geom)     geoms;  /* XXX: better name */
  115         int                     rank;
  116         g_start_t               *start;
  117         g_spoiled_t             *spoiled;
  118         g_dumpconf_t            *dumpconf;
  119         g_access_t              *access;
  120         g_orphan_t              *orphan;
  121         void                    *softc;
  122         struct g_event          *event;
  123         unsigned                flags;
  124 #define G_GEOM_WITHER           1
  125 };
  126 
  127 /*
  128  * The g_bioq is a queue of struct bio's.
  129  * XXX: possibly collection point for statistics.
  130  * XXX: should (possibly) be collapsed with sys/bio.h::bio_queue_head.
  131  */
  132 struct g_bioq {
  133         TAILQ_HEAD(, bio)       bio_queue;
  134         struct mtx              bio_queue_lock;
  135         int                     bio_queue_length;
  136 };
  137 
  138 /*
  139  * A g_consumer is an attachment point for a g_provider.  One g_consumer
  140  * can only be attached to one g_provider, but multiple g_consumers
  141  * can be attached to one g_provider.
  142  */
  143 
  144 struct g_consumer {
  145         u_int                   protect;
  146         struct g_geom           *geom;
  147         LIST_ENTRY(g_consumer)  consumer;
  148         struct g_provider       *provider;
  149         LIST_ENTRY(g_consumer)  consumers;      /* XXX: better name */
  150         int                     acr, acw, ace;
  151         struct g_event          *event;
  152 
  153         int                     biocount;
  154         int                     spoiled;
  155 };
  156 
  157 /*
  158  * A g_provider is a "logical disk".
  159  */
  160 struct g_provider {
  161         u_int                   protect;
  162         char                    *name;
  163         LIST_ENTRY(g_provider)  provider;
  164         struct g_geom           *geom;
  165         LIST_HEAD(,g_consumer)  consumers;
  166         int                     acr, acw, ace;
  167         int                     error;
  168         struct g_event          *event;
  169         TAILQ_ENTRY(g_provider) orphan;
  170         u_int                   index;
  171         off_t                   mediasize;
  172         u_int                   sectorsize;
  173 };
  174 
  175 /*
  176  * This gadget is used by userland to pinpoint a particular instance of
  177  * something in the kernel.  The name is unreadable on purpose, people
  178  * should not encounter it directly but use library functions to deal
  179  * with it.
  180  * If len is zero, "id" contains a cast of the kernel pointer where the
  181  * entity is located, (likely derived from the "id=" attribute in the
  182  * XML config) and the g_id*() functions will validate this before allowing
  183  * it to be used.
  184  * If len is non-zero, it is the strlen() of the name which is pointed to
  185  * by "name".
  186  */
  187 struct geomidorname {
  188         u_int len;
  189         union {
  190                 const char      *name;
  191                 uintptr_t       id;
  192         } u;
  193 };
  194 
  195 /* geom_dev.c */
  196 int g_dev_print(void);
  197 
  198 /* geom_dump.c */
  199 void g_hexdump(void *ptr, int length);
  200 void g_trace(int level, const char *, ...);
  201 #       define G_T_TOPOLOGY     1
  202 #       define G_T_BIO          2
  203 #       define G_T_ACCESS       4
  204 
  205 
  206 /* geom_event.c */
  207 typedef void g_call_me_t(void *);
  208 int g_call_me(g_call_me_t *func, void *arg);
  209 void g_orphan_provider(struct g_provider *pp, int error);
  210 void g_silence(void);
  211 void g_waitidle(void);
  212 
  213 /* geom_subr.c */
  214 int g_access_abs(struct g_consumer *cp, int nread, int nwrite, int nexcl);
  215 int g_access_rel(struct g_consumer *cp, int nread, int nwrite, int nexcl);
  216 void g_add_class(struct g_class *mp);
  217 int g_attach(struct g_consumer *cp, struct g_provider *pp);
  218 void g_destroy_consumer(struct g_consumer *cp);
  219 void g_destroy_geom(struct g_geom *pp);
  220 void g_destroy_provider(struct g_provider *pp);
  221 void g_detach(struct g_consumer *cp);
  222 void g_error_provider(struct g_provider *pp, int error);
  223 int g_getattr__(const char *attr, struct g_consumer *cp, void *var, int len);
  224 #define g_getattr(a, c, v) g_getattr__((a), (c), (v), sizeof *(v))
  225 int g_handleattr(struct bio *bp, const char *attribute, void *val, int len);
  226 int g_handleattr_int(struct bio *bp, const char *attribute, int val);
  227 int g_handleattr_off_t(struct bio *bp, const char *attribute, off_t val);
  228 struct g_geom * g_insert_geom(const char *class, struct g_consumer *cp);
  229 struct g_consumer * g_new_consumer(struct g_geom *gp);
  230 struct g_geom * g_new_geomf(struct g_class *mp, const char *fmt, ...);
  231 struct g_provider * g_new_providerf(struct g_geom *gp, const char *fmt, ...);
  232 void g_sanity(void *ptr);
  233 void g_spoil(struct g_provider *pp, struct g_consumer *cp);
  234 int g_std_access(struct g_provider *pp, int dr, int dw, int de);
  235 void g_std_done(struct bio *bp);
  236 void g_std_spoiled(struct g_consumer *cp);
  237 struct g_class *g_idclass(struct geomidorname *);
  238 struct g_geom *g_idgeom(struct geomidorname *);
  239 struct g_provider *g_idprovider(struct geomidorname *);
  240 
  241 
  242 /* geom_io.c */
  243 struct bio * g_clone_bio(struct bio *);
  244 void g_destroy_bio(struct bio *);
  245 void g_io_deliver(struct bio *bp, int error);
  246 int g_io_getattr(const char *attr, struct g_consumer *cp, int *len, void *ptr);
  247 void g_io_request(struct bio *bp, struct g_consumer *cp);
  248 int g_io_setattr(const char *attr, struct g_consumer *cp, int len, void *ptr);
  249 struct bio *g_new_bio(void);
  250 void * g_read_data(struct g_consumer *cp, off_t offset, off_t length, int *error);
  251 int g_write_data(struct g_consumer *cp, off_t offset, void *ptr, off_t length);
  252 
  253 /* geom_kern.c / geom_kernsim.c */
  254 
  255 #ifndef _SYS_CONF_H_
  256 typedef int d_ioctl_t(dev_t dev, u_long cmd, caddr_t data,
  257                       int fflag, struct thread *td);
  258 #endif
  259 
  260 struct g_ioctl {
  261         u_long          cmd;
  262         void            *data;
  263         int             fflag;
  264         struct thread   *td;
  265         d_ioctl_t       *func;
  266         dev_t           dev;
  267 };
  268 
  269 #ifdef _KERNEL
  270 
  271 struct g_kerneldump {
  272         off_t           offset;
  273         off_t           length;
  274 };
  275 
  276 MALLOC_DECLARE(M_GEOM);
  277 
  278 static __inline void *
  279 g_malloc(int size, int flags)
  280 {
  281         void *p;
  282 
  283         p = malloc(size, M_GEOM, flags);
  284         g_sanity(p);
  285         /* printf("malloc(%d, %x) -> %p\n", size, flags, p); */
  286         return (p);
  287 }
  288 
  289 static __inline void
  290 g_free(void *ptr)
  291 {
  292         g_sanity(ptr);
  293         /* printf("free(%p)\n", ptr); */
  294         free(ptr, M_GEOM);
  295 }
  296 
  297 extern struct sx topology_lock;
  298 
  299 #define g_topology_lock()                                       \
  300         do {                                                    \
  301                 mtx_assert(&Giant, MA_NOTOWNED);                \
  302                 sx_xlock(&topology_lock);                       \
  303         } while (0)
  304 
  305 #define g_topology_unlock()                                     \
  306         do {                                                    \
  307                 g_sanity(NULL);                                 \
  308                 sx_xunlock(&topology_lock);                     \
  309         } while (0)
  310 
  311 #define g_topology_assert()                                     \
  312         do {                                                    \
  313                 g_sanity(NULL);                                 \
  314                 sx_assert(&topology_lock, SX_XLOCKED);          \
  315         } while (0)
  316 
  317 #define DECLARE_GEOM_CLASS_INIT(class, name, init)      \
  318         SYSINIT(name, SI_SUB_DRIVERS, SI_ORDER_FIRST, init, NULL);
  319 
  320 #define DECLARE_GEOM_CLASS(class, name)         \
  321         static void                             \
  322         name##init(void)                        \
  323         {                                       \
  324                 mtx_unlock(&Giant);             \
  325                 g_add_class(&class);            \
  326                 mtx_lock(&Giant);               \
  327         }                                       \
  328         DECLARE_GEOM_CLASS_INIT(class, name, name##init);
  329 
  330 #endif /* _KERNEL */
  331 
  332 /*
  333  * IOCTLS for talking to the geom.ctl device.
  334  */
  335 
  336 /*
  337  * This is the structure used internally in the kernel, it is created and
  338  * populated by geom_ctl.c.
  339  */
  340 struct g_configargs {
  341         /* Valid on call */
  342         struct g_class          *class;
  343         struct g_geom           *geom;
  344         struct g_provider       *provider;
  345         u_int                   flag;
  346         u_int                   len;
  347         void                    *ptr;
  348 };
  349 
  350 /*
  351  * This is the structure used to communicate with userland.
  352  */
  353 struct geomconfiggeom {
  354         /* Valid on call */
  355         struct geomidorname     class;
  356         struct geomidorname     geom;
  357         struct geomidorname     provider;
  358         u_int                   flag;
  359         u_int                   len;
  360         void                    *ptr;
  361 };
  362 
  363 #define GEOMCONFIGGEOM _IOW('G',  0, struct geomconfiggeom)
  364 
  365 #define GCFG_GENERIC0           0x00000000
  366         /*
  367          * Generic requests suitable for all classes.
  368          */
  369 #define GCFG_CLASS0             0x10000000
  370         /*
  371          * Class specific verbs.  Allocations in this part of the numberspace
  372          * can only be done after review and approval of phk@FreeBSD.org.
  373          * All allocations in this space will be listed in this file.
  374          */
  375 #define GCFG_PRIVATE0           0x20000000
  376         /*
  377          * Lowest allocation for private flag definitions.
  378          * If you define you own private "verbs", please express them in
  379          * your code as (GCFG_PRIVATE0 + somenumber), where somenumber is
  380          * a magic number in the range [0x0 ... 0xfffffff] chosen the way
  381          * magic numbers are chosen.  Such allocation SHALL NOT be listed
  382          * here but SHOULD be listed in some suitable .h file.
  383          */
  384 #define GCFG_RESERVED0          0x30000000
  385 #define GCFG_RESERVEDN          0xffffffff
  386         /*
  387          * This area is reserved for the future.
  388          */
  389 
  390 #define GCFG_CREATE             (GCFG_GENERIC0 + 0x0)
  391         /*
  392          * Request geom construction.
  393          * ptr/len is class-specific.
  394          */
  395 #define GCFG_DISMANTLE          (GCFG_GENERIC0 + 0x1)
  396         /*
  397          * Request orderly geom dismantling.
  398          * ptr/len is class-specific.
  399          */
  400 
  401 
  402 struct gcfg_magicrw {
  403         off_t   offset;
  404         u_int   len;
  405 };
  406 
  407 #define GCFG_MAGICREAD          (GCFG_GENERIC0 + 0x100)
  408         /*
  409          * Read of magic spaces.
  410          * ptr/len is gcfgmagicrw structure followed by bufferspace
  411          * for data to be read.
  412          */
  413 #define GCFG_MAGICWRITE         (GCFG_GENERIC0 + 0x101)
  414         /*
  415          * Write of magic spaces.
  416          * as above, only the other way.
  417          */
  418 
  419 
  420 /* geom_enc.c */
  421 uint16_t g_dec_be2(const u_char *p);
  422 uint32_t g_dec_be4(const u_char *p);
  423 uint16_t g_dec_le2(const u_char *p);
  424 uint32_t g_dec_le4(const u_char *p);
  425 uint64_t g_dec_le8(const u_char *p);
  426 void g_enc_le2(u_char *p, uint16_t u);
  427 void g_enc_le4(u_char *p, uint32_t u);
  428 void g_enc_le8(u_char *p, uint64_t u);
  429 
  430 #endif /* _GEOM_GEOM_H_ */

Cache object: 9069352174185b5d17465fdb4b89acca


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.