Print this page
OS-90 Kernel should generate events when device gets retired / unretired.
re #13613 rb4516 Tunables needs volatile keyword
        
*** 19,28 ****
--- 19,29 ----
   * CDDL HEADER END
   */
  
  /*
   * Copyright (c) 1990, 2010, Oracle and/or its affiliates. All rights reserved.
+  * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
   */
  
  /*
   * modctl system call for loadable module support.
   */
*** 62,71 ****
--- 63,74 ----
  #include <sys/debug.h>
  #include <sys/cpuvar.h>
  #include <sys/sysmacros.h>
  #include <sys/sysevent.h>
  #include <sys/sysevent_impl.h>
+ #include <sys/sysevent/eventdefs.h>
+ #include <sys/sysevent/dev.h>
  #include <sys/instance.h>
  #include <sys/modhash.h>
  #include <sys/modhash_impl.h>
  #include <sys/dacf_impl.h>
  #include <sys/vfs.h>
*** 130,140 ****
  int             modunload_active_count;
  int             modunload_disable_count;
  
  int     isminiroot;             /* set if running as miniroot */
  int     modrootloaded;          /* set after root driver and fs are loaded */
! int     moddebug = 0x0;         /* debug flags for module writers */
  int     swaploaded;             /* set after swap driver and fs are loaded */
  int     bop_io_quiesced = 0;    /* set when BOP I/O can no longer be used */
  int     last_module_id;
  clock_t mod_uninstall_interval = 0;
  int     mod_uninstall_pass_max = 6;
--- 133,143 ----
  int             modunload_active_count;
  int             modunload_disable_count;
  
  int     isminiroot;             /* set if running as miniroot */
  int     modrootloaded;          /* set after root driver and fs are loaded */
! volatile int moddebug = 0x0;    /* debug flags for module writers */
  int     swaploaded;             /* set after swap driver and fs are loaded */
  int     bop_io_quiesced = 0;    /* set when BOP I/O can no longer be used */
  int     last_module_id;
  clock_t mod_uninstall_interval = 0;
  int     mod_uninstall_pass_max = 6;
*** 965,974 ****
--- 968,1023 ----
  
          kmem_free(constraints, len);
  
          return (array);
  }
+ 
+ static void
+ publish_retire_event(char *path, int retire)
+ {
+         sysevent_t *ev;
+         sysevent_id_t eid;
+         sysevent_value_t se_val;
+         sysevent_attr_list_t *ev_attr_list = NULL;
+ 
+         ev = sysevent_alloc(EC_DEV_STATUS,
+             retire ? ESC_DEV_RETIRE : ESC_DEV_UNRETIRE, EC_DEVFS, SE_SLEEP);
+         if (ev == NULL) {
+                 goto fail;
+         }
+ 
+         se_val.value_type = SE_DATA_TYPE_STRING;
+         se_val.value.sv_string = path;
+ 
+         if (sysevent_add_attr(&ev_attr_list, DEV_PHYS_PATH,
+             &se_val, SE_SLEEP) != 0) {
+                 goto fail;
+         }
+ 
+         if (sysevent_attach_attributes(ev, ev_attr_list) != 0) {
+                 goto fail;
+         }
+ 
+         if (log_sysevent(ev, SE_SLEEP, &eid) != 0) {
+                 goto fail;
+         }
+ 
+         sysevent_free(ev);
+         return;
+ 
+ fail:
+ 
+         cmn_err(CE_WARN, "failed to log device %s event for %s",
+             retire ? "retire" : "unretire", path);
+ 
+         if (ev_attr_list != NULL) {
+                 sysevent_free_attr(ev_attr_list);
+         }
+ 
+         sysevent_free(ev);
+ }
+ 
  /*ARGSUSED*/
  static int
  modctl_retire(char *path, char *uconstraints, size_t ulen)
  {
          char    *pathbuf;
*** 1045,1054 ****
--- 1094,1106 ----
                  return (retval);
          }
          if (moddebug & MODDEBUG_RETIRE)
                  cmn_err(CE_NOTE, "Persisted retire of device: %s", devpath);
  
+         /* Issue sysevent. */
+         publish_retire_event(devpath, 1);
+ 
          kmem_free(devpath, strlen(devpath) + 1);
          return (0);
  }
  
  static int
*** 1142,1151 ****
--- 1194,1206 ----
          if (retval != 0) {
                  cmn_err(CE_WARN, "cannot unretire device: error %d, path %s\n",
                      retval, devpath);
          }
  
+         /* Issue sysevent. */
+         publish_retire_event(devpath, 0);
+ 
          kmem_free(devpath, strlen(devpath) + 1);
  
          return (retval);
  }