Commit 21363ca8 authored by Nicholas Bellinger's avatar Nicholas Bellinger

target/file: Fix off-by-one READ_CAPACITY bug for !S_ISBLK export

This patch fixes a bug where FILEIO was incorrectly reporting the number
of logical blocks (+ 1) when using non struct block_device export mode.

It changes fd_get_blocks() to follow all other backend ->get_blocks() cases,
and reduces the calculated dev_size by one dev->dev_attrib.block_size
number of bytes, and also fixes initial fd_block_size assignment at
fd_configure_device() time introduced in commit 0fd97ccf.
Reported-by: default avatarWenchao Xia <xiawenc@linux.vnet.ibm.com>
Reported-by: default avatarBadari Pulavarty <pbadari@us.ibm.com>
Tested-by: default avatarBadari Pulavarty <pbadari@us.ibm.com>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent 1d19f780
...@@ -153,6 +153,7 @@ static int fd_configure_device(struct se_device *dev) ...@@ -153,6 +153,7 @@ static int fd_configure_device(struct se_device *dev)
struct request_queue *q = bdev_get_queue(inode->i_bdev); struct request_queue *q = bdev_get_queue(inode->i_bdev);
unsigned long long dev_size; unsigned long long dev_size;
fd_dev->fd_block_size = bdev_logical_block_size(inode->i_bdev);
/* /*
* Determine the number of bytes from i_size_read() minus * Determine the number of bytes from i_size_read() minus
* one (1) logical sector from underlying struct block_device * one (1) logical sector from underlying struct block_device
...@@ -199,6 +200,7 @@ static int fd_configure_device(struct se_device *dev) ...@@ -199,6 +200,7 @@ static int fd_configure_device(struct se_device *dev)
goto fail; goto fail;
} }
fd_dev->fd_block_size = FD_BLOCKSIZE;
/* /*
* Limit UNMAP emulation to 8k Number of LBAs (NoLB) * Limit UNMAP emulation to 8k Number of LBAs (NoLB)
*/ */
...@@ -217,9 +219,7 @@ static int fd_configure_device(struct se_device *dev) ...@@ -217,9 +219,7 @@ static int fd_configure_device(struct se_device *dev)
dev->dev_attrib.max_write_same_len = 0x1000; dev->dev_attrib.max_write_same_len = 0x1000;
} }
fd_dev->fd_block_size = dev->dev_attrib.hw_block_size; dev->dev_attrib.hw_block_size = fd_dev->fd_block_size;
dev->dev_attrib.hw_block_size = FD_BLOCKSIZE;
dev->dev_attrib.hw_max_sectors = FD_MAX_SECTORS; dev->dev_attrib.hw_max_sectors = FD_MAX_SECTORS;
dev->dev_attrib.hw_queue_depth = FD_MAX_DEVICE_QUEUE_DEPTH; dev->dev_attrib.hw_queue_depth = FD_MAX_DEVICE_QUEUE_DEPTH;
...@@ -694,11 +694,12 @@ static sector_t fd_get_blocks(struct se_device *dev) ...@@ -694,11 +694,12 @@ static sector_t fd_get_blocks(struct se_device *dev)
* to handle underlying block_device resize operations. * to handle underlying block_device resize operations.
*/ */
if (S_ISBLK(i->i_mode)) if (S_ISBLK(i->i_mode))
dev_size = (i_size_read(i) - fd_dev->fd_block_size); dev_size = i_size_read(i);
else else
dev_size = fd_dev->fd_dev_size; dev_size = fd_dev->fd_dev_size;
return div_u64(dev_size, dev->dev_attrib.block_size); return div_u64(dev_size - dev->dev_attrib.block_size,
dev->dev_attrib.block_size);
} }
static struct sbc_ops fd_sbc_ops = { static struct sbc_ops fd_sbc_ops = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment