From 8c32e69c668b7ba8bfe0f535e9056def9e9d64e9 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 12 Apr 2017 18:49:20 -0400 Subject: [PATCH] os/bluestore/KernelDevice: handle non-block-aligned backing file Fixes: http://tracker.ceph.com/issues/16644 Signed-off-by: Sage Weil --- src/os/bluestore/KernelDevice.cc | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/os/bluestore/KernelDevice.cc b/src/os/bluestore/KernelDevice.cc index d8b19a1e19522..0793be729161d 100644 --- a/src/os/bluestore/KernelDevice.cc +++ b/src/os/bluestore/KernelDevice.cc @@ -108,6 +108,18 @@ int KernelDevice::open(const string& p) derr << __func__ << " fstat got " << cpp_strerror(r) << dendl; goto out_fail; } + + // Operate as though the block size is 4 KB. The backing file + // blksize doesn't strictly matter except that some file systems may + // require a read/modify/write if we write something smaller than + // it. + block_size = cct->_conf->bdev_block_size; + if (block_size != (unsigned)st.st_blksize) { + dout(1) << __func__ << " backing device/file reports st_blksize " + << st.st_blksize << ", using bdev_block_size " + << block_size << " anyway" << dendl; + } + if (S_ISBLK(st.st_mode)) { int64_t s; r = get_block_device_size(fd_direct, &s); @@ -118,6 +130,7 @@ int KernelDevice::open(const string& p) } else { size = st.st_size; } + size &= ~(block_size); { char partition[PATH_MAX], devname[PATH_MAX]; @@ -132,17 +145,6 @@ int KernelDevice::open(const string& p) } } - // Operate as though the block size is 4 KB. The backing file - // blksize doesn't strictly matter except that some file systems may - // require a read/modify/write if we write something smaller than - // it. - block_size = cct->_conf->bdev_block_size; - if (block_size != (unsigned)st.st_blksize) { - dout(1) << __func__ << " backing device/file reports st_blksize " - << st.st_blksize << ", using bdev_block_size " - << block_size << " anyway" << dendl; - } - fs = FS::create_by_fd(fd_direct); assert(fs); -- 2.39.5