diff options
author | Zach Brown <zab@zabbo.net> | 2014-10-06 16:40:13 -0700 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2014-10-07 23:05:07 -0700 |
commit | 62d3ab49b8a5438d11a11605ea1a6d2fe0118f32 (patch) | |
tree | 8a912af6a32f35c460213f037fa52df70e877283 /drivers/target | |
parent | 0d0f660d882c1c02748ced13966a2413aa5d6cc2 (diff) | |
download | linux-62d3ab49b8a5438d11a11605ea1a6d2fe0118f32.tar.bz2 |
target/file: fix inclusive vfs_fsync_range() end
Both of the file target's calls to vfs_fsync_range() got the end offset
off by one. The range is inclusive, not exclusive. It would sync a bit
more data than was required.
The sync path already tested the length of the range and fell back to
LLONG_MAX so I copied that pattern in the rw path.
This is untested. I found the errors by inspection while following other
code.
Signed-off-by: Zach Brown <zab@zabbo.net>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target')
-rw-r--r-- | drivers/target/target_core_file.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c index ab2c53b63cc3..72c83d98662b 100644 --- a/drivers/target/target_core_file.c +++ b/drivers/target/target_core_file.c @@ -415,7 +415,7 @@ fd_execute_sync_cache(struct se_cmd *cmd) } else { start = cmd->t_task_lba * dev->dev_attrib.block_size; if (cmd->data_length) - end = start + cmd->data_length; + end = start + cmd->data_length - 1; else end = LLONG_MAX; } @@ -680,7 +680,12 @@ fd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, struct fd_dev *fd_dev = FD_DEV(dev); loff_t start = cmd->t_task_lba * dev->dev_attrib.block_size; - loff_t end = start + cmd->data_length; + loff_t end; + + if (cmd->data_length) + end = start + cmd->data_length - 1; + else + end = LLONG_MAX; vfs_fsync_range(fd_dev->fd_file, start, end, 1); } |