diff --git a/src/server/client.c b/src/server/client.c index 5e9e877..3a72cb9 100644 --- a/src/server/client.c +++ b/src/server/client.c @@ -480,8 +480,8 @@ void client_reply_to_write( struct client* client, struct nbd_request request ) // Only flush if FUA is set if (request.flags & CMD_FLAG_FUA) { - /* multiple of 4K page size */ - uint64_t from_rounded = request.from & (~0xfff); + /* multiple of page size */ + uint64_t from_rounded = request.from & (~(sysconf(_SC_PAGE_SIZE)-1)); uint64_t len_rounded = request.len + (request.from - from_rounded); debug("Calling msync from=%"PRIu64", len=%"PRIu64"",from_rounded, len_rounded); diff --git a/tests/acceptance/environment.rb b/tests/acceptance/environment.rb index 9697227..f350525 100644 --- a/tests/acceptance/environment.rb +++ b/tests/acceptance/environment.rb @@ -6,7 +6,8 @@ class Environment :port1, :port2, :nbd1, :nbd2, :file1, :file2) def initialize - @blocksize = 1024 + # Make sure we have a few pages of memory so we can test msync offsets + @blocksize = Integer(`getconf PAGE_SIZE`) * 4 @filename1 = "/tmp/.flexnbd.test.#{$PROCESS_ID}.#{Time.now.to_i}.1" @filename2 = "/tmp/.flexnbd.test.#{$PROCESS_ID}.#{Time.now.to_i}.2" @ip = '127.0.0.1' diff --git a/tests/acceptance/test_serve_mode.rb b/tests/acceptance/test_serve_mode.rb index b52eb1a..a422da1 100644 --- a/tests/acceptance/test_serve_mode.rb +++ b/tests/acceptance/test_serve_mode.rb @@ -110,7 +110,6 @@ class TestServeMode < Test::Unit::TestCase def test_flush_is_accepted connect_to_server do |client| - # Start with a file of all-zeroes. client.flush rsp = client.read_response assert_equal FlexNBD::REPLY_MAGIC, rsp[:magic] @@ -119,12 +118,21 @@ class TestServeMode < Test::Unit::TestCase end def test_write_with_fua_is_accepted + page_size = Integer(`getconf PAGESIZE`) connect_to_server do |client| - # Start with a file of all-zeroes. - client.write_with_fua(0, "\x00" * @env.file1.size) + # Write somewhere in the third page + pos = page_size * 3 + 100 + client.write_with_fua(pos, "\x00" * 33) rsp = client.read_response assert_equal FlexNBD::REPLY_MAGIC, rsp[:magic] assert_equal 0, rsp[:error] + # TODO: test offset and length + # Should be rounded to the third page + # assert_equal(msync_offset, page_size *3) + + # Should be 100 + 33, as we've started writing 100 bytes into a page, for + # 33 bytes + # assert_equal(msync_length, 133) end end end