1*7a0c41d5SAlan Somers /*- 2*7a0c41d5SAlan Somers * Copyright (c) 2011, 2012, 2013 Spectra Logic Corporation 3*7a0c41d5SAlan Somers * All rights reserved. 4*7a0c41d5SAlan Somers * 5*7a0c41d5SAlan Somers * Redistribution and use in source and binary forms, with or without 6*7a0c41d5SAlan Somers * modification, are permitted provided that the following conditions 7*7a0c41d5SAlan Somers * are met: 8*7a0c41d5SAlan Somers * 1. Redistributions of source code must retain the above copyright 9*7a0c41d5SAlan Somers * notice, this list of conditions, and the following disclaimer, 10*7a0c41d5SAlan Somers * without modification. 11*7a0c41d5SAlan Somers * 2. Redistributions in binary form must reproduce at minimum a disclaimer 12*7a0c41d5SAlan Somers * substantially similar to the "NO WARRANTY" disclaimer below 13*7a0c41d5SAlan Somers * ("Disclaimer") and any redistribution must be conditioned upon 14*7a0c41d5SAlan Somers * including a substantially similar Disclaimer requirement for further 15*7a0c41d5SAlan Somers * binary redistribution. 16*7a0c41d5SAlan Somers * 17*7a0c41d5SAlan Somers * NO WARRANTY 18*7a0c41d5SAlan Somers * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19*7a0c41d5SAlan Somers * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20*7a0c41d5SAlan Somers * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 21*7a0c41d5SAlan Somers * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22*7a0c41d5SAlan Somers * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23*7a0c41d5SAlan Somers * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24*7a0c41d5SAlan Somers * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25*7a0c41d5SAlan Somers * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 26*7a0c41d5SAlan Somers * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 27*7a0c41d5SAlan Somers * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*7a0c41d5SAlan Somers * POSSIBILITY OF SUCH DAMAGES. 29*7a0c41d5SAlan Somers * 30*7a0c41d5SAlan Somers * Authors: Justin T. Gibbs (Spectra Logic Corporation) 31*7a0c41d5SAlan Somers */ 32*7a0c41d5SAlan Somers 33*7a0c41d5SAlan Somers /** 34*7a0c41d5SAlan Somers * \file zfsd_exception 35*7a0c41d5SAlan Somers * 36*7a0c41d5SAlan Somers * Implementation of the ZfsdException class. 37*7a0c41d5SAlan Somers */ 38*7a0c41d5SAlan Somers #include <sys/cdefs.h> 39*7a0c41d5SAlan Somers #include <sys/fs/zfs.h> 40*7a0c41d5SAlan Somers 41*7a0c41d5SAlan Somers #include <syslog.h> 42*7a0c41d5SAlan Somers 43*7a0c41d5SAlan Somers #include <string> 44*7a0c41d5SAlan Somers #include <list> 45*7a0c41d5SAlan Somers #include <sstream> 46*7a0c41d5SAlan Somers 47*7a0c41d5SAlan Somers #include <devdctl/exception.h> 48*7a0c41d5SAlan Somers #include <devdctl/guid.h> 49*7a0c41d5SAlan Somers 50*7a0c41d5SAlan Somers #include <libzfs.h> 51*7a0c41d5SAlan Somers 52*7a0c41d5SAlan Somers #include "vdev.h" 53*7a0c41d5SAlan Somers #include "zfsd_exception.h" 54*7a0c41d5SAlan Somers 55*7a0c41d5SAlan Somers __FBSDID("$FreeBSD$"); 56*7a0c41d5SAlan Somers /*============================ Namespace Control =============================*/ 57*7a0c41d5SAlan Somers using std::endl; 58*7a0c41d5SAlan Somers using std::string; 59*7a0c41d5SAlan Somers using std::stringstream; 60*7a0c41d5SAlan Somers 61*7a0c41d5SAlan Somers /*=========================== Class Implementations ==========================*/ 62*7a0c41d5SAlan Somers /*------------------------------- ZfsdException ------------------------------*/ 63*7a0c41d5SAlan Somers ZfsdException::ZfsdException(const char *fmt, ...) 64*7a0c41d5SAlan Somers : DevdCtl::Exception(), 65*7a0c41d5SAlan Somers m_poolConfig(NULL), 66*7a0c41d5SAlan Somers m_vdevConfig(NULL) 67*7a0c41d5SAlan Somers { 68*7a0c41d5SAlan Somers va_list ap; 69*7a0c41d5SAlan Somers 70*7a0c41d5SAlan Somers va_start(ap, fmt); 71*7a0c41d5SAlan Somers FormatLog(fmt, ap); 72*7a0c41d5SAlan Somers va_end(ap); 73*7a0c41d5SAlan Somers } 74*7a0c41d5SAlan Somers 75*7a0c41d5SAlan Somers ZfsdException::ZfsdException(zpool_handle_t *pool, const char *fmt, ...) 76*7a0c41d5SAlan Somers : DevdCtl::Exception(), 77*7a0c41d5SAlan Somers m_poolConfig(zpool_get_config(pool, NULL)), 78*7a0c41d5SAlan Somers m_vdevConfig(NULL) 79*7a0c41d5SAlan Somers { 80*7a0c41d5SAlan Somers va_list ap; 81*7a0c41d5SAlan Somers 82*7a0c41d5SAlan Somers va_start(ap, fmt); 83*7a0c41d5SAlan Somers FormatLog(fmt, ap); 84*7a0c41d5SAlan Somers va_end(ap); 85*7a0c41d5SAlan Somers } 86*7a0c41d5SAlan Somers 87*7a0c41d5SAlan Somers ZfsdException::ZfsdException(nvlist_t *poolConfig, const char *fmt, ...) 88*7a0c41d5SAlan Somers : DevdCtl::Exception(), 89*7a0c41d5SAlan Somers m_poolConfig(poolConfig), 90*7a0c41d5SAlan Somers m_vdevConfig(NULL) 91*7a0c41d5SAlan Somers { 92*7a0c41d5SAlan Somers va_list ap; 93*7a0c41d5SAlan Somers 94*7a0c41d5SAlan Somers va_start(ap, fmt); 95*7a0c41d5SAlan Somers FormatLog(fmt, ap); 96*7a0c41d5SAlan Somers va_end(ap); 97*7a0c41d5SAlan Somers } 98*7a0c41d5SAlan Somers 99*7a0c41d5SAlan Somers void 100*7a0c41d5SAlan Somers ZfsdException::Log() const 101*7a0c41d5SAlan Somers { 102*7a0c41d5SAlan Somers stringstream output; 103*7a0c41d5SAlan Somers 104*7a0c41d5SAlan Somers if (m_poolConfig != NULL) { 105*7a0c41d5SAlan Somers 106*7a0c41d5SAlan Somers output << "Pool "; 107*7a0c41d5SAlan Somers 108*7a0c41d5SAlan Somers char *poolName; 109*7a0c41d5SAlan Somers if (nvlist_lookup_string(m_poolConfig, ZPOOL_CONFIG_POOL_NAME, 110*7a0c41d5SAlan Somers &poolName) == 0) 111*7a0c41d5SAlan Somers output << poolName; 112*7a0c41d5SAlan Somers else 113*7a0c41d5SAlan Somers output << "Unknown"; 114*7a0c41d5SAlan Somers output << ": "; 115*7a0c41d5SAlan Somers } 116*7a0c41d5SAlan Somers 117*7a0c41d5SAlan Somers if (m_vdevConfig != NULL) { 118*7a0c41d5SAlan Somers 119*7a0c41d5SAlan Somers if (m_poolConfig != NULL) { 120*7a0c41d5SAlan Somers Vdev vdev(m_poolConfig, m_vdevConfig); 121*7a0c41d5SAlan Somers 122*7a0c41d5SAlan Somers output << "Vdev " << vdev.GUID() << ": "; 123*7a0c41d5SAlan Somers } else { 124*7a0c41d5SAlan Somers Vdev vdev(m_vdevConfig); 125*7a0c41d5SAlan Somers 126*7a0c41d5SAlan Somers output << "Pool " << vdev.PoolGUID() << ": "; 127*7a0c41d5SAlan Somers output << "Vdev " << vdev.GUID() << ": "; 128*7a0c41d5SAlan Somers } 129*7a0c41d5SAlan Somers } 130*7a0c41d5SAlan Somers 131*7a0c41d5SAlan Somers output << m_log << endl; 132*7a0c41d5SAlan Somers syslog(LOG_ERR, "%s", output.str().c_str()); 133*7a0c41d5SAlan Somers } 134*7a0c41d5SAlan Somers 135