Skip to content

Commit e029baf

Browse files
committed
feat: Add checks for whether or not the chosen block size is compatible with the kernel NBD client
1 parent ff97ee4 commit e029baf

File tree

1 file changed

+24
-6
lines changed

1 file changed

+24
-6
lines changed

pkg/client/nbd.go

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,20 @@ import (
1919
"github.com/pojntfx/go-nbd/pkg/server"
2020
)
2121

22+
const (
23+
MinimumBlockSize = 512 // This is the minimum value that works in practice, else the client stops with "invalid argument"
24+
MaximumBlockSize = 4096 // This is the maximum value that works in practice, else the client stops with "invalid argument"
25+
)
26+
2227
var (
23-
ErrUnsupportedNetwork = errors.New("unsupported network")
24-
ErrUnknownReply = errors.New("unknown reply")
25-
ErrUnknownInfo = errors.New("unknown info")
26-
ErrUnknownErr = errors.New("unknown error")
27-
ErrUnsupportedBlockSize = errors.New("unsupported block size")
28+
ErrUnsupportedNetwork = errors.New("unsupported network")
29+
ErrUnknownReply = errors.New("unknown reply")
30+
ErrUnknownInfo = errors.New("unknown info")
31+
ErrUnknownErr = errors.New("unknown error")
32+
ErrUnsupportedServerBlockSize = errors.New("server proposed unsupported block size")
33+
ErrMinimumBlockSize = errors.New("block size below mimimum requested")
34+
ErrMaximumBlockSize = errors.New("block size above maximum requested")
35+
ErrBlockSizeNotPowerOfTwo = errors.New("block size is not a power of 2")
2836
)
2937

3038
type Options struct {
@@ -255,7 +263,17 @@ n:
255263
} else if options.BlockSize >= info.MinimumBlockSize && options.BlockSize <= info.MaximumBlockSize {
256264
chosenBlockSize = options.BlockSize
257265
} else {
258-
return ErrUnsupportedBlockSize
266+
return ErrUnsupportedServerBlockSize
267+
}
268+
269+
if chosenBlockSize > MaximumBlockSize {
270+
return ErrMaximumBlockSize
271+
} else if chosenBlockSize < MinimumBlockSize {
272+
return ErrMinimumBlockSize
273+
}
274+
275+
if !((chosenBlockSize > 0) && ((chosenBlockSize & (chosenBlockSize - 1)) == 0)) {
276+
return ErrBlockSizeNotPowerOfTwo
259277
}
260278
default:
261279
return ErrUnknownInfo

0 commit comments

Comments
 (0)