1*716fd348SMartin Matuska /* 2*716fd348SMartin Matuska * CDDL HEADER START 3*716fd348SMartin Matuska * 4*716fd348SMartin Matuska * The contents of this file are subject to the terms of the 5*716fd348SMartin Matuska * Common Development and Distribution License (the "License"). 6*716fd348SMartin Matuska * You may not use this file except in compliance with the License. 7*716fd348SMartin Matuska * 8*716fd348SMartin Matuska * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*716fd348SMartin Matuska * or http://www.opensolaris.org/os/licensing. 10*716fd348SMartin Matuska * See the License for the specific language governing permissions 11*716fd348SMartin Matuska * and limitations under the License. 12*716fd348SMartin Matuska * 13*716fd348SMartin Matuska * When distributing Covered Code, include this CDDL HEADER in each 14*716fd348SMartin Matuska * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*716fd348SMartin Matuska * If applicable, add the following below this CDDL HEADER, with the 16*716fd348SMartin Matuska * fields enclosed by brackets "[]" replaced with your own identifying 17*716fd348SMartin Matuska * information: Portions Copyright [yyyy] [name of copyright owner] 18*716fd348SMartin Matuska * 19*716fd348SMartin Matuska * CDDL HEADER END 20*716fd348SMartin Matuska */ 21*716fd348SMartin Matuska /* 22*716fd348SMartin Matuska * Copyright (c) 2011, Fajar A. Nugraha. All rights reserved. 23*716fd348SMartin Matuska * Use is subject to license terms. 24*716fd348SMartin Matuska */ 25*716fd348SMartin Matuska 26*716fd348SMartin Matuska #include <ctype.h> 27*716fd348SMartin Matuska #include <errno.h> 28*716fd348SMartin Matuska #include <fcntl.h> 29*716fd348SMartin Matuska #include <stdio.h> 30*716fd348SMartin Matuska #include <string.h> 31*716fd348SMartin Matuska #include <unistd.h> 32*716fd348SMartin Matuska #include <sys/fs/zfs.h> 33*716fd348SMartin Matuska #include <sys/ioctl.h> 34*716fd348SMartin Matuska #include <sys/stat.h> 35*716fd348SMartin Matuska 36*716fd348SMartin Matuska #if defined(ZFS_ASAN_ENABLED) 37*716fd348SMartin Matuska /* 38*716fd348SMartin Matuska * zvol_id is invoked by udev with the help of ptrace() 39*716fd348SMartin Matuska * making sanitized binary with leak detection croak 40*716fd348SMartin Matuska * because of tracing mechanisms collision 41*716fd348SMartin Matuska */ 42*716fd348SMartin Matuska extern const char *__asan_default_options(void); 43*716fd348SMartin Matuska 44*716fd348SMartin Matuska const char *__asan_default_options(void) { 45*716fd348SMartin Matuska return ("abort_on_error=true:halt_on_error=true:" 46*716fd348SMartin Matuska "allocator_may_return_null=true:disable_coredump=false:" 47*716fd348SMartin Matuska "detect_stack_use_after_return=true:detect_leaks=false"); 48*716fd348SMartin Matuska } 49*716fd348SMartin Matuska #endif 50*716fd348SMartin Matuska 51*716fd348SMartin Matuska int 52*716fd348SMartin Matuska main(int argc, const char *const *argv) 53*716fd348SMartin Matuska { 54*716fd348SMartin Matuska if (argc != 2) { 55*716fd348SMartin Matuska fprintf(stderr, "usage: %s /dev/zdX\n", argv[0]); 56*716fd348SMartin Matuska return (1); 57*716fd348SMartin Matuska } 58*716fd348SMartin Matuska const char *dev_name = argv[1]; 59*716fd348SMartin Matuska 60*716fd348SMartin Matuska int fd; 61*716fd348SMartin Matuska struct stat sb; 62*716fd348SMartin Matuska if ((fd = open(dev_name, O_RDONLY|O_CLOEXEC)) == -1 || 63*716fd348SMartin Matuska fstat(fd, &sb) != 0) { 64*716fd348SMartin Matuska fprintf(stderr, "%s: %s\n", dev_name, strerror(errno)); 65*716fd348SMartin Matuska return (1); 66*716fd348SMartin Matuska } 67*716fd348SMartin Matuska 68*716fd348SMartin Matuska char zvol_name[MAXNAMELEN + strlen("-part") + 10]; 69*716fd348SMartin Matuska if (ioctl(fd, BLKZNAME, zvol_name) == -1) { 70*716fd348SMartin Matuska fprintf(stderr, "%s: BLKZNAME: %s\n", 71*716fd348SMartin Matuska dev_name, strerror(errno)); 72*716fd348SMartin Matuska return (1); 73*716fd348SMartin Matuska } 74*716fd348SMartin Matuska 75*716fd348SMartin Matuska unsigned int dev_part = minor(sb.st_rdev) % ZVOL_MINORS; 76*716fd348SMartin Matuska if (dev_part != 0) 77*716fd348SMartin Matuska sprintf(zvol_name + strlen(zvol_name), "-part%u", dev_part); 78*716fd348SMartin Matuska 79*716fd348SMartin Matuska for (size_t i = 0; i < strlen(zvol_name); ++i) 80*716fd348SMartin Matuska if (isblank(zvol_name[i])) 81*716fd348SMartin Matuska zvol_name[i] = '+'; 82*716fd348SMartin Matuska 83*716fd348SMartin Matuska puts(zvol_name); 84*716fd348SMartin Matuska 85*716fd348SMartin Matuska return (0); 86*716fd348SMartin Matuska } 87