Module Name:    src
Committed By:   christos
Date:           Sat Jul 29 15:04:29 UTC 2023

Modified Files:
        src/sys/compat/linux/arch/aarch64: syscalls.master
        src/sys/compat/linux/arch/alpha: syscalls.master
        src/sys/compat/linux/arch/amd64: syscalls.master
        src/sys/compat/linux/arch/arm: syscalls.master
        src/sys/compat/linux/arch/i386: syscalls.master
        src/sys/compat/linux/arch/m68k: syscalls.master
        src/sys/compat/linux/arch/mips: syscalls.master
        src/sys/compat/linux/arch/powerpc: syscalls.master
        src/sys/compat/linux/common: linux_file64.c linux_misc.c

Log Message:
Add/fix statx, readahead, close_range. From GSoC 2023 by Theodore Preduta


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/compat/linux/arch/aarch64/syscalls.master
cvs rdiff -u -r1.103 -r1.104 src/sys/compat/linux/arch/alpha/syscalls.master
cvs rdiff -u -r1.69 -r1.70 src/sys/compat/linux/arch/amd64/syscalls.master
cvs rdiff -u -r1.76 -r1.77 src/sys/compat/linux/arch/arm/syscalls.master
cvs rdiff -u -r1.131 -r1.132 src/sys/compat/linux/arch/i386/syscalls.master
cvs rdiff -u -r1.102 -r1.103 src/sys/compat/linux/arch/m68k/syscalls.master
cvs rdiff -u -r1.75 -r1.76 src/sys/compat/linux/arch/mips/syscalls.master
cvs rdiff -u -r1.81 -r1.82 src/sys/compat/linux/arch/powerpc/syscalls.master
cvs rdiff -u -r1.67 -r1.68 src/sys/compat/linux/common/linux_file64.c
cvs rdiff -u -r1.259 -r1.260 src/sys/compat/linux/common/linux_misc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/compat/linux/arch/aarch64/syscalls.master
diff -u src/sys/compat/linux/arch/aarch64/syscalls.master:1.8 src/sys/compat/linux/arch/aarch64/syscalls.master:1.9
--- src/sys/compat/linux/arch/aarch64/syscalls.master:1.8	Sat Jul 29 02:47:26 2023
+++ src/sys/compat/linux/arch/aarch64/syscalls.master	Sat Jul 29 11:04:28 2023
@@ -1,4 +1,4 @@
-	$NetBSD: syscalls.master,v 1.8 2023/07/29 06:47:26 rin Exp $
+	$NetBSD: syscalls.master,v 1.9 2023/07/29 15:04:28 christos Exp $
 
 ;	@(#)syscalls.master	8.1 (Berkeley) 7/19/93
 
@@ -433,7 +433,8 @@
 			    const struct linux_msghdr *msg, int flags); }
 212	STD		{ ssize_t|linux_sys||recvmsg(int s, \
 			    struct linux_msghdr *msg, int flags); }
