diff options
author | Nicholas Bellinger <nab@linux-iscsi.org> | 2012-05-16 16:05:26 -0700 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2012-05-16 16:05:26 -0700 |
commit | 43e2fe43aa2a469c641df7673c9f451731eec72b (patch) | |
tree | a895bc1ffd6eeb1ecf34de347323bc91517063d6 | |
parent | a574c39b560d6cbb8524f4fd47a5c2976ad77b77 (diff) | |
download | lio-core-43e2fe43aa2a469c641df7673c9f451731eec72b.tar.gz |
target: Fix bug in handling of FILEIO + block_device resize ops
This patch fixes a bug in the handling of FILEIO w/ underlying block_device
resize operations where the original fd_dev->fd_dev_size was incorrectly being
used in fd_get_blocks() for READ_CAPACITY response payloads.
It changes fd_get_blocks() to always set fd_dev->fd_dev_size based on the
current inode size when an underlying block_device is being referenced.
Cc: Christoph Hellwig <hch@lst.de>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
-rw-r--r-- | drivers/target/target_core_file.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c index bbcedcfc068aa..077b348f5b69d 100644 --- a/drivers/target/target_core_file.c +++ b/drivers/target/target_core_file.c @@ -570,10 +570,18 @@ static u32 fd_get_device_type(struct se_device *dev) static sector_t fd_get_blocks(struct se_device *dev) { struct fd_dev *fd_dev = dev->dev_ptr; - unsigned long long blocks_long = div_u64(fd_dev->fd_dev_size, - dev->se_sub_dev->se_dev_attrib.block_size); + struct file *f = fd_dev->fd_file; + struct inode *i = f->f_mapping->host; + /* + * When using a file that references an underlying struct block_device, + * ensure that fd_dev->fd_dev_size is always based on the current inode + * size in order to handle underlying block_device resize operations. + */ + if (S_ISBLK(i->i_mode)) + fd_dev->fd_dev_size = (i_size_read(i) - fd_dev->fd_block_size); - return blocks_long; + return div_u64(fd_dev->fd_dev_size, + dev->se_sub_dev->se_dev_attrib.block_size); } static struct se_subsystem_api fileio_template = { |