xref: /freebsd/cddl/usr.sbin/zfsd/vdev.h (revision 25038e8d)
1 /*-
2  * Copyright (c) 2011, 2012, 2013 Spectra Logic Corporation
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions, and the following disclaimer,
10  *    without modification.
11  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12  *    substantially similar to the "NO WARRANTY" disclaimer below
13  *    ("Disclaimer") and any redistribution must be conditioned upon
14  *    including a substantially similar Disclaimer requirement for further
15  *    binary redistribution.
16  *
17  * NO WARRANTY
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
27  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGES.
29  *
30  * Authors: Justin T. Gibbs     (Spectra Logic Corporation)
31  */
32 
33 /**
34  * \file vdev.h
35  *
36  * Definition of the Vdev class.
37  *
38  * Header requirements:
39  *
40  *    #include <string>
41  *    #include <list>
42  *
43  *    #include <devdctl/guid.h>
44  */
45 #ifndef	_VDEV_H_
46 #define	_VDEV_H_
47 
48 /*=========================== Forward Declarations ===========================*/
49 struct zpool_handle;
50 typedef struct zpool_handle zpool_handle_t;
51 
52 struct nvlist;
53 typedef struct nvlist nvlist_t;
54 
55 /*============================= Class Definitions ============================*/
56 /*----------------------------------- Vdev -----------------------------------*/
57 /**
58  * \brief Wrapper class for a vdev's name/value configuration list
59  *        simplifying access to commonly used vdev attributes.
60  */
61 class Vdev
62 {
63 public:
64 	/**
65 	 * \brief Instantiate a vdev object for a vdev that is a member
66 	 *        of an imported pool.
67 	 *
68 	 * \param pool        The pool object containing the vdev with
69 	 *                    configuration data provided in vdevConfig.
70 	 * \param vdevConfig  Vdev configuration data.
71 	 *
72 	 * This method should be used whenever dealing with vdev's
73 	 * enumerated via the ZpoolList class.  The in-core configuration
74 	 * data for a vdev does not contain all of the items found in
75 	 * the on-disk label.  This requires the vdev class to augment
76 	 * the data in vdevConfig with data found in the pool object.
77 	 */
78 	Vdev(zpool_handle_t *pool, nvlist_t *vdevConfig);
79 
80 	/**
81 	 * \brief Instantiate a vdev object for a vdev that is a member
82 	 *        of a pool configuration.
83 	 *
84 	 * \param poolConfig  The pool configuration containing the vdev
85 	 *                    configuration data provided in vdevConfig.
86 	 * \param vdevConfig  Vdev configuration data.
87 	 *
88 	 * This method should be used whenever dealing with vdev's
89 	 * enumerated via the ZpoolList class.  The in-core configuration
90 	 * data for a vdev does not contain all of the items found in
91 	 * the on-disk label.  This requires the vdev class to augment
92 	 * the data in vdevConfig with data found in the pool object.
93 	 */
94 	Vdev(nvlist_t *poolConfig, nvlist_t *vdevConfig);
95 
96 	/**
97 	 * \brief Instantiate a vdev object from a ZFS label stored on
98 	 *        the device.
99 	 *
100 	 * \param vdevConfig  The name/value list retrieved by reading
101 	 *                    the label information on a leaf vdev.
102 	 */
103 	Vdev(nvlist_t *vdevConfig);
104 
105 	/**
106 	 * \brief No-op copy constructor for nonexistent vdevs.
107 	 */
108 	Vdev();
109 
110 	/**
111 	 * \brief No-op virtual destructor, since this class has virtual
112 	 *        functions.
113 	 */
114 	virtual ~Vdev();
115 	bool			DoesNotExist()	const;
116 
117 	/**
118 	 * \brief Return a list of the vdev's children.
119 	 */
120 	std::list<Vdev>		 Children();
121 
122 	virtual DevdCtl::Guid	 GUID()		const;
123 	bool			 IsSpare()	const;
124 	virtual DevdCtl::Guid	 PoolGUID()	const;
125 	virtual vdev_state	 State()	const;
126 	std::string		 Path()		const;
127 	virtual std::string	 PhysicalPath()	const;
128 	std::string		 GUIDString()	const;
129 	nvlist_t		*PoolConfig()	const;
130 	nvlist_t		*Config()	const;
131 	Vdev			 Parent();
132 	Vdev			 RootVdev();
133 	virtual std::string	 Name(zpool_handle_t *, bool verbose)	const;
134 	bool			 IsSpare();
135 	bool			 IsAvailableSpare()	const;
136 	bool			 IsActiveSpare()	const;
137 	bool			 IsResilvering()	const;
138 
139 private:
140 	void			 VdevLookupGuid();
141 	bool			 VdevLookupPoolGuid();
142 	DevdCtl::Guid		 m_poolGUID;
143 	DevdCtl::Guid		 m_vdevGUID;
144 	nvlist_t		*m_poolConfig;
145 	nvlist_t		*m_config;
146 };
147 
148 //- Special objects -----------------------------------------------------------
149 extern Vdev NonexistentVdev;
150 
151 //- Vdev Inline Public Methods ------------------------------------------------
~Vdev()152 inline Vdev::~Vdev()
153 {
154 }
155 
156 inline DevdCtl::Guid
PoolGUID()157 Vdev::PoolGUID() const
158 {
159 	return (m_poolGUID);
160 }
161 
162 inline DevdCtl::Guid
GUID()163 Vdev::GUID() const
164 {
165 	return (m_vdevGUID);
166 }
167 
168 inline nvlist_t *
PoolConfig()169 Vdev::PoolConfig() const
170 {
171 	return (m_poolConfig);
172 }
173 
174 inline nvlist_t *
Config()175 Vdev::Config() const
176 {
177 	return (m_config);
178 }
179 
180 inline bool
DoesNotExist()181 Vdev::DoesNotExist() const
182 {
183 	return (m_config == NULL);
184 }
185 
186 #endif /* _VDEV_H_ */
187