Commit 48802c8a authored by Jeff Liu's avatar Jeff Liu Committed by Chris Mason

BTRFS: Fix lseek return value for error

The recent reworking of btrfs' lseek lead to incorrect
values being returned.  This adds checks for seeking
beyond EOF in SEEK_HOLE and makes sure the error
values come back correct.

Andi Kleen also sent in similar patches.
Signed-off-by: default avatarJie Liu <jeff.liu@oracle.com>
Reported-by: default avatarAndi Kleen <ak@linux.intel.com>
Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent 2cf4ce7c
...@@ -1817,6 +1817,11 @@ static loff_t btrfs_file_llseek(struct file *file, loff_t offset, int origin) ...@@ -1817,6 +1817,11 @@ static loff_t btrfs_file_llseek(struct file *file, loff_t offset, int origin)
goto out; goto out;
case SEEK_DATA: case SEEK_DATA:
case SEEK_HOLE: case SEEK_HOLE:
if (offset >= i_size_read(inode)) {
mutex_unlock(&inode->i_mutex);
return -ENXIO;
}
ret = find_desired_extent(inode, &offset, origin); ret = find_desired_extent(inode, &offset, origin);
if (ret) { if (ret) {
mutex_unlock(&inode->i_mutex); mutex_unlock(&inode->i_mutex);
...@@ -1825,11 +1830,11 @@ static loff_t btrfs_file_llseek(struct file *file, loff_t offset, int origin) ...@@ -1825,11 +1830,11 @@ static loff_t btrfs_file_llseek(struct file *file, loff_t offset, int origin)
} }
if (offset < 0 && !(file->f_mode & FMODE_UNSIGNED_OFFSET)) { if (offset < 0 && !(file->f_mode & FMODE_UNSIGNED_OFFSET)) {
ret = -EINVAL; offset = -EINVAL;
goto out; goto out;
} }
if (offset > inode->i_sb->s_maxbytes) { if (offset > inode->i_sb->s_maxbytes) {
ret = -EINVAL; offset = -EINVAL;
goto out; goto out;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment