Message ID | 4E5B6055.1080807@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index e7872e4..2c126d0 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c @@ -1813,6 +1813,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 >= inode->i_size) { + mutex_unlock(&inode->i_mutex); + return -ENXIO; + } + ret = find_desired_extent(inode, &offset, origin); if (ret) {
Hello, In btrfs_file_llseek(), if the offset < 0 or offset > inode->i_sb->s_maxbytes, we should return -EINVAL rather than offset. Also, if the offset >= inode->i_size for SEEK_DATA or SEEK_HOLE, return -ENXIO is ok IMHO. Signed-off-by: Jie Liu <jeff.liu@oracle.com> mutex_unlock(&inode->i_mutex); @@ -1820,14 +1825,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; - goto out; - } - if (offset > inode->i_sb->s_maxbytes) { - ret = -EINVAL; - goto out; - } + if (offset < 0 && !(file->f_mode & FMODE_UNSIGNED_OFFSET)) + return -EINVAL; + + if (offset > inode->i_sb->s_maxbytes) + return -EINVAL; /* Special lock needed here? */ if (offset != file->f_pos) { -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html