summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/kern/vfs_vnops.c
diff options
context:
space:
mode:
Diffstat (limited to 'freebsd/sys/kern/vfs_vnops.c')
-rw-r--r--freebsd/sys/kern/vfs_vnops.c93
1 files changed, 91 insertions, 2 deletions
diff --git a/freebsd/sys/kern/vfs_vnops.c b/freebsd/sys/kern/vfs_vnops.c
index bdd6692d..023d387d 100644
--- a/freebsd/sys/kern/vfs_vnops.c
+++ b/freebsd/sys/kern/vfs_vnops.c
@@ -1,3 +1,5 @@
+#include <machine/rtems-bsd-kernel-space.h>
+
/*-
* SPDX-License-Identifier: BSD-3-Clause
*
@@ -45,7 +47,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include "opt_hwpmc_hooks.h"
+#include <rtems/bsd/local/opt_hwpmc_hooks.h>
#include <sys/param.h>
#include <sys/systm.h>
@@ -74,7 +76,7 @@ __FBSDID("$FreeBSD$");
#include <sys/ttycom.h>
#include <sys/conf.h>
#include <sys/syslog.h>
-#include <sys/unistd.h>
+#include <rtems/bsd/sys/unistd.h>
#include <sys/user.h>
#include <security/audit/audit.h>
@@ -114,10 +116,14 @@ struct fileops vnops = {
.fo_close = vn_closefile,
.fo_chmod = vn_chmod,
.fo_chown = vn_chown,
+#ifndef __rtems__
.fo_sendfile = vn_sendfile,
+#endif /* __rtems__ */
.fo_seek = vn_seek,
+#ifndef __rtems__
.fo_fill_kinfo = vn_fill_kinfo,
.fo_mmap = vn_mmap,
+#endif /* __rtems__ */
.fo_flags = DFLAG_PASSABLE | DFLAG_SEEKABLE
};
@@ -353,8 +359,10 @@ vn_open_vnode(struct vnode *vp, int fmode, struct ucred *cred,
}
if (fmode & FREAD)
accmode |= VREAD;
+#ifndef __rtems__
if (fmode & FEXEC)
accmode |= VEXEC;
+#endif /* __rtems__ */
if ((fmode & O_APPEND) && (fmode & FWRITE))
accmode |= VAPPEND;
#ifdef MAC
@@ -394,7 +402,9 @@ vn_open_vnode(struct vnode *vp, int fmode, struct ucred *cred,
* Arrange for that by having fdrop() to use vn_closefile().
*/
if (error != 0) {
+#ifndef __rtems__
fp->f_flag |= FOPENFAILED;
+#endif /* __rtems__ */
fp->f_vnode = vp;
if (fp->f_ops == &badfileops) {
fp->f_type = DTYPE_VNODE;
@@ -448,7 +458,11 @@ vn_close1(struct vnode *vp, int flags, struct ucred *file_cred,
vn_start_write(vp, &mp, V_WAIT);
vn_lock(vp, lock_flags | LK_RETRY);
AUDIT_ARG_VNODE1(vp);
+#ifndef __rtems__
if ((flags & (FWRITE | FOPENFAILED)) == FWRITE) {
+#else /* __rtems__ */
+ if ((flags & FWRITE) == FWRITE) {
+#endif /* __rtems__ */
VOP_ADD_WRITECOUNT_CHECKED(vp, -1);
CTR3(KTR_VFS, "%s: vp %p v_writecount decreased to %d",
__func__, vp, vp->v_writecount);
@@ -478,8 +492,10 @@ sequential_heuristic(struct uio *uio, struct file *fp)
{
ASSERT_VOP_LOCKED(fp->f_vnode, __func__);
+#ifndef __rtems__
if (fp->f_flag & FRDAHEAD)
return (fp->f_seqcount << IO_SEQSHIFT);
+#endif /* __rtems__ */
/*
* Offset 0 is handled specially. open() sets f_seqcount to 1 so
@@ -752,6 +768,7 @@ foffset_unlock_uio(struct file *fp, struct uio *uio, int flags)
static int
get_advice(struct file *fp, struct uio *uio)
{
+#ifndef __rtems__
struct mtx *mtxp;
int ret;
@@ -767,6 +784,9 @@ get_advice(struct file *fp, struct uio *uio)
ret = fp->f_advice->fa_advice;
mtx_unlock(mtxp);
return (ret);
+#else /* __rtems__ */
+ return (POSIX_FADV_NORMAL);
+#endif /* __rtems__ */
}
/*
@@ -946,7 +966,9 @@ vn_io_fault_doio(struct vn_io_fault_args *args, struct uio *uio,
int error, save;
error = 0;
+#ifndef __rtems__
save = vm_fault_disable_pagefaults();
+#endif /* __rtems__ */
switch (args->kind) {
case VN_IO_FAULT_FOP:
error = (args->args.fop_args.doio)(args->args.fop_args.fp,
@@ -965,24 +987,31 @@ vn_io_fault_doio(struct vn_io_fault_args *args, struct uio *uio,
panic("vn_io_fault_doio: unknown kind of io %d %d",
args->kind, uio->uio_rw);
}
+#ifndef __rtems__
vm_fault_enable_pagefaults(save);
+#endif /* __rtems__ */
return (error);
}
static int
vn_io_fault_touch(char *base, const struct uio *uio)
{
+#ifndef __rtems__
int r;
r = fubyte(base);
if (r == -1 || (uio->uio_rw == UIO_READ && subyte(base, r) == -1))
return (EFAULT);
return (0);
+#else /* __rtems__ */
+ return (EFAULT);
+#endif /* __rtems__ */
}
static int
vn_io_fault_prefault_user(const struct uio *uio)
{
+#ifndef __rtems__
char *base;
const struct iovec *iov;
size_t len;
@@ -1020,6 +1049,9 @@ vn_io_fault_prefault_user(const struct uio *uio)
}
}
return (error);
+#else /* __rtems__ */
+ return (EFAULT);
+#endif /* __rtems__ */
}
/*
@@ -1042,6 +1074,9 @@ vn_io_fault1(struct vnode *vp, struct uio *uio, struct vn_io_fault_args *args,
size_t len, resid;
ssize_t adv;
int error, cnt, saveheld, prev_td_ma_cnt;
+#ifdef __rtems__
+ struct uio uio_clone_;
+#endif /* __rtems__ */
if (vn_io_fault_prefault) {
error = vn_io_fault_prefault_user(uio);
@@ -1060,7 +1095,12 @@ vn_io_fault1(struct vnode *vp, struct uio *uio, struct vn_io_fault_args *args,
* Cache a copy of the original uio, which is advanced to the redo
* point using UIO_NOCOPY below.
*/
+#ifndef __rtems__
uio_clone = cloneuio(uio);
+#else /* __rtems__ */
+ uio_clone_ = *uio;
+ uio_clone = &uio_clone_;
+#endif /* __rtems__ */
resid = uio->uio_resid;
short_uio.uio_segflg = UIO_USERSPACE;
@@ -1076,9 +1116,11 @@ vn_io_fault1(struct vnode *vp, struct uio *uio, struct vn_io_fault_args *args,
uiomove(NULL, resid - uio->uio_resid, uio_clone);
uio_clone->uio_segflg = uio->uio_segflg;
+#ifndef __rtems__
saveheld = curthread_pflags_set(TDP_UIOHELD);
prev_td_ma = td->td_ma;
prev_td_ma_cnt = td->td_ma_cnt;
+#endif /* __rtems__ */
while (uio_clone->uio_resid != 0) {
len = uio_clone->uio_iov->iov_len;
@@ -1098,6 +1140,7 @@ vn_io_fault1(struct vnode *vp, struct uio *uio, struct vn_io_fault_args *args,
break;
}
cnt = atop(end - trunc_page(addr));
+#ifndef __rtems__
/*
* A perfectly misaligned address and length could cause
* both the start and the end of the chunk to use partial
@@ -1109,16 +1152,21 @@ vn_io_fault1(struct vnode *vp, struct uio *uio, struct vn_io_fault_args *args,
error = EFAULT;
break;
}
+#endif /* __rtems__ */
short_uio.uio_iov = &short_iovec[0];
short_iovec[0].iov_base = (void *)addr;
short_uio.uio_iovcnt = 1;
short_uio.uio_resid = short_iovec[0].iov_len = len;
short_uio.uio_offset = uio_clone->uio_offset;
+#ifndef __rtems__
td->td_ma = ma;
td->td_ma_cnt = cnt;
+#endif /* __rtems__ */
error = vn_io_fault_doio(args, &short_uio, td);
+#ifndef __rtems__
vm_page_unhold_pages(ma, cnt);
+#endif /* __rtems__ */
adv = len - short_uio.uio_resid;
uio_clone->uio_iov->iov_base =
@@ -1133,11 +1181,15 @@ vn_io_fault1(struct vnode *vp, struct uio *uio, struct vn_io_fault_args *args,
if (error != 0 || adv == 0)
break;
}
+#ifndef __rtems__
td->td_ma = prev_td_ma;
td->td_ma_cnt = prev_td_ma_cnt;
curthread_pflags_restore(saveheld);
+#endif /* __rtems__ */
out:
+#ifndef __rtems__
free(uio_clone, M_IOV);
+#endif /* __rtems__ */
return (error);
}
@@ -1145,6 +1197,7 @@ static int
vn_io_fault(struct file *fp, struct uio *uio, struct ucred *active_cred,
int flags, struct thread *td)
{
+#ifdef __rtems__
fo_rdwr_t *doio;
struct vnode *vp;
void *rl_cookie;
@@ -1178,6 +1231,9 @@ vn_io_fault(struct file *fp, struct uio *uio, struct ucred *active_cred,
}
foffset_unlock_uio(fp, uio, flags);
return (error);
+#else /* __rtems__ */
+ return (EFAULT);
+#endif /* __rtems__ */
}
/*
@@ -1195,6 +1251,8 @@ vn_io_fault(struct file *fp, struct uio *uio, struct ucred *active_cred,
int
vn_io_fault_uiomove(char *data, int xfersize, struct uio *uio)
{
+#ifndef __rtems__
+ return (EFAULT);
struct uio transp_uio;
struct iovec transp_iov[1];
struct thread *td;
@@ -1204,8 +1262,10 @@ vn_io_fault_uiomove(char *data, int xfersize, struct uio *uio)
td = curthread;
if ((td->td_pflags & TDP_UIOHELD) == 0 ||
uio->uio_segflg != UIO_USERSPACE)
+#endif /* __rtems__ */
return (uiomove(data, xfersize, uio));
+#ifndef __rtems__
KASSERT(uio->uio_iovcnt == 1, ("uio_iovcnt %d", uio->uio_iovcnt));
transp_iov[0].iov_base = data;
transp_uio.uio_iov = &transp_iov[0];
@@ -1246,12 +1306,14 @@ vn_io_fault_uiomove(char *data, int xfersize, struct uio *uio)
uio->uio_resid -= adv;
uio->uio_offset += adv;
return (error);
+#endif /* __rtems__ */
}
int
vn_io_fault_pgmove(vm_page_t ma[], vm_offset_t offset, int xfersize,
struct uio *uio)
{
+#ifndef __rtems__
struct thread *td;
vm_offset_t iov_base;
int cnt, pgadv;
@@ -1284,6 +1346,9 @@ vn_io_fault_pgmove(vm_page_t ma[], vm_offset_t offset, int xfersize,
uio->uio_resid -= cnt;
uio->uio_offset += cnt;
return (0);
+#else /* __rtems__ */
+ return (EFAULT);
+#endif /* __rtems__ */
}
@@ -1440,7 +1505,9 @@ vn_stat(struct vnode *vp, struct stat *sb, struct ucred *active_cred,
sb->st_atim = vap->va_atime;
sb->st_mtim = vap->va_mtime;
sb->st_ctim = vap->va_ctime;
+#ifndef __rtems__
sb->st_birthtim = vap->va_birthtime;
+#endif /* __rtems__ */
/*
* According to www.opengroup.org, the meaning of st_blksize is
@@ -1452,11 +1519,13 @@ vn_stat(struct vnode *vp, struct stat *sb, struct ucred *active_cred,
sb->st_blksize = max(PAGE_SIZE, vap->va_blocksize);
+#ifndef __rtems__
sb->st_flags = vap->va_flags;
if (priv_check(td, PRIV_VFS_GENERATION))
sb->st_gen = 0;
else
sb->st_gen = vap->va_gen;
+#endif /* __rtems__ */
sb->st_blocks = vap->va_bytes / S_BLKSIZE;
return (0);
@@ -1486,6 +1555,7 @@ vn_ioctl(struct file *fp, u_long com, void *data, struct ucred *active_cred,
if (error == 0)
*(int *)data = vattr.va_size - fp->f_offset;
return (error);
+#ifndef __rtems__
case FIOBMAP2:
bmarg = (struct fiobmap2_arg *)data;
vn_lock(vp, LK_SHARED | LK_RETRY);
@@ -1498,6 +1568,7 @@ vn_ioctl(struct file *fp, u_long com, void *data, struct ucred *active_cred,
&bmarg->bn, &bmarg->runp, &bmarg->runb);
VOP_UNLOCK(vp, 0);
return (error);
+#endif /* __rtems__ */
case FIONBIO:
case FIOASYNC:
return (0);
@@ -1578,7 +1649,11 @@ vn_closefile(struct file *fp, struct thread *td)
vp = fp->f_vnode;
fp->f_ops = &badfileops;
+#ifndef __rtems__
ref= (fp->f_flag & FHASLOCK) != 0 && fp->f_type == DTYPE_VNODE;
+#else /* __rtems__ */
+ ref = false;
+#endif /* __rtems__ */
error = vn_close1(vp, fp->f_flag, fp->f_cred, td, ref);
@@ -1617,7 +1692,11 @@ vn_start_write_locked(struct mount *mp, int flags)
/*
* Check on status of suspension.
*/
+#ifndef __rtems__
if ((curthread->td_pflags & TDP_IGNSUSP) == 0 ||
+#else /* __rtems__ */
+ if (
+#endif /* __rtems__ */
mp->mnt_susp_owner != curthread) {
mflags = ((mp->mnt_vfc->vfc_flags & VFCF_SBDRY) != 0 ?
(flags & PCATCH) : 0) | (PUSER - 1);
@@ -1864,7 +1943,9 @@ vfs_write_resume(struct mount *mp, int flags)
mp->mnt_susp_owner = NULL;
wakeup(&mp->mnt_writeopcount);
wakeup(&mp->mnt_flag);
+#ifndef __rtems__
curthread->td_pflags &= ~TDP_IGNSUSP;
+#endif /* __rtems__ */
if ((flags & VR_START_WRITE) != 0) {
MNT_REF(mp);
mp->mnt_writeopcount++;
@@ -1910,7 +1991,9 @@ vfs_write_suspend_umnt(struct mount *mp)
mp->mnt_kern_flag &= ~(MNTK_SUSPENDED | MNTK_SUSPEND2);
wakeup(&mp->mnt_flag);
MNT_IUNLOCK(mp);
+#ifndef __rtems__
curthread->td_pflags |= TDP_IGNSUSP;
+#endif /* __rtems__ */
return (0);
}
@@ -2106,9 +2189,11 @@ vn_rlimit_fsize(const struct vnode *vp, const struct uio *uio,
return (0);
if ((uoff_t)uio->uio_offset + uio->uio_resid >
lim_cur(td, RLIMIT_FSIZE)) {
+#ifndef __rtems__
PROC_LOCK(td->td_proc);
kern_psignal(td->td_proc, SIGXFSZ);
PROC_UNLOCK(td->td_proc);
+#endif /* __rtems__ */
return (EFBIG);
}
return (0);
@@ -2147,6 +2232,7 @@ vn_chown(struct file *fp, uid_t uid, gid_t gid, struct ucred *active_cred,
void
vn_pages_remove(struct vnode *vp, vm_pindex_t start, vm_pindex_t end)
{
+#ifndef __rtems__
vm_object_t object;
if ((object = vp->v_object) == NULL)
@@ -2154,6 +2240,7 @@ vn_pages_remove(struct vnode *vp, vm_pindex_t start, vm_pindex_t end)
VM_OBJECT_WLOCK(object);
vm_object_page_remove(object, start, end, 0);
VM_OBJECT_WUNLOCK(object);
+#endif /* __rtems__ */
}
int
@@ -2386,6 +2473,7 @@ vn_fill_kinfo_vnode(struct vnode *vp, struct kinfo_file *kif)
return (0);
}
+#ifndef __rtems__
int
vn_mmap(struct file *fp, vm_map_t map, vm_offset_t *addr, vm_size_t size,
vm_prot_t prot, vm_prot_t cap_maxprot, int flags, vm_ooffset_t foff,
@@ -2499,6 +2587,7 @@ vn_mmap(struct file *fp, vm_map_t map, vm_offset_t *addr, vm_size_t size,
#endif
return (error);
}
+#endif /* __rtems__ */
void
vn_fsid(struct vnode *vp, struct vattr *va)