| From f05e67d99d168c211bdb15ee80111c7687e956a6 Mon Sep 17 00:00:00 2001 |
| From: Yufen Yu <yuyufen@huawei.com> |
| Date: Fri, 16 Nov 2018 15:08:39 -0800 |
| Subject: tmpfs: make lseek(SEEK_DATA/SEK_HOLE) return ENXIO with a negative |
| offset |
| |
| [ Upstream commit 1a413646931cb14442065cfc17561e50f5b5bb44 ] |
| |
| Other filesystems such as ext4, f2fs and ubifs all return ENXIO when |
| lseek (SEEK_DATA or SEEK_HOLE) requests a negative offset. |
| |
| man 2 lseek says |
| |
| : EINVAL whence is not valid. Or: the resulting file offset would be |
| : negative, or beyond the end of a seekable device. |
| : |
| : ENXIO whence is SEEK_DATA or SEEK_HOLE, and the file offset is beyond |
| : the end of the file. |
| |
| Make tmpfs return ENXIO under these circumstances as well. After this, |
| tmpfs also passes xfstests's generic/448. |
| |
| [akpm@linux-foundation.org: rewrite changelog] |
| Link: http://lkml.kernel.org/r/1540434176-14349-1-git-send-email-yuyufen@huawei.com |
| Signed-off-by: Yufen Yu <yuyufen@huawei.com> |
| Reviewed-by: Andrew Morton <akpm@linux-foundation.org> |
| Cc: Al Viro <viro@zeniv.linux.org.uk> |
| Cc: Hugh Dickins <hughd@google.com> |
| Cc: William Kucharski <william.kucharski@oracle.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| mm/shmem.c | 4 +--- |
| 1 file changed, 1 insertion(+), 3 deletions(-) |
| |
| diff --git a/mm/shmem.c b/mm/shmem.c |
| index 8e506a45a6ef..d902b413941a 100644 |
| --- a/mm/shmem.c |
| +++ b/mm/shmem.c |
| @@ -1818,9 +1818,7 @@ static loff_t shmem_file_llseek(struct file *file, loff_t offset, int whence) |
| mutex_lock(&inode->i_mutex); |
| /* We're holding i_mutex so we can access i_size directly */ |
| |
| - if (offset < 0) |
| - offset = -EINVAL; |
| - else if (offset >= inode->i_size) |
| + if (offset < 0 || offset >= inode->i_size) |
| offset = -ENXIO; |
| else { |
| start = offset >> PAGE_CACHE_SHIFT; |
| -- |
| 2.17.1 |
| |