]> Git Repo - linux.git/commitdiff
BTRFS: Fix lseek return value for error
authorJeff Liu <[email protected]>
Sun, 18 Sep 2011 14:34:02 +0000 (10:34 -0400)
committerChris Mason <[email protected]>
Sun, 18 Sep 2011 14:34:02 +0000 (10:34 -0400)
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: Jie Liu <[email protected]>
Reported-by: Andi Kleen <[email protected]>
Signed-off-by: Chris Mason <[email protected]>
fs/btrfs/file.c

index 3c3abff731a7efb3ca4bc696a077b4d384bbfccb..a381cd22f5184e83401f872bcd74528ecdb80e69 100644 (file)
@@ -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;
        }
 
This page took 0.062014 seconds and 4 git commands to generate.