Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -1817,6 +1817,11 @@ static loff_t btrfs_file_llseek(struct file *file, loff_t offset, int origin)
		goto out;
	case SEEK_DATA:
	case SEEK_HOLE:
		if (offset >= i_size_read(inode)) {
			mutex_unlock(&inode->i_mutex);
			return -ENXIO;
		}

		ret = find_desired_extent(inode, &offset, origin);
		if (ret) {
			mutex_unlock(&inode->i_mutex);
@@ -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)) {
		ret = -EINVAL;
		offset = -EINVAL;
		goto out;
	}
	if (offset > inode->i_sb->s_maxbytes) {
		ret = -EINVAL;
		offset = -EINVAL;
		goto out;
	}