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
= -1;
49 full_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
);
68 full_config_complete (void)
71 nbdkit_error ("size parameter is required");
78 #define full_config_help \
79 "size=<SIZE> (required) Size of the backing disk"
81 /* Create the per-connection handle. */
83 full_open (int readonly
)
85 return NBDKIT_HANDLE_NOT_NEEDED
;
88 #define THREAD_MODEL NBDKIT_THREAD_MODEL_PARALLEL
90 /* Get the disk size. */
92 full_get_size (void *handle
)
97 /* Serves the same data over multiple connections. */
99 full_can_multi_conn (void *handle
)
106 full_can_cache (void *handle
)
108 /* Everything is already in memory, returning this without
109 * implementing .cache lets nbdkit do the correct no-op.
111 return NBDKIT_CACHE_NATIVE
;
116 full_pread (void *handle
, void *buf
, uint32_t count
, uint64_t offset
,
119 memset (buf
, 0, count
);
125 full_pwrite (void *handle
, const void *buf
, uint32_t count
, uint64_t offset
,
132 /* Omitting full_zero is intentional: that way, nbdkit defaults to
133 * permitting fast zeroes which respond with ENOTSUP, while normal
134 * zeroes fall back to pwrite and respond with ENOSPC.
139 full_trim (void *handle
, uint32_t count
, uint64_t offset
, uint32_t flags
)
147 full_extents (void *handle
, uint32_t count
, uint64_t offset
, uint32_t flags
,
148 struct nbdkit_extents
*extents
)
150 return nbdkit_add_extent (extents
, 0, size
,
151 NBDKIT_EXTENT_HOLE
| NBDKIT_EXTENT_ZERO
);
154 /* Note that we don't need to handle flush: If there has been previous
155 * write then we have already returned an error. If there have been
156 * no previous writes then flush can be ignored.
159 static struct nbdkit_plugin plugin
= {
161 .version
= PACKAGE_VERSION
,
162 .config
= full_config
,
163 .config_complete
= full_config_complete
,
164 .config_help
= full_config_help
,
165 .magic_config_key
= "size",
167 .get_size
= full_get_size
,
168 .can_multi_conn
= full_can_multi_conn
,
169 .can_cache
= full_can_cache
,
171 .pwrite
= full_pwrite
,
173 .extents
= full_extents
,
174 /* In this plugin, errno is preserved properly along error return
175 * paths from failed system calls.
177 .errno_is_preserved
= 1,
180 NBDKIT_REGISTER_PLUGIN (plugin
)