Module Name:    src
Committed By:   riastradh
Date:           Sat Apr 22 13:52:46 UTC 2023

Modified Files:
        src/sys/kern: kern_descrip.c sys_descrip.c vfs_vnops.c
        src/sys/sys: file.h

Log Message:
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


To generate a diff of this commit:
cvs rdiff -u -r1.255 -r1.256 src/sys/kern/kern_descrip.c
cvs rdiff -u -r1.40 -r1.41 src/sys/kern/sys_descrip.c
cvs rdiff -u -r1.238 -r1.239 src/sys/kern/vfs_vnops.c
cvs rdiff -u -r1.89 -r1.90 src/sys/sys/file.h

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

Modified files:

Index: src/sys/kern/kern_descrip.c
diff -u src/sys/kern/kern_descrip.c:1.255 src/sys/kern/kern_descrip.c:1.256
--- src/sys/kern/kern_descrip.c:1.255	Fri Feb 24 11:02:27 2023
+++ src/sys/kern/kern_descrip.c	Sat Apr 22 13:52:46 2023
@@ -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);

Index: src/sys/kern/sys_descrip.c
diff -u src/sys/kern/sys_descrip.c:1.40 src/sys/kern/sys_descrip.c:1.41
--- src/sys/kern/sys_descrip.c:1.40	Sat Apr 16 07:59:02 2022
+++ src/sys/kern/sys_descrip.c	Sat Apr 22 13:52:46 2023
@@ -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;

Index: src/sys/kern/vfs_vnops.c
diff -u src/sys/kern/vfs_vnops.c:1.238 src/sys/kern/vfs_vnops.c:1.239
--- src/sys/kern/vfs_vnops.c:1.238	Sat Apr 22 11:22:36 2023
+++ src/sys/kern/vfs_vnops.c	Sat Apr 22 13:52:46 2023
@@ -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.

Index: src/sys/sys/file.h
diff -u src/sys/sys/file.h:1.89 src/sys/sys/file.h:1.90
--- src/sys/sys/file.h:1.89	Sat Apr 22 13:52:37 2023
+++ src/sys/sys/file.h	Sat Apr 22 13:52:46 2023
@@ -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 {

Reply via email to