aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorDan Streetman <ddstreet@ieee.org>2015-09-09 18:35:16 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-09-10 16:29:01 -0400
commit3f0e131221eb951c45c93d1cce9db73889be2a5e (patch)
treeaa492f7062a9d73643e424b352598363c41acdf2 /mm
parent26d2177e977c912863ac04f6c1a967e793ca3a56 (diff)
zpool: add zpool_has_pool()
This series makes creation of the zpool and compressor dynamic, so that they can be changed at runtime. This makes using/configuring zswap easier, as before this zswap had to be configured at boot time, using boot params. This uses a single list to track both the zpool and compressor together, although Seth had mentioned an alternative which is to track the zpools and compressors using separate lists. In the most common case, only a single zpool and single compressor, using one list is slightly simpler than using two lists, and for the uncommon case of multiple zpools and/or compressors, using one list is slightly less simple (and uses slightly more memory, probably) than using two lists. This patch (of 4): Add zpool_has_pool() function, indicating if the specified type of zpool is available (i.e. zsmalloc or zbud). This allows checking if a pool is available, without actually trying to allocate it, similar to crypto_has_alg(). This is used by a following patch to zswap that enables the dynamic runtime creation of zswap zpools. Signed-off-by: Dan Streetman <ddstreet@ieee.org> Acked-by: Seth Jennings <sjennings@variantweb.net> Cc: Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/zpool.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/mm/zpool.c b/mm/zpool.c
index 68d2dd8ed2d8..8f670d3e8706 100644
--- a/mm/zpool.c
+++ b/mm/zpool.c
@@ -100,6 +100,39 @@ static void zpool_put_driver(struct zpool_driver *driver)
100} 100}
101 101
102/** 102/**
103 * zpool_has_pool() - Check if the pool driver is available
104 * @type The type of the zpool to check (e.g. zbud, zsmalloc)
105 *
106 * This checks if the @type pool driver is available. This will try to load
107 * the requested module, if needed, but there is no guarantee the module will
108 * still be loaded and available immediately after calling. If this returns
109 * true, the caller should assume the pool is available, but must be prepared
110 * to handle the @zpool_create_pool() returning failure. However if this
111 * returns false, the caller should assume the requested pool type is not
112 * available; either the requested pool type module does not exist, or could
113 * not be loaded, and calling @zpool_create_pool() with the pool type will
114 * fail.
115 *
116 * Returns: true if @type pool is available, false if not
117 */
118bool zpool_has_pool(char *type)
119{
120 struct zpool_driver *driver = zpool_get_driver(type);
121
122 if (!driver) {
123 request_module("zpool-%s", type);
124 driver = zpool_get_driver(type);
125 }
126
127 if (!driver)
128 return false;
129
130 zpool_put_driver(driver);
131 return true;
132}
133EXPORT_SYMBOL(zpool_has_pool);
134
135/**
103 * zpool_create_pool() - Create a new zpool 136 * zpool_create_pool() - Create a new zpool
104 * @type The type of the zpool to create (e.g. zbud, zsmalloc) 137 * @type The type of the zpool to create (e.g. zbud, zsmalloc)
105 * @name The name of the zpool (e.g. zram0, zswap) 138 * @name The name of the zpool (e.g. zram0, zswap)