-213	UNIMPL		readahead
+213	STD		{ ssize_t|linux_sys||readahead(int fd, off_t offset, \
+			    size_t count); }
 214	STD		{ int|linux_sys||brk(char *nsize); }
 215	NOARGS		{ int|sys||munmap(void *addr, size_t len); }
 216	STD		{ void *|linux_sys||mremap(void *old_address, \
@@ -675,7 +676,8 @@
 433	UNIMPL		fspick
 434	UNIMPL		pidfd_open
 435	UNIMPL		clone3
-436	UNIMPL
+436	STD		{ int|linux_sys||close_range(unsigned int first, \
+			    unsigned int last, unsigned int flags); }
 437	UNIMPL		openat2
 438	UNIMPL		pidfd_getfd
 439	UNIMPL		faccessat2

Index: src/sys/compat/linux/arch/alpha/syscalls.master
diff -u src/sys/compat/linux/arch/alpha/syscalls.master:1.103 src/sys/compat/linux/arch/alpha/syscalls.master:1.104
--- src/sys/compat/linux/arch/alpha/syscalls.master:1.103	Fri Jul 28 15:01:11 2023
+++ src/sys/compat/linux/arch/alpha/syscalls.master	Sat Jul 29 11:04:28 2023
@@ -1,4 +1,4 @@
-	$NetBSD: syscalls.master,v 1.103 2023/07/28 19:01:11 christos Exp $
+	$NetBSD: syscalls.master,v 1.104 2023/07/29 15:04:28 christos Exp $
 ;
 ;	@(#)syscalls.master	8.1 (Berkeley) 7/19/93
 
@@ -614,7 +614,8 @@
 377	STD		{ int|linux_sys||getdents64(int fd, \
 			    struct linux_dirent64 *dent, unsigned int count); }
 378	NOARGS		{ pid_t|linux_sys||gettid(void); }
-379	UNIMPL		readahead
+379	STD		{ ssize_t|linux_sys||readahead(int fd, off_t offset, \
+			    size_t count); }
 380	UNIMPL		/* unused */
 381	STD		{ int|linux_sys||tkill(int tid, int sig); }
 382	STD		{ int|linux_sys||setxattr(char *path, char *name, \
@@ -830,7 +831,9 @@
 519	UNIMPL
 520	UNIMPL
 521	UNIMPL
-522	UNIMPL
+522     STD		{ int|linux_sys||statx(int fd, const char *path, \
+			    int flag, unsigned int mask, \
+			    struct linux_statx *sp); }
 523	UNIMPL
 524	UNIMPL
 525	UNIMPL
@@ -854,7 +857,8 @@
 543	UNIMPL
 544	UNIMPL
 545	UNIMPL
-546	UNIMPL
+546	STD		{ int|linux_sys||close_range(unsigned int first, \
+			    unsigned int last, unsigned int flags); }
 547	UNIMPL
 548	UNIMPL
 549	UNIMPL

Index: src/sys/compat/linux/arch/amd64/syscalls.master
diff -u src/sys/compat/linux/arch/amd64/syscalls.master:1.69 src/sys/compat/linux/arch/amd64/syscalls.master:1.70
--- src/sys/compat/linux/arch/amd64/syscalls.master:1.69	Fri Jul 28 14:19:00 2023
+++ src/sys/compat/linux/arch/amd64/syscalls.master	Sat Jul 29 11:04:28 2023
@@ -1,4 +1,4 @@
-	$NetBSD: syscalls.master,v 1.69 2023/07/28 18:19:00 christos Exp $
+	$NetBSD: syscalls.master,v 1.70 2023/07/29 15:04:28 christos Exp $
 
 ;	@(#)syscalls.master	8.1 (Berkeley) 7/19/93
 
@@ -374,7 +374,8 @@
 184	UNIMPL		tuxcall
 185	UNIMPL		security
 186	STD		{ pid_t|linux_sys||gettid(void); }
-187	UNIMPL		readahead
+187	STD		{ ssize_t|linux_sys||readahead(int fd, off_t offset, \
+			    size_t count); }
 188	STD		{ int|linux_sys||setxattr(char *path, char *name, \
 			    void *value, size_t size, int flags); }
 189	STD		{ int|linux_sys||lsetxattr(char *path, char *name, \
@@ -593,7 +594,9 @@
 329	UNIMPL		pkey_mprotect
 330	UNIMPL		pkey_alloc
 331	UNIMPL		pkey_free
-332	UNIMPL		statx
+332     STD		{ int|linux_sys||statx(int fd, const char *path, \
+			    int flag, unsigned int mask, \
+			    struct linux_statx *sp); }
 333	UNIMPL		io_pgetevents
 334	UNIMPL		rseq
 335	UNIMPL
@@ -697,7 +700,8 @@
 433	UNIMPL		fspick
 434	UNIMPL		pidfd_open
 435	UNIMPL		clone3
-436	UNIMPL		close_range
+436	STD		{ int|linux_sys||close_range(unsigned int first, \
+			    unsigned int last, unsigned int flags); }
 437	UNIMPL		openat2
 438	UNIMPL		pidfd_getfd
 439	UNIMPL		faccessat2

Index: src/sys/compat/linux/arch/arm/syscalls.master
diff -u src/sys/compat/linux/arch/arm/syscalls.master:1.76 src/sys/compat/linux/arch/arm/syscalls.master:1.77
--- src/sys/compat/linux/arch/arm/syscalls.master:1.76	Fri Jul 28 15:01:11 2023
+++ src/sys/compat/linux/arch/arm/syscalls.master	Sat Jul 29 11:04:28 2023
@@ -1,4 +1,4 @@
-	$NetBSD: syscalls.master,v 1.76 2023/07/28 19:01:11 christos Exp $
+	$NetBSD: syscalls.master,v 1.77 2023/07/29 15:04:28 christos Exp $
 
 ; Derived from sys/compat/linux/arch/*/syscalls.master
 ; and from Linux 2.4.12 arch/arm/kernel/calls.S
@@ -386,7 +386,8 @@
 222	UNIMPL		/* for tux */
 223	UNIMPL		/* unused */
 224	NOARGS		{ pid_t|linux_sys||gettid(void); }
-225	UNIMPL		readahead
+225	STD		{ ssize_t|linux_sys||readahead(int fd, off_t offset, \
+			    size_t count); }
 226	STD		{ int|linux_sys||setxattr(char *path, char *name, \
 			    void *value, size_t size, int flags); }
 227	STD		{ int|linux_sys||lsetxattr(char *path, char *name, \
@@ -644,7 +645,9 @@
 394	UNIMPL
 395	UNIMPL
 396	UNIMPL
-397	UNIMPL
+397     STD		{ int|linux_sys||statx(int fd, const char *path, \
+			    int flag, unsigned int mask, \
+			    struct linux_statx *sp); }
 398	UNIMPL
 399	UNIMPL
 400	UNIMPL
@@ -683,7 +686,8 @@
 433	UNIMPL
 434	UNIMPL
 435	UNIMPL
-436	UNIMPL
+436	STD		{ int|linux_sys||close_range(unsigned int first, \
+			    unsigned int last, unsigned int flags); }
 437	UNIMPL
 438	UNIMPL
 439	UNIMPL

Index: src/sys/compat/linux/arch/i386/syscalls.master
diff -u src/sys/compat/linux/arch/i386/syscalls.master:1.131 src/sys/compat/linux/arch/i386/syscalls.master:1.132
--- src/sys/compat/linux/arch/i386/syscalls.master:1.131	Fri Jul 28 15:01:11 2023
+++ src/sys/compat/linux/arch/i386/syscalls.master	Sat Jul 29 11:04:28 2023
@@ -1,4 +1,4 @@
-	$NetBSD: syscalls.master,v 1.131 2023/07/28 19:01:11 christos Exp $
+	$NetBSD: syscalls.master,v 1.132 2023/07/29 15:04:28 christos Exp $
 
 ;	@(#)syscalls.master	8.1 (Berkeley) 7/19/93
 
@@ -383,7 +383,8 @@
 222	UNIMPL		/* unused */
 223	UNIMPL		/* unused */
 224	NOARGS		{ pid_t|linux_sys||gettid(void); }
-225	UNIMPL		readahead
+225	STD		{ ssize_t|linux_sys||readahead(int fd, off_t offset, \
+			    size_t count); }
 226	STD		{ int|linux_sys||setxattr(char *path, char *name, \
 			    void *value, size_t size, int flags); }
 227	STD		{ int|linux_sys||lsetxattr(char *path, char *name, \
@@ -622,7 +623,9 @@
 394	UNIMPL		semctl
 395	UNIMPL		shmget
 396	UNIMPL		shmctl
-397	UNIMPL		shmat
+397     STD		{ int|linux_sys||statx(int fd, const char *path, \
+			    int flag, unsigned int mask, \
+			    struct linux_statx *sp); }
 398	UNIMPL		shmdt
 399	UNIMPL		msgget
 400	UNIMPL		msgsnd
@@ -661,7 +664,8 @@
 433	UNIMPL		fspick
 434	UNIMPL		pidfd_open
 435	UNIMPL		clone3
-436	UNIMPL		close_range
+436	STD		{ int|linux_sys||close_range(unsigned int first, \
+			    unsigned int last, unsigned int flags); }
 437	UNIMPL		openat2
 438	UNIMPL		pidfd_getfd
 439	UNIMPL		faccessat2

Index: src/sys/compat/linux/arch/m68k/syscalls.master
diff -u src/sys/compat/linux/arch/m68k/syscalls.master:1.102 src/sys/compat/linux/arch/m68k/syscalls.master:1.103
--- src/sys/compat/linux/arch/m68k/syscalls.master:1.102	Fri Jul 28 15:01:11 2023
+++ src/sys/compat/linux/arch/m68k/syscalls.master	Sat Jul 29 11:04:29 2023
@@ -1,4 +1,4 @@
-	$NetBSD: syscalls.master,v 1.102 2023/07/28 19:01:11 christos Exp $
+	$NetBSD: syscalls.master,v 1.103 2023/07/29 15:04:29 christos Exp $
 
 ;	@(#)syscalls.master	8.1 (Berkeley) 7/19/93
 
@@ -428,7 +428,8 @@
 237	NOARGS		{ int|sys||mincore(void *addr, size_t len, char *vec); }
 238	NOARGS		{ int|sys||madvise(void *addr, size_t len, int behav); }
 239	STD		{ int|linux_sys||fcntl64(int fd, int cmd, void *arg); }
-240	UNIMPL		readahead
+240	STD		{ ssize_t|linux_sys||readahead(int fd, off_t offset, \
+			    size_t count); }
 241	UNIMPL		io_setup
 242	UNIMPL		io_destroy
 243	UNIMPL		io_getevents
@@ -631,7 +632,9 @@
 376	UNIMPL		copy_file_range
 377	UNIMPL		preadv2
 378	UNIMPL		pwritev2
-379	UNIMPL
+379     STD		{ int|linux_sys||statx(int fd, const char *path, \
+			    int flag, unsigned int mask, \
+			    struct linux_statx *sp); }
 380	UNIMPL
 381	UNIMPL
 382	UNIMPL
@@ -688,7 +691,8 @@
 433	UNIMPL
 434	UNIMPL
 435	UNIMPL
-436	UNIMPL
+436	STD		{ int|linux_sys||close_range(unsigned int first, \
+			    unsigned int last, unsigned int flags); }
 437	UNIMPL
 438	UNIMPL
 439	UNIMPL

Index: src/sys/compat/linux/arch/mips/syscalls.master
diff -u src/sys/compat/linux/arch/mips/syscalls.master:1.75 src/sys/compat/linux/arch/mips/syscalls.master:1.76
--- src/sys/compat/linux/arch/mips/syscalls.master:1.75	Fri Jul 28 15:01:11 2023
+++ src/sys/compat/linux/arch/mips/syscalls.master	Sat Jul 29 11:04:29 2023
@@ -1,4 +1,4 @@
-	$NetBSD: syscalls.master,v 1.75 2023/07/28 19:01:11 christos Exp $  
+	$NetBSD: syscalls.master,v 1.76 2023/07/29 15:04:29 christos Exp $  
 
 ;	@(#)syscalls.master	8.1 (Berkeley) 7/19/93
 
@@ -389,7 +389,8 @@
 			    int cmd, void *arg); }
 221	UNIMPL		/* reserved */
 222	NOARGS		{ pid_t|linux_sys||gettid(void); }
-223	UNIMPL		readahead
+223	STD		{ ssize_t|linux_sys||readahead(int fd, off_t offset, \
+			    size_t count); }
 224	STD		{ int|linux_sys||setxattr(char *path, char *name, \
 			    void *value, size_t size, int flags); }
 225	STD		{ int|linux_sys||lsetxattr(char *path, char *name, \
@@ -592,21 +593,24 @@
 350	UNIMPL		sched_setattr
 351	UNIMPL		sched_getattr
 352	UNIMPL		renameat2
-353	UNIMPL		seccomp
-354	NOARGS		{ ssize_t|sys||getrandom(void *buf, size_t buflen, \
+353	NOARGS		{ ssize_t|sys||getrandom(void *buf, size_t buflen, \
 			    unsigned int flags); }
-355	UNIMPL		memfd_create
-356	UNIMPL		bpf
-357	UNIMPL		execveat
-358	UNIMPL		userfaultfd
-359	UNIMPL		membarrier
-360	UNIMPL		mlock2
-361	UNIMPL		copy_file_range
-362	UNIMPL		preadv2
-363	UNIMPL		pwritev2
-364	UNIMPL		pkey_mprotect
-365	UNIMPL		pkey_alloc
-366	UNIMPL		pkey_free
+354	STD		{ int|linux_sys||memfd_create(const char *name, \
+			    unsigned int flags); }
+355	UNIMPL		bpf
+356	UNIMPL		execveat
+357	UNIMPL		userfaultfd
+358	UNIMPL		membarrier
+369	UNIMPL		mlock2
+360	UNIMPL		copy_file_range
+361	UNIMPL		preadv2
+362	UNIMPL		pwritev2
+363	UNIMPL		pkey_mprotect
+364	UNIMPL		pkey_alloc
+365	UNIMPL		pkey_free
+366     STD		{ int|linux_sys||statx(int fd, const char *path, \
+			    int flag, unsigned int mask, \
+			    struct linux_statx *sp); }
 367	UNIMPL
 368	UNIMPL
 369	UNIMPL
@@ -676,7 +680,8 @@
 433	UNIMPL
 434	UNIMPL
 435	UNIMPL
-436	UNIMPL
+436	STD		{ int|linux_sys||close_range(unsigned int first, \
+			    unsigned int last, unsigned int flags); }
 437	UNIMPL
 438	UNIMPL
 439	UNIMPL

Index: src/sys/compat/linux/arch/powerpc/syscalls.master
diff -u src/sys/compat/linux/arch/powerpc/syscalls.master:1.81 src/sys/compat/linux/arch/powerpc/syscalls.master:1.82
--- src/sys/compat/linux/arch/powerpc/syscalls.master:1.81	Fri Jul 28 15:01:11 2023
+++ src/sys/compat/linux/arch/powerpc/syscalls.master	Sat Jul 29 11:04:29 2023
@@ -1,4 +1,4 @@
-	$NetBSD: syscalls.master,v 1.81 2023/07/28 19:01:11 christos Exp $  
+	$NetBSD: syscalls.master,v 1.82 2023/07/29 15:04:29 christos Exp $  
 
 ;	@(#)syscalls.master	8.1 (Berkeley) 7/19/93
 
@@ -357,7 +357,8 @@
 189	NOARGS		{ int|sys|14|vfork(void); }
 190	STD		{ int|linux_sys||ugetrlimit(int which, \
 			    struct rlimit *rlp); }
-191	UNIMPL		/* unused */
+191	STD		{ ssize_t|linux_sys||readahead(int fd, off_t offset, \
+			    size_t count); }
 #define linux_sys_mmap2_args linux_sys_mmap_args
 192	NOARGS		{ linux_off_t|linux_sys||mmap2(unsigned long addr, \
 			    size_t len, int prot, int flags, int fd, \
@@ -633,7 +634,9 @@
 380	UNIMPL		preadv2
 381	UNIMPL		pwritev2
 382	UNIMPL		kexec_file_load
-383	UNIMPL
+383     STD		{ int|linux_sys||statx(int fd, const char *path, \
+			    int flag, unsigned int mask, \
+			    struct linux_statx *sp); }
 384	UNIMPL
 385	UNIMPL
 386	UNIMPL
@@ -686,7 +689,8 @@
 433	UNIMPL
 434	UNIMPL
 435	UNIMPL
-436	UNIMPL
+436	STD		{ int|linux_sys||close_range(unsigned int first, \
+			    unsigned int last, unsigned int flags); }
 437	UNIMPL
 438	UNIMPL
 439	UNIMPL

Index: src/sys/compat/linux/common/linux_file64.c
diff -u src/sys/compat/linux/common/linux_file64.c:1.67 src/sys/compat/linux/common/linux_file64.c:1.68
--- src/sys/compat/linux/common/linux_file64.c:1.67	Wed Nov 24 21:27:08 2021
+++ src/sys/compat/linux/common/linux_file64.c	Sat Jul 29 11:04:29 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_file64.c,v 1.67 2021/11/25 02:27:08 ryo Exp $	*/
+/*	$NetBSD: linux_file64.c,v 1.68 2023/07/29 15:04:29 christos Exp $	*/
 
 /*-
  * Copyright (c) 1995, 1998, 2000, 2008 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_file64.c,v 1.67 2021/11/25 02:27:08 ryo Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_file64.c,v 1.68 2023/07/29 15:04:29 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -252,6 +252,10 @@ linux_statat(struct lwp *l, int fd, cons
 	int error, nd_flag;
 	uint8_t c;
 
+	if (lflag & ~(LINUX_AT_EMPTY_PATH|LINUX_AT_NO_AUTOMOUNT
+            |LINUX_AT_SYMLINK_NOFOLLOW))
+		return EINVAL;
+
 	if (lflag & LINUX_AT_EMPTY_PATH) {
 		/*
 		 * If path is null string:

Index: src/sys/compat/linux/common/linux_misc.c
diff -u src/sys/compat/linux/common/linux_misc.c:1.259 src/sys/compat/linux/common/linux_misc.c:1.260
--- src/sys/compat/linux/common/linux_misc.c:1.259	Sat Jul 29 03:00:00 2023
+++ src/sys/compat/linux/common/linux_misc.c	Sat Jul 29 11:04:29 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_misc.c,v 1.259 2023/07/29 07:00:00 rin Exp $	*/
+/*	$NetBSD: linux_misc.c,v 1.260 2023/07/29 15:04:29 christos Exp $	*/
 
 /*-
  * Copyright (c) 1995, 1998, 1999, 2008 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.259 2023/07/29 07:00:00 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.260 2023/07/29 15:04:29 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1977,3 +1977,83 @@ linux_sys_memfd_create(struct lwp *l,
 
 	return sys_memfd_create(l, &muap, retval);
 }
+
+#define	LINUX_CLOSE_RANGE_UNSHARE	0x02U
+#define	LINUX_CLOSE_RANGE_CLOEXEC	0x04U
+
+/*
+ * close_range(2).
+ */
+int
+linux_sys_close_range(struct lwp *l,
+    const struct linux_sys_close_range_args *uap, register_t *retval)
+{
+	/* {
+		syscallarg(unsigned int) first;
+		syscallarg(unsigned int) last;
+		syscallarg(unsigned int) flags;
+	} */
+	unsigned int fd, last;
+	file_t *fp;
+	filedesc_t *fdp;
+	const unsigned int flags = SCARG(uap, flags);
+
+	if (flags & ~(LINUX_CLOSE_RANGE_CLOEXEC|LINUX_CLOSE_RANGE_UNSHARE))
+		return EINVAL;
+	if (SCARG(uap, first) > SCARG(uap, last))
+		return EINVAL;
+
+	if (flags & LINUX_CLOSE_RANGE_UNSHARE) {
+		fdp = fd_copy();
+		fd_free();
+	        l->l_proc->p_fd = fdp;
+	        l->l_fd = fdp;
+	}
+
+	last = MIN(SCARG(uap, last), l->l_proc->p_fd->fd_lastfile);
+	for (fd = SCARG(uap, first); fd <= last; fd++) {
+		fp = fd_getfile(fd);
+		if (fp == NULL)
+			continue;
+
+		if (flags & LINUX_CLOSE_RANGE_CLOEXEC) {
+			fd_set_exclose(l, fd, true);
+			fd_putfile(fd);
+		} else
+			fd_close(fd);
+	}
+
+	return 0;
+}
+
+/*
+ * readahead(2).  Call posix_fadvise with POSIX_FADV_WILLNEED with some extra
+ * error checking.
+ */
+int
+linux_sys_readahead(struct lwp *l, const struct linux_sys_readahead_args *uap,
+    register_t *retval)
+{
+	/* {
+		syscallarg(int) fd;
+		syscallarg(off_t) offset;
+		syscallarg(size_t) count;
+	} */
+	file_t *fp;
+	int error = 0;
+	const int fd = SCARG(uap, fd);
+
+	fp = fd_getfile(fd);
+	if (fp == NULL)
+		return EBADF;
+	if ((fp->f_flag & FREAD) == 0)
+		error = EBADF;
+	else if (fp->f_type != DTYPE_VNODE || fp->f_vnode->v_type != VREG)
+		error = EINVAL;
+	fd_putfile(fd);
+	if (error != 0)
+		return error;
+
+	return do_posix_fadvise(fd, SCARG(uap, offset), SCARG(uap, count),
+	    POSIX_FADV_WILLNEED);
+}

Reply via email to