.\" Automatically generated by Podwrapper::Man 1.32.5 (Pod::Simple 3.43) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" ======================================================================== .\" .IX Title "nbdkit-blocksize-policy-filter 1" .TH nbdkit-blocksize-policy-filter 1 "2023-01-04" "nbdkit-1.32.5" "NBDKIT" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" nbdkit\-blocksize\-policy\-filter \- set minimum, preferred and maximum block size, and apply error policy .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 5 \& nbdkit \-\-filter=blocksize\-policy PLUGIN \& [blocksize\-error\-policy=allow|error] \& [blocksize\-minimum=N] \& [blocksize\-preferred=N] \& [blocksize\-maximum=N] .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" \&\f(CW\*(C`nbdkit\-blocksize\-policy\-filter\*(C'\fR is an \fBnbdkit\fR\|(1) filter that can add block size constraints to plugins which don't already support them. It can also enforce an error policy for badly behaved clients which do not obey the block size constraints. .PP For more information about block size constraints, see section \&\*(L"Block size constraints\*(R" in https://github.com/NetworkBlockDevice/nbd/blob/master/doc/proto.md. .PP The simplest usage is to place this filter on top of any plugin which does not advertise block size constraints, and set the \&\f(CW\*(C`blocksize\-minimum\*(C'\fR, \f(CW\*(C`blocksize\-preferred\*(C'\fR and \f(CW\*(C`blocksize\-maximum\*(C'\fR parameters with the desired constraints. For example: .PP .Vb 2 \& nbdkit \-\-filter=blocksize\-policy memory 1G \e \& blocksize\-preferred=32K .Ve .PP would adjust \fBnbdkit\-memory\-plugin\fR\|(1) so that clients should prefer 32K requests. You can query the \s-1NBD\s0 server advertised constraints using \fBnbdinfo\fR\|(1): .PP .Vb 5 \& $ nbdinfo nbd://localhost \& [...] \& block_size_minimum: 1 \& block_size_preferred: 32768 \& block_size_maximum: 4294967295 .Ve .PP The second part of this filter is adjusting the error policy when badly behaved clients do not obey the minimum or maximum request size. Normally nbdkit permits these requests, leaving it up to the plugin whether it rejects the request with an error or tries to process the request (eg. trying to split an over-large request or doing a read-modify-write for an unaligned write). With this filter you can use \f(CW\*(C`blocksize\-error\-policy=error\*(C'\fR to reject these requests in the filter with an \s-1EINVAL\s0 error. The plugin will not see them. .SS "Combining with \fBnbdkit\-blocksize\-filter\fP\|(1)" .IX Subsection "Combining with nbdkit-blocksize-filter" A related filter is \fBnbdkit\-blocksize\-filter\fR\|(1). That filter can split and combine requests for plugins that cannot handle requests under or over a particular size. .PP Both filters may be used together like this (note that the order of the filters is important): .PP .Vb 5 \& nbdkit \-\-filter=blocksize\-policy \e \& \-\-filter=blocksize \e \& PLUGIN ... \e \& blocksize\-error\-policy=allow \e \& blocksize\-minimum=64K minblock=64K .Ve .PP This says to advertise a minimum block size of 64K. Well-behaved clients will obey this. Badly behaved clients will send requests < 64K which will be converted to slow 64K read-modify-write cycles to the underlying plugin. In either case the plugin will only see requests on 64K (or multiples of 64K) boundaries. .SH "PARAMETERS" .IX Header "PARAMETERS" .IP "\fBblocksize\-error\-policy=allow\fR" 4 .IX Item "blocksize-error-policy=allow" .PD 0 .IP "\fBblocksize\-error\-policy=error\fR" 4 .IX Item "blocksize-error-policy=error" .PD If a client sends a request which is smaller than the permitted minimum size or larger than the permitted maximum size, or not aligned to the minimum size, \f(CW\*(C`blocksize\-error\-policy\*(C'\fR chooses what the filter will do. The default (and also nbdkit's default) is \f(CW\*(C`allow\*(C'\fR which means pass the request through to the plugin. .Sp Use \f(CW\*(C`error\*(C'\fR to return an \s-1EINVAL\s0 error back to the client. The plugin will not see the badly formed request in this case. .IP "\fBblocksize\-minimum=\fRN" 4 .IX Item "blocksize-minimum=N" .PD 0 .IP "\fBblocksize\-preferred=\fRN" 4 .IX Item "blocksize-preferred=N" .IP "\fBblocksize\-maximum=\fRN" 4 .IX Item "blocksize-maximum=N" .PD Advertise minimum, preferred and/or maximum block size to the client. Well-behaved clients should obey these constraints. .Sp For each parameter, you can specify it as a size (using the usual modifiers like \f(CW\*(C`4K\*(C'\fR). .Sp If the parameter is omitted then either the constraint advertised by the plugin itself is used, or a sensible default for plugins which do not advertise block size constraints. .SH "FILES" .IX Header "FILES" .IP "\fI\f(CI$filterdir\fI/nbdkit\-blocksize\-policy\-filter.so\fR" 4 .IX Item "$filterdir/nbdkit-blocksize-policy-filter.so" The filter. .Sp Use \f(CW\*(C`nbdkit \-\-dump\-config\*(C'\fR to find the location of \f(CW$filterdir\fR. .SH "VERSION" .IX Header "VERSION" \&\f(CW\*(C`nbdkit\-limit\-filter\*(C'\fR first appeared in nbdkit 1.30. .SH "SEE ALSO" .IX Header "SEE ALSO" \&\fBnbdkit\fR\|(1), \&\fBnbdkit\-blocksize\-filter\fR\|(1), \&\fBnbdkit\-filter\fR\|(3), \&\fBnbdkit\-plugin\fR\|(3). .SH "AUTHORS" .IX Header "AUTHORS" Richard W.M. Jones .SH "COPYRIGHT" .IX Header "COPYRIGHT" Copyright (C) 2022 Red Hat Inc. .SH "LICENSE" .IX Header "LICENSE" Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: .IP "\(bu" 4 Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. .IP "\(bu" 4 Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. .IP "\(bu" 4 Neither the name of Red Hat nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. .PP \&\s-1THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS\s0 ''\s-1AS IS\s0'' \s-1AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\s0 (\s-1INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES\s0; \s-1LOSS OF USE, DATA, OR PROFITS\s0; \s-1OR BUSINESS INTERRUPTION\s0) \s-1HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\s0 (\s-1INCLUDING NEGLIGENCE OR OTHERWISE\s0) \s-1ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\s0