mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-16 17:57:38 -04:00
tools/nolibc: fold llseek fallback into lseek()
Align the implementation of the fallback handling inside sys_lseek() with the rest of nolibc. Signed-off-by: Thomas Weißschuh <linux@weissschuh.net> Acked-by: Willy Tarreau <w@1wt.eu> Link: https://lore.kernel.org/r/20250821-nolibc-enosys-v1-5-4b63f2caaa89@weissschuh.net
This commit is contained in:
@@ -594,41 +594,27 @@ off_t sys_lseek(int fd, off_t offset, int whence)
|
||||
#if defined(__NR_lseek)
|
||||
return my_syscall3(__NR_lseek, fd, offset, whence);
|
||||
#else
|
||||
return __nolibc_enosys(__func__, fd, offset, whence);
|
||||
#endif
|
||||
}
|
||||
__kernel_loff_t loff = 0;
|
||||
off_t result;
|
||||
int ret;
|
||||
|
||||
static __attribute__((unused))
|
||||
int sys_llseek(int fd, unsigned long offset_high, unsigned long offset_low,
|
||||
__kernel_loff_t *result, int whence)
|
||||
{
|
||||
#if defined(__NR_llseek)
|
||||
return my_syscall5(__NR_llseek, fd, offset_high, offset_low, result, whence);
|
||||
#else
|
||||
return __nolibc_enosys(__func__, fd, offset_high, offset_low, result, whence);
|
||||
/* Only exists on 32bit where nolibc off_t is also 32bit */
|
||||
ret = my_syscall5(__NR_llseek, fd, 0, offset, &loff, whence);
|
||||
if (ret < 0)
|
||||
result = ret;
|
||||
else if (loff != (off_t)loff)
|
||||
result = -EOVERFLOW;
|
||||
else
|
||||
result = loff;
|
||||
|
||||
return result;
|
||||
#endif
|
||||
}
|
||||
|
||||
static __attribute__((unused))
|
||||
off_t lseek(int fd, off_t offset, int whence)
|
||||
{
|
||||
__kernel_loff_t loff = 0;
|
||||
off_t result;
|
||||
int ret;
|
||||
|
||||
result = sys_lseek(fd, offset, whence);
|
||||
if (result == -ENOSYS) {
|
||||
/* Only exists on 32bit where nolibc off_t is also 32bit */
|
||||
ret = sys_llseek(fd, 0, offset, &loff, whence);
|
||||
if (ret < 0)
|
||||
result = ret;
|
||||
else if (loff != (off_t)loff)
|
||||
result = -EOVERFLOW;
|
||||
else
|
||||
result = loff;
|
||||
}
|
||||
|
||||
return __sysret(result);
|
||||
return __sysret(sys_lseek(fd, offset, whence));
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user