LDI_EV_FINALIZE(9F)     Kernel Functions for Drivers     LDI_EV_FINALIZE(9F)
NAME
       ldi_ev_finalize - propagate disposition of a state change event
SYNOPSIS
       #include <sys/sunldi.h>       
void ldi_ev_finalize(
dev_info_t *dip, 
minor_t minor, 
int spec_type,            
int ldi_result, 
ldi_ev_cookie_t cookie, 
void *ev_data);
INTERFACE LEVEL
       illumos DDI specific (illumos DDI)
PARAMETERS
       dev_info_t *dip           The 
devinfo node of the layered consumer exporting the minor
           device.       
minor_t minor           The minor number of the exported minor device.       
int spec_type           The type of minor device (
S_IFCHR or 
S_IFBLK).       
int ldi_result           The final disposition of the state change.       
ldi_ev_cookie_t cookie           An opaque event cookie for the event type returned by a previous
           call to 
ldi_ev_get_cookie(9F).       
void *ev_data           Event specific data.
DESCRIPTION
       The 
ldi_ev_finalize() function propagates the final disposition of an
       event up the software stack. It may result in two actions:
           o      Invocation of "finalize" 
LDI callback handlers registered
                  by layered drivers up the software stack.
           o      Device contract "negotiation end" (
CT_EV_NEGEND) events
                  generated on minors exported to 
userland.
       The event propagated up the software stack may be different than the
       event received by the layered driver invoking 
ldi_ev_finalize(). For
       example, a volume manager may receive an "offline" event on one of
       it's 
LDI opened disks, but may choose to propagate a "degraded" event
       on minors it exports to 
userland (since  it  may have more than one
       copy of the data). The event cookie argument to 
ldi_ev_notify(9F) may
       be different from the event cookie currently possessed by the layered
       driver. If that is the case, the layered driver must generate another
       event cookie via a new 
ldi_ev_get_cookie(9F) call.
RETURN VALUES
       None.
CONTEXT
       This function can be called from user and kernel contexts only.
EXAMPLES
       Example 1: Invoking ldi_ev_finalize(9F) from widget's finalize
       callback
       The following example shows how the 
ldi_ev_finalize() function is
       invoked from a widget's finalize callback:
         static void
         widget_finalize(ldi_handle_t lh, ldi_ev_cookie_t foo_cookie,
             int ldi_result, void *arg, void *ev_data)
         {
                  ASSERT(strcmp(ldi_ev_get_type(foo_cookie), LDI_EV_FOO) == 0);
                  /* Map imported minor to exported minors */
                  widget_map(lh, &minor, &spec_type);
                  if (ldi_result == LDI_EV_SUCCESS) {
                          ldi_ev_finalize(dip, minor, spec_type,
                              LDI_EV_SUCCESS, foo_cookie, ev_data);
                   }
                   /*
                    * The event foo failed. Reconfigure yourself
                    * *before* propagating
                    */
                   widget_reconfigure(lh, LDI_EV_FOO, REACQUIRE);
                   ldi_ev_finalize(dip, minor, spec_type, LDI_EV_FAILURE,
                       foo_cookie, ev_data);
         }
SEE ALSO
       ldi_ev_get_cookie(9F), 
ldi_ev_register_callbacks(9F),       
ldi_ev_remove_callbacks(9F)                               August 21, 2007           LDI_EV_FINALIZE(9F)