diff options
-rw-r--r-- | nbd/server.c | 13 | ||||
-rw-r--r-- | tests/qemu-iotests/223.out | 4 | ||||
-rw-r--r-- | tests/qemu-iotests/233.out | 2 | ||||
-rw-r--r-- | tests/qemu-iotests/241.out | 10 |
4 files changed, 17 insertions, 12 deletions
diff --git a/nbd/server.c b/nbd/server.c index fd013a2817..218a2aa5e6 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -607,13 +607,16 @@ static int nbd_negotiate_handle_info(NBDClient *client, uint16_t myflags, /* Send NBD_INFO_BLOCK_SIZE always, but tweak the minimum size * according to whether the client requested it, and according to * whether this is OPT_INFO or OPT_GO. */ - /* minimum - 1 for back-compat, or 512 if client is new enough. - * TODO: consult blk_bs(blk)->bl.request_alignment? */ - sizes[0] = - (client->opt == NBD_OPT_INFO || blocksize) ? BDRV_SECTOR_SIZE : 1; + /* minimum - 1 for back-compat, or actual if client will obey it. */ + if (client->opt == NBD_OPT_INFO || blocksize) { + sizes[0] = blk_get_request_alignment(exp->blk); + } else { + sizes[0] = 1; + } + assert(sizes[0] <= NBD_MAX_BUFFER_SIZE); /* preferred - Hard-code to 4096 for now. * TODO: is blk_bs(blk)->bl.opt_transfer appropriate? */ - sizes[1] = 4096; + sizes[1] = MAX(4096, sizes[0]); /* maximum - At most 32M, but smaller as appropriate. */ sizes[2] = MIN(blk_get_max_transfer(exp->blk), NBD_MAX_BUFFER_SIZE); trace_nbd_negotiate_handle_info_block_size(sizes[0], sizes[1], sizes[2]); diff --git a/tests/qemu-iotests/223.out b/tests/qemu-iotests/223.out index 7828a44739..d5201b2356 100644 --- a/tests/qemu-iotests/223.out +++ b/tests/qemu-iotests/223.out @@ -41,7 +41,7 @@ exports available: 2 export: 'n' size: 4194304 flags: 0x4ef ( readonly flush fua trim zeroes df cache ) - min block: 512 + min block: 1 opt block: 4096 max block: 33554432 available meta contexts: 2 @@ -50,7 +50,7 @@ exports available: 2 export: 'n2' size: 4194304 flags: 0x4ed ( flush fua trim zeroes df cache ) - min block: 512 + min block: 1 opt block: 4096 max block: 33554432 available meta contexts: 2 diff --git a/tests/qemu-iotests/233.out b/tests/qemu-iotests/233.out index 5acbc13b54..9511b6ea65 100644 --- a/tests/qemu-iotests/233.out +++ b/tests/qemu-iotests/233.out @@ -38,7 +38,7 @@ exports available: 1 export: '' size: 67108864 flags: 0x4ed ( flush fua trim zeroes df cache ) - min block: 512 + min block: 1 opt block: 4096 max block: 33554432 available meta contexts: 1 diff --git a/tests/qemu-iotests/241.out b/tests/qemu-iotests/241.out index f22eabbf32..f481074a02 100644 --- a/tests/qemu-iotests/241.out +++ b/tests/qemu-iotests/241.out @@ -3,8 +3,9 @@ QA output created by 241 === Exporting unaligned raw image, natural alignment === size: 1024 - min block: 512 -[{ "start": 0, "length": 1024, "depth": 0, "zero": false, "data": true, "offset": OFFSET}] + min block: 1 +[{ "start": 0, "length": 1000, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, +{ "start": 1000, "length": 24, "depth": 0, "zero": true, "data": true, "offset": OFFSET}] 1 KiB (0x400) bytes allocated at offset 0 bytes (0x0) === Exporting unaligned raw image, forced server sector alignment === @@ -20,7 +21,8 @@ WARNING: Image format was not specified for '/home/eblake/qemu/tests/qemu-iotest === Exporting unaligned raw image, forced client sector alignment === size: 1024 - min block: 512 -[{ "start": 0, "length": 1024, "depth": 0, "zero": false, "data": true, "offset": OFFSET}] + min block: 1 +[{ "start": 0, "length": 1000, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, +{ "start": 1000, "length": 24, "depth": 0, "zero": true, "data": true, "offset": OFFSET}] 1 KiB (0x400) bytes allocated at offset 0 bytes (0x0) *** done |