|
@@ -99,6 +99,39 @@ static void zpool_put_driver(struct zpool_driver *driver)
|
|
|
module_put(driver->owner);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * zpool_has_pool() - Check if the pool driver is available
|
|
|
+ * @type The type of the zpool to check (e.g. zbud, zsmalloc)
|
|
|
+ *
|
|
|
+ * This checks if the @type pool driver is available. This will try to load
|
|
|
+ * the requested module, if needed, but there is no guarantee the module will
|
|
|
+ * still be loaded and available immediately after calling. If this returns
|
|
|
+ * true, the caller should assume the pool is available, but must be prepared
|
|
|
+ * to handle the @zpool_create_pool() returning failure. However if this
|
|
|
+ * returns false, the caller should assume the requested pool type is not
|
|
|
+ * available; either the requested pool type module does not exist, or could
|
|
|
+ * not be loaded, and calling @zpool_create_pool() with the pool type will
|
|
|
+ * fail.
|
|
|
+ *
|
|
|
+ * Returns: true if @type pool is available, false if not
|
|
|
+ */
|
|
|
+bool zpool_has_pool(char *type)
|
|
|
+{
|
|
|
+ struct zpool_driver *driver = zpool_get_driver(type);
|
|
|
+
|
|
|
+ if (!driver) {
|
|
|
+ request_module("zpool-%s", type);
|
|
|
+ driver = zpool_get_driver(type);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!driver)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ zpool_put_driver(driver);
|
|
|
+ return true;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(zpool_has_pool);
|
|
|
+
|
|
|
/**
|
|
|
* zpool_create_pool() - Create a new zpool
|
|
|
* @type The type of the zpool to create (e.g. zbud, zsmalloc)
|