Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys file(9): New fo_advlock operation.
details: https://anonhg.NetBSD.org/src/rev/fb8a18535c6e
branches: trunk
changeset: 374413:fb8a18535c6e
user: riastradh <riastradh%NetBSD.org@localhost>
date: Sat Apr 22 13:52:46 2023 +0000
description:
file(9): New fo_advlock operation.
This moves the vnode-specific logic from sys_descrip.c into
vfs_vnode.c, like we did for fo_seek.
XXX kernel revbump -- struct fileops API and ABI change
diffstat:
sys/kern/kern_descrip.c | 14 +++++++-------
sys/kern/sys_descrip.c | 42 +++++++++++++++++++-----------------------
sys/kern/vfs_vnops.c | 21 +++++++++++++++++++--
sys/sys/file.h | 5 ++++-
4 files changed, 49 insertions(+), 33 deletions(-)
diffs (251 lines):
diff -r 51e7cfd85758 -r fb8a18535c6e sys/kern/kern_descrip.c
--- a/sys/kern/kern_descrip.c Sat Apr 22 13:52:37 2023 +0000
+++ b/sys/kern/kern_descrip.c Sat Apr 22 13:52:46 2023 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_descrip.c,v 1.255 2023/02/24 11:02:27 riastradh Exp $ */
+/* $NetBSD: kern_descrip.c,v 1.256 2023/04/22 13:52:46 riastradh Exp $ */
/*-
* Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_descrip.c,v 1.255 2023/02/24 11:02:27 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_descrip.c,v 1.256 2023/04/22 13:52:46 riastradh Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -727,14 +727,14 @@ fd_close(unsigned fd)
* If the descriptor was in a message, POSIX-style locks
* aren't passed with the descriptor.
*/
- if (__predict_false((p->p_flag & PK_ADVLOCK) != 0 &&
- fp->f_type == DTYPE_VNODE)) {
+ if (__predict_false((p->p_flag & PK_ADVLOCK) != 0) &&
+ fp->f_ops->fo_advlock != NULL) {
lf.l_whence = SEEK_SET;
lf.l_start = 0;
lf.l_len = 0;
lf.l_type = F_UNLCK;
mutex_exit(&fdp->fd_lock);
- (void)VOP_ADVLOCK(fp->f_vnode, p, F_UNLCK, &lf, F_POSIX);
+ (void)(*fp->f_ops->fo_advlock)(fp, p, F_UNLCK, &lf, F_POSIX);
mutex_enter(&fdp->fd_lock);
}
@@ -852,12 +852,12 @@ closef(file_t *fp)
mutex_exit(&fp->f_lock);
/* We held the last reference - release locks, close and free. */
- if ((fp->f_flag & FHASLOCK) && fp->f_type == DTYPE_VNODE) {
+ if ((fp->f_flag & FHASLOCK) && fp->f_ops->fo_advlock != NULL) {
lf.l_whence = SEEK_SET;
lf.l_start = 0;
lf.l_len = 0;
lf.l_type = F_UNLCK;
- (void)VOP_ADVLOCK(fp->f_vnode, fp, F_UNLCK, &lf, F_FLOCK);
+ (void)(*fp->f_ops->fo_advlock)(fp, fp, F_UNLCK, &lf, F_FLOCK);
}
if (fp->f_ops != NULL) {
error = (*fp->f_ops->fo_close)(fp);
diff -r 51e7cfd85758 -r fb8a18535c6e sys/kern/sys_descrip.c
--- a/sys/kern/sys_descrip.c Sat Apr 22 13:52:37 2023 +0000
+++ b/sys/kern/sys_descrip.c Sat Apr 22 13:52:46 2023 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sys_descrip.c,v 1.40 2022/04/16 07:59:02 hannken Exp $ */
+/* $NetBSD: sys_descrip.c,v 1.41 2023/04/22 13:52:46 riastradh Exp $ */
/*-
* Copyright (c) 2008, 2020 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_descrip.c,v 1.40 2022/04/16 07:59:02 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_descrip.c,v 1.41 2023/04/22 13:52:46 riastradh Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -235,19 +235,14 @@ int
do_fcntl_lock(int fd, int cmd, struct flock *fl)
{
file_t *fp;
- vnode_t *vp;
proc_t *p;
+ int (*fo_advlock)(struct file *, void *, int, struct flock *, int);
int error, flg;
- if ((error = fd_getvnode(fd, &fp)) != 0)
- return error;
-
- vp = fp->f_vnode;
- if (fl->l_whence == SEEK_CUR) {
- vn_lock(vp, LK_SHARED | LK_RETRY);
- fl->l_start += fp->f_offset;
- VOP_UNLOCK(vp);
- }
+ if ((fp = fd_getfile(fd)) == NULL)
+ return EBADF;
+ if ((fo_advlock = fp->f_ops->fo_advlock) == NULL)
+ return EINVAL;
flg = F_POSIX;
p = curproc;
@@ -270,7 +265,7 @@ do_fcntl_lock(int fd, int cmd, struct fl
p->p_flag |= PK_ADVLOCK;
mutex_exit(p->p_lock);
}
- error = VOP_ADVLOCK(vp, p, F_SETLK, fl, flg);
+ error = (*fo_advlock)(fp, p, F_SETLK, fl, flg);
break;
case F_WRLCK:
@@ -283,11 +278,11 @@ do_fcntl_lock(int fd, int cmd, struct fl
p->p_flag |= PK_ADVLOCK;
mutex_exit(p->p_lock);
}
- error = VOP_ADVLOCK(vp, p, F_SETLK, fl, flg);
+ error = (*fo_advlock)(fp, p, F_SETLK, fl, flg);
break;
case F_UNLCK:
- error = VOP_ADVLOCK(vp, p, F_UNLCK, fl, F_POSIX);
+ error = (*fo_advlock)(fp, p, F_UNLCK, fl, F_POSIX);
break;
default:
@@ -303,7 +298,7 @@ do_fcntl_lock(int fd, int cmd, struct fl
error = EINVAL;
break;
}
- error = VOP_ADVLOCK(vp, p, F_GETLK, fl, F_POSIX);
+ error = (*fo_advlock)(fp, p, F_GETLK, fl, F_POSIX);
break;
default:
@@ -629,16 +624,17 @@ sys_flock(struct lwp *l, const struct sy
} */
int fd, how, error;
file_t *fp;
- vnode_t *vp;
+ int (*fo_advlock)(struct file *, void *, int, struct flock *, int);
struct flock lf;
fd = SCARG(uap, fd);
how = SCARG(uap, how);
- if ((error = fd_getvnode(fd, &fp)) != 0)
- return error == EINVAL ? EOPNOTSUPP : error;
+ if ((fp = fd_getfile(fd)) == NULL)
+ return EBADF;
+ if ((fo_advlock = fp->f_ops->fo_advlock) == NULL)
+ return EOPNOTSUPP;
- vp = fp->f_vnode;
lf.l_whence = SEEK_SET;
lf.l_start = 0;
lf.l_len = 0;
@@ -647,7 +643,7 @@ sys_flock(struct lwp *l, const struct sy
case LOCK_UN:
lf.l_type = F_UNLCK;
atomic_and_uint(&fp->f_flag, ~FHASLOCK);
- error = VOP_ADVLOCK(vp, fp, F_UNLCK, &lf, F_FLOCK);
+ error = (*fo_advlock)(fp, fp, F_UNLCK, &lf, F_FLOCK);
fd_putfile(fd);
return error;
case LOCK_EX:
@@ -663,9 +659,9 @@ sys_flock(struct lwp *l, const struct sy
atomic_or_uint(&fp->f_flag, FHASLOCK);
if (how & LOCK_NB) {
- error = VOP_ADVLOCK(vp, fp, F_SETLK, &lf, F_FLOCK);
+ error = (*fo_advlock)(fp, fp, F_SETLK, &lf, F_FLOCK);
} else {
- error = VOP_ADVLOCK(vp, fp, F_SETLK, &lf, F_FLOCK|F_WAIT);
+ error = (*fo_advlock)(fp, fp, F_SETLK, &lf, F_FLOCK|F_WAIT);
}
fd_putfile(fd);
return error;
diff -r 51e7cfd85758 -r fb8a18535c6e sys/kern/vfs_vnops.c
--- a/sys/kern/vfs_vnops.c Sat Apr 22 13:52:37 2023 +0000
+++ b/sys/kern/vfs_vnops.c Sat Apr 22 13:52:46 2023 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_vnops.c,v 1.238 2023/04/22 11:22:36 riastradh Exp $ */
+/* $NetBSD: vfs_vnops.c,v 1.239 2023/04/22 13:52:46 riastradh Exp $ */
/*-
* Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_vnops.c,v 1.238 2023/04/22 11:22:36 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_vnops.c,v 1.239 2023/04/22 13:52:46 riastradh Exp $");
#include "veriexec.h"
@@ -122,6 +122,7 @@ static int vn_ioctl(file_t *fp, u_long c
static int vn_mmap(struct file *, off_t *, size_t, int, int *, int *,
struct uvm_object **, int *);
static int vn_seek(struct file *, off_t, int, off_t *, int);
+static int vn_advlock(struct file *, void *, int, struct flock *, int);
const struct fileops vnops = {
.fo_name = "vn",
@@ -136,6 +137,7 @@ const struct fileops vnops = {
.fo_restart = fnullop_restart,
.fo_mmap = vn_mmap,
.fo_seek = vn_seek,
+ .fo_advlock = vn_advlock,
};
/*
@@ -1217,6 +1219,21 @@ out: VOP_UNLOCK(vp);
return error;
}
+static int
+vn_advlock(struct file *fp, void *id, int op, struct flock *fl,
+ int flags)
+{
+ struct vnode *const vp = fp->f_vnode;
+
+ if (fl->l_whence == SEEK_CUR) {
+ vn_lock(vp, LK_SHARED | LK_RETRY);
+ fl->l_start += fp->f_offset;
+ VOP_UNLOCK(vp);
+ }
+
+ return VOP_ADVLOCK(vp, id, op, fl, flags);
+}
+
/*
* Check that the vnode is still valid, and if so
* acquire requested lock.
diff -r 51e7cfd85758 -r fb8a18535c6e sys/sys/file.h
--- a/sys/sys/file.h Sat Apr 22 13:52:37 2023 +0000
+++ b/sys/sys/file.h Sat Apr 22 13:52:46 2023 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: file.h,v 1.89 2023/04/22 13:52:37 riastradh Exp $ */
+/* $NetBSD: file.h,v 1.90 2023/04/22 13:52:46 riastradh Exp $ */
/*-
* Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -71,6 +71,7 @@
#include <sys/mutex.h>
#include <sys/condvar.h>
+struct flock;
struct iovec;
struct knote;
struct lwp;
@@ -95,6 +96,8 @@ struct fileops {
int (*fo_mmap) (struct file *, off_t *, size_t, int, int *,
int *, struct uvm_object **, int *);
int (*fo_seek) (struct file *, off_t, int, off_t *, int);
+ int (*fo_advlock) (struct file *, void *, int, struct flock *,
+ int);
};
union file_data {
Home |
Main Index |
Thread Index |
Old Index