]> rtime.felk.cvut.cz Git - zynq/linux.git/commitdiff
target/file: fix inclusive vfs_fsync_range() end
authorZach Brown <zab@zabbo.net>
Mon, 6 Oct 2014 23:40:13 +0000 (16:40 -0700)
committerNicholas Bellinger <nab@linux-iscsi.org>
Wed, 8 Oct 2014 06:05:07 +0000 (23:05 -0700)
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>
drivers/target/target_core_file.c

index ab2c53b63cc3bc6084f546ffa7787b7b0842f990..72c83d98662bb7117d3911ab931940990a79f82d 100644 (file)
@@ -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);
                }