diff options
author | Zach Brown <zab@zabbo.net> | 2014-10-06 19:40:13 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2014-10-08 02:05:07 -0400 |
commit | 62d3ab49b8a5438d11a11605ea1a6d2fe0118f32 (patch) | |
tree | 8a912af6a32f35c460213f037fa52df70e877283 /drivers/target/target_core_file.c | |
parent | 0d0f660d882c1c02748ced13966a2413aa5d6cc2 (diff) |
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/target_core_file.c')
-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) | |||
415 | } else { | 415 | } else { |
416 | start = cmd->t_task_lba * dev->dev_attrib.block_size; | 416 | start = cmd->t_task_lba * dev->dev_attrib.block_size; |
417 | if (cmd->data_length) | 417 | if (cmd->data_length) |
418 | end = start + cmd->data_length; | 418 | end = start + cmd->data_length - 1; |
419 | else | 419 | else |
420 | end = LLONG_MAX; | 420 | end = LLONG_MAX; |
421 | } | 421 | } |
@@ -680,7 +680,12 @@ fd_execute_rw(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, | |||
680 | struct fd_dev *fd_dev = FD_DEV(dev); | 680 | struct fd_dev *fd_dev = FD_DEV(dev); |
681 | loff_t start = cmd->t_task_lba * | 681 | loff_t start = cmd->t_task_lba * |
682 | dev->dev_attrib.block_size; | 682 | dev->dev_attrib.block_size; |
683 | loff_t end = start + cmd->data_length; | 683 | loff_t end; |
684 | |||
685 | if (cmd->data_length) | ||
686 | end = start + cmd->data_length - 1; | ||
687 | else | ||
688 | end = LLONG_MAX; | ||
684 | 689 | ||
685 | vfs_fsync_range(fd_dev->fd_file, start, end, 1); | 690 | vfs_fsync_range(fd_dev->fd_file, start, end, 1); |
686 | } | 691 | } |