Provided by: freebsd-manpages_6.2-1_all bug
 

NAME

      g_new_consumer, g_destroy_consumer - GEOM consumers management
 

SYNOPSIS

      #include <geom/geom.h>
 
      struct g_consumer *
      g_new_consumer(struct g_geom *gp);
 
      void
      g_destroy_consumer(struct g_consumer *cp);
 

DESCRIPTION

      A GEOM consumer is the backdoor through which a geom connects to another
      GEOM provider and through which I/O requests are sent.
 
      The g_new_consumer() function creates a new consumer on geom gp.  Before
      using the new consumer, it has to be attached to a provider with
      g_attach(9) and opened with g_access(9).
 
      The g_destroy_consumer() function destroys the given consumer and cancels
      all related pending events.  This function is the last stage of killing
      an unwanted consumer.
 

RESTRICTIONS/CONDITIONS

      g_new_consumer():
 
            The geom gp has to have start and access methods defined.
 
            The topology lock has to be held.
 
      g_destroy_consumer():
 
            The consumer must not be attached to a provider.
 
            The access count has to be 0.
 
            The topology lock has to be held.
      The g_new_consumer() function returns a pointer to the newly created con‐
      sumer.
 

EXAMPLES

      Create consumer, attach it to given provider, gain read access and clean
      up.
 
            void
            some_function(struct g_geom *mygeom, struct g_provider *pp)
            {
                    struct g_consumer *cp;
 
                    g_topology_assert();
 
                    /* Create new consumer on ’mygeom’ geom. */
                    cp = g_new_consumer(mygeom);
                    /* Attach newly created consumer to given provider. */
                    if (g_attach(cp, pp) != 0) {
                            g_destroy_consumer(cp);
                            return;
                    }
                    /* Open provider for reading through our consumer. */
                    if (g_access(cp, 1, 0, 0) != 0) {
                            g_detach(cp);
                            g_destroy_consumer(cp);
                            return;
                    }
 
                    g_topology_unlock();
                    /*
                     * Read data from provider.
                     */
                    g_topology_lock();
 
                    /* Disconnect from provider (release access count). */
                    g_access(cp, -1, 0, 0);
                    /* Detach from provider. */
                    g_detach(cp);
                    /* Destroy consumer. */
                    g_destroy_consumer(cp);
            }
      geom(4), DECLARE_GEOM_CLASS(9), g_access(9), g_attach(9), g_bio(9),
      g_data(9), g_event(9), g_geom(9), g_provider(9), g_provider_by_name(9),
      g_wither_geom(9)
 

AUTHORS

      This manual page was written by Pawel Jakub Dawidek 〈pjd@FreeBSD.org〉.