4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * * Neither the name of Red Hat nor the names of its contributors may be
16 * used to endorse or promote products derived from this software without
17 * specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
22 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
26 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
29 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
41 #define NBDKIT_API_VERSION 2
43 #include <nbdkit-plugin.h>
45 /* The size of disk in bytes (initialized by size=<SIZE> parameter). */
46 static int64_t size
= 0;
49 null_config (const char *key
, const char *value
)
53 if (strcmp (key
, "size") == 0) {
54 r
= nbdkit_parse_size (value
);
60 nbdkit_error ("unknown parameter '%s'", key
);
67 #define null_config_help \
68 "size=<SIZE> Size of the backing disk"
70 /* Create the per-connection handle. */
72 null_open (int readonly
)
74 return NBDKIT_HANDLE_NOT_NEEDED
;
77 #define THREAD_MODEL NBDKIT_THREAD_MODEL_PARALLEL
79 /* Get the disk size. */
81 null_get_size (void *handle
)
86 /* Serves the same data over multiple connections. */
88 null_can_multi_conn (void *handle
)
95 null_can_cache (void *handle
)
97 /* Everything is already in memory, returning this without
98 * implementing .cache lets nbdkit do the correct no-op.
100 return NBDKIT_CACHE_NATIVE
;
105 null_can_fast_zero (void *handle
)
112 null_pread (void *handle
, void *buf
, uint32_t count
, uint64_t offset
,
115 memset (buf
, 0, count
);
121 null_pwrite (void *handle
, const void *buf
, uint32_t count
, uint64_t offset
,
130 null_zero (void *handle
, uint32_t count
, uint64_t offset
, uint32_t flags
)
136 /* Flush is a no-op, so advertise native FUA support */
138 null_can_fua (void *handle
)
140 return NBDKIT_FUA_NATIVE
;
145 null_trim (void *handle
, uint32_t count
, uint64_t offset
, uint32_t flags
)
151 /* Nothing is persistent, so flush is trivially supported */
153 null_flush (void *handle
, uint32_t flags
)
160 null_extents (void *handle
, uint32_t count
, uint64_t offset
, uint32_t flags
,
161 struct nbdkit_extents
*extents
)
163 return nbdkit_add_extent (extents
, 0, size
,
164 NBDKIT_EXTENT_HOLE
| NBDKIT_EXTENT_ZERO
);
167 static struct nbdkit_plugin plugin
= {
169 .version
= PACKAGE_VERSION
,
170 .config
= null_config
,
171 .config_help
= null_config_help
,
172 .magic_config_key
= "size",
174 .get_size
= null_get_size
,
175 .can_multi_conn
= null_can_multi_conn
,
176 .can_cache
= null_can_cache
,
177 .can_fast_zero
= null_can_fast_zero
,
179 .pwrite
= null_pwrite
,
182 .can_fua
= null_can_fua
,
184 .extents
= null_extents
,
185 /* In this plugin, errno is preserved properly along error return
186 * paths from failed system calls.
188 .errno_is_preserved
= 1,
191 NBDKIT_REGISTER_PLUGIN (plugin
)