aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Bellinger <nab@linux-iscsi.org>2012-05-16 16:05:26 -0700
committerNicholas Bellinger <nab@linux-iscsi.org>2012-05-16 16:05:26 -0700
commit43e2fe43aa2a469c641df7673c9f451731eec72b (patch)
treea895bc1ffd6eeb1ecf34de347323bc91517063d6
parenta574c39b560d6cbb8524f4fd47a5c2976ad77b77 (diff)
downloadlio-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.c14
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 = {