mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-10 15:10:38 +00:00
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 0fd97ccf4. Reported-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com> Reported-by: Badari Pulavarty <pbadari@us.ibm.com> Tested-by: Badari Pulavarty <pbadari@us.ibm.com> Cc: stable@vger.kernel.org Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
parent
1d19f7800d
commit
21363ca873
@ -153,6 +153,7 @@ static int fd_configure_device(struct se_device *dev)
|
||||
struct request_queue *q = bdev_get_queue(inode->i_bdev);
|
||||
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
|
||||
* one (1) logical sector from underlying struct block_device
|
||||
@ -199,6 +200,7 @@ static int fd_configure_device(struct se_device *dev)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
fd_dev->fd_block_size = FD_BLOCKSIZE;
|
||||
/*
|
||||
* Limit UNMAP emulation to 8k Number of LBAs (NoLB)
|
||||
*/
|
||||
@ -217,9 +219,7 @@ static int fd_configure_device(struct se_device *dev)
|
||||
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_BLOCKSIZE;
|
||||
dev->dev_attrib.hw_block_size = fd_dev->fd_block_size;
|
||||
dev->dev_attrib.hw_max_sectors = FD_MAX_SECTORS;
|
||||
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)
|
||||
* to handle underlying block_device resize operations.
|
||||
*/
|
||||
if (S_ISBLK(i->i_mode))
|
||||
dev_size = (i_size_read(i) - fd_dev->fd_block_size);
|
||||
dev_size = i_size_read(i);
|
||||
else
|
||||
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 = {
|
||||
|
Loading…
x
Reference in New Issue
Block a user