Print this page
NEX-9338 improve the layout of the crash directory (use sys/uuid.h)
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
NEX-9338 improve the layout of the crash directory
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Steve Peng <steve.peng@nexenta.com>


   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
  23  * Delphix (c) 2012 by Delphix. All rights reserved.

  24  */
  25 
  26 
  27 /*
  28  * Dump driver.  Provides ioctls to get/set crash dump configuration.
  29  */
  30 
  31 #include <sys/types.h>
  32 #include <sys/param.h>
  33 #include <sys/systm.h>
  34 #include <sys/vnode.h>
  35 #include <sys/uio.h>
  36 #include <sys/cred.h>
  37 #include <sys/kmem.h>
  38 #include <sys/errno.h>
  39 #include <sys/modctl.h>
  40 #include <sys/dumphdr.h>
  41 #include <sys/dumpadm.h>
  42 #include <sys/pathname.h>
  43 #include <sys/file.h>
  44 #include <vm/anon.h>
  45 #include <sys/stat.h>
  46 #include <sys/conf.h>
  47 #include <sys/ddi.h>
  48 #include <sys/sunddi.h>

  49 
  50 static dev_info_t *dump_devi;
  51 
  52 static int
  53 dump_attach(dev_info_t *devi, ddi_attach_cmd_t cmd)
  54 {
  55         if (cmd != DDI_ATTACH)
  56                 return (DDI_FAILURE);
  57         if (ddi_create_minor_node(devi, "dump", S_IFCHR, 0, DDI_PSEUDO, NULL) ==
  58             DDI_FAILURE) {
  59                 ddi_remove_minor_node(devi, NULL);
  60                 return (DDI_FAILURE);
  61         }
  62         dump_devi = devi;
  63         return (DDI_SUCCESS);
  64 }
  65 
  66 static int
  67 dump_detach(dev_info_t *devi, ddi_detach_cmd_t cmd)
  68 {


  78 {
  79         switch (infocmd) {
  80         case DDI_INFO_DEVT2DEVINFO:
  81                 *result = dump_devi;
  82                 return (DDI_SUCCESS);
  83         case DDI_INFO_DEVT2INSTANCE:
  84                 *result = 0;
  85                 return (DDI_SUCCESS);
  86         }
  87         return (DDI_FAILURE);
  88 }
  89 
  90 /*ARGSUSED*/
  91 int
  92 dump_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *cred, int *rvalp)
  93 {
  94         uint64_t size;
  95         uint64_t dumpsize_in_pages;
  96         int error = 0;
  97         char *pathbuf = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
  98         char uuidbuf[36 + 1];
  99         size_t len;
 100         vnode_t *vp;
 101 
 102         switch (cmd) {
 103         case DIOCGETDUMPSIZE:
 104                 if (dump_conflags & DUMP_ALL)
 105                         size = ptob((uint64_t)physmem) / DUMP_COMPRESS_RATIO;
 106                 else {
 107                         /*
 108                          * We can't give a good answer for the DUMP_CURPROC
 109                          * because we won't know which process to use until it
 110                          * causes a panic.  We'll therefore punt and give the
 111                          * caller the size for the kernel.
 112                          *
 113                          * This kernel size equation takes care of the
 114                          * boot time kernel footprint and also accounts
 115                          * for availrmem changes due to user explicit locking.
 116                          * Refer to common/vm/vm_page.c for an explanation
 117                          * of these counters.
 118                          */


 165                 mutex_exit(&dump_lock);
 166                 error = copyoutstr(pathbuf, (void *)arg, MAXPATHLEN, NULL);
 167                 break;
 168 
 169         case DIOCSETDEV:
 170         case DIOCTRYDEV:
 171                 if ((error = copyinstr((char *)arg, pathbuf, MAXPATHLEN,
 172                     NULL)) != 0 || (error = lookupname(pathbuf, UIO_SYSSPACE,
 173                     FOLLOW, NULLVPP, &vp)) != 0)
 174                         break;
 175                 mutex_enter(&dump_lock);
 176                 if (vp->v_type == VBLK)
 177                         error = dumpinit(vp, pathbuf, cmd == DIOCTRYDEV);
 178                 else
 179                         error = ENOTBLK;
 180                 mutex_exit(&dump_lock);
 181                 VN_RELE(vp);
 182                 break;
 183 
 184         case DIOCDUMP:













 185                 mutex_enter(&dump_lock);
 186                 if (dumpvp == NULL)
 187                         error = ENODEV;
 188                 else if (dumpvp->v_flag & VISSWAP)
 189                         error = EBUSY;
 190                 else
 191                         dumpsys();
 192                 mutex_exit(&dump_lock);
 193                 break;
 194 
 195         case DIOCSETUUID:
 196                 if ((error = copyinstr((char *)arg, uuidbuf, sizeof (uuidbuf),
 197                     &len)) != 0)
 198                         break;
 199 
 200                 if (len != 37) {
 201                         error = EINVAL;
 202                         break;
 203                 }
 204 
 205                 error = dump_set_uuid(uuidbuf);
 206                 break;
 207 
 208         case DIOCGETUUID:
 209                 error = copyoutstr(dump_get_uuid(), (void *)arg, 37, NULL);

 210                 break;
 211 
 212         case DIOCRMDEV:
 213                 mutex_enter(&dump_lock);
 214                 if (dumpvp != NULL)
 215                         dumpfini();
 216                 mutex_exit(&dump_lock);
 217                 break;
 218 
 219         default:
 220                 error = ENXIO;
 221         }
 222 
 223         kmem_free(pathbuf, MAXPATHLEN);
 224         return (error);
 225 }
 226 
 227 struct cb_ops dump_cb_ops = {
 228         nulldev,                /* open */
 229         nulldev,                /* close */




   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
  23  * Delphix (c) 2012 by Delphix. All rights reserved.
  24  * Copyright 2017 Nexenta Systems, Inc. All rights reserved.
  25  */
  26 
  27 
  28 /*
  29  * Dump driver.  Provides ioctls to get/set crash dump configuration.
  30  */
  31 
  32 #include <sys/types.h>
  33 #include <sys/param.h>
  34 #include <sys/systm.h>
  35 #include <sys/vnode.h>
  36 #include <sys/uio.h>
  37 #include <sys/cred.h>
  38 #include <sys/kmem.h>
  39 #include <sys/errno.h>
  40 #include <sys/modctl.h>
  41 #include <sys/dumphdr.h>
  42 #include <sys/dumpadm.h>
  43 #include <sys/pathname.h>
  44 #include <sys/file.h>
  45 #include <vm/anon.h>
  46 #include <sys/stat.h>
  47 #include <sys/conf.h>
  48 #include <sys/ddi.h>
  49 #include <sys/sunddi.h>
  50 #include <sys/uuid.h>
  51 
  52 static dev_info_t *dump_devi;
  53 
  54 static int
  55 dump_attach(dev_info_t *devi, ddi_attach_cmd_t cmd)
  56 {
  57         if (cmd != DDI_ATTACH)
  58                 return (DDI_FAILURE);
  59         if (ddi_create_minor_node(devi, "dump", S_IFCHR, 0, DDI_PSEUDO, NULL) ==
  60             DDI_FAILURE) {
  61                 ddi_remove_minor_node(devi, NULL);
  62                 return (DDI_FAILURE);
  63         }
  64         dump_devi = devi;
  65         return (DDI_SUCCESS);
  66 }
  67 
  68 static int
  69 dump_detach(dev_info_t *devi, ddi_detach_cmd_t cmd)
  70 {


  80 {
  81         switch (infocmd) {
  82         case DDI_INFO_DEVT2DEVINFO:
  83                 *result = dump_devi;
  84                 return (DDI_SUCCESS);
  85         case DDI_INFO_DEVT2INSTANCE:
  86                 *result = 0;
  87                 return (DDI_SUCCESS);
  88         }
  89         return (DDI_FAILURE);
  90 }
  91 
  92 /*ARGSUSED*/
  93 int
  94 dump_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *cred, int *rvalp)
  95 {
  96         uint64_t size;
  97         uint64_t dumpsize_in_pages;
  98         int error = 0;
  99         char *pathbuf = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
 100         char uuidbuf[UUID_PRINTABLE_STRING_LENGTH];
 101         size_t len;
 102         vnode_t *vp;
 103 
 104         switch (cmd) {
 105         case DIOCGETDUMPSIZE:
 106                 if (dump_conflags & DUMP_ALL)
 107                         size = ptob((uint64_t)physmem) / DUMP_COMPRESS_RATIO;
 108                 else {
 109                         /*
 110                          * We can't give a good answer for the DUMP_CURPROC
 111                          * because we won't know which process to use until it
 112                          * causes a panic.  We'll therefore punt and give the
 113                          * caller the size for the kernel.
 114                          *
 115                          * This kernel size equation takes care of the
 116                          * boot time kernel footprint and also accounts
 117                          * for availrmem changes due to user explicit locking.
 118                          * Refer to common/vm/vm_page.c for an explanation
 119                          * of these counters.
 120                          */


 167                 mutex_exit(&dump_lock);
 168                 error = copyoutstr(pathbuf, (void *)arg, MAXPATHLEN, NULL);
 169                 break;
 170 
 171         case DIOCSETDEV:
 172         case DIOCTRYDEV:
 173                 if ((error = copyinstr((char *)arg, pathbuf, MAXPATHLEN,
 174                     NULL)) != 0 || (error = lookupname(pathbuf, UIO_SYSSPACE,
 175                     FOLLOW, NULLVPP, &vp)) != 0)
 176                         break;
 177                 mutex_enter(&dump_lock);
 178                 if (vp->v_type == VBLK)
 179                         error = dumpinit(vp, pathbuf, cmd == DIOCTRYDEV);
 180                 else
 181                         error = ENOTBLK;
 182                 mutex_exit(&dump_lock);
 183                 VN_RELE(vp);
 184                 break;
 185 
 186         case DIOCDUMP:
 187                 if ((error = copyinstr((char *)arg, uuidbuf, sizeof (uuidbuf),
 188                     &len)) != 0)
 189                         break;
 190 
 191                 if (len != UUID_PRINTABLE_STRING_LENGTH) {
 192                         error = EINVAL;
 193                         break;
 194                 }
 195                 if ((error = dump_update_uuid(uuidbuf)) != 0) {
 196                         error = EINVAL;
 197                         break;
 198                 }
 199 
 200                 mutex_enter(&dump_lock);
 201                 if (dumpvp == NULL)
 202                         error = ENODEV;
 203                 else if (dumpvp->v_flag & VISSWAP)
 204                         error = EBUSY;
 205                 else
 206                         dumpsys();
 207                 mutex_exit(&dump_lock);
 208                 break;
 209 
 210         case DIOCSETUUID:
 211                 if ((error = copyinstr((char *)arg, uuidbuf, sizeof (uuidbuf),
 212                     &len)) != 0)
 213                         break;
 214 
 215                 if (len != UUID_PRINTABLE_STRING_LENGTH) {
 216                         error = EINVAL;
 217                         break;
 218                 }
 219 
 220                 error = dump_set_uuid(uuidbuf);
 221                 break;
 222 
 223         case DIOCGETUUID:
 224                 error = copyoutstr(dump_get_uuid(), (void *)arg,
 225                     UUID_PRINTABLE_STRING_LENGTH, NULL);
 226                 break;
 227 
 228         case DIOCRMDEV:
 229                 mutex_enter(&dump_lock);
 230                 if (dumpvp != NULL)
 231                         dumpfini();
 232                 mutex_exit(&dump_lock);
 233                 break;
 234 
 235         default:
 236                 error = ENXIO;
 237         }
 238 
 239         kmem_free(pathbuf, MAXPATHLEN);
 240         return (error);
 241 }
 242 
 243 struct cb_ops dump_cb_ops = {
 244         nulldev,                /* open */
 245         nulldev,                /* close */