git: d71e1a883c92 - main - fifo: support flock

Mateusz Guzik mjg at FreeBSD.org
Sat Sep 25 15:36:58 UTC 2021


The branch main has been updated by mjg:

URL: https://cgit.FreeBSD.org/src/commit/?id=d71e1a883c92b8b166eea59734850acd54048d72

commit d71e1a883c92b8b166eea59734850acd54048d72
Author:     Mateusz Guzik <mjg at FreeBSD.org>
AuthorDate: 2021-09-25 12:24:39 +0000
Commit:     Mateusz Guzik <mjg at FreeBSD.org>
CommitDate: 2021-09-25 14:58:31 +0000

    fifo: support flock
    
    This evens it up with Linux.
    
    Original patch by:      Greg V <greg at unrelenting.technology>
    Differential Revision:  https://reviews.freebsd.org/D24255#565302
---
 sys/fs/fifofs/fifo_vnops.c |  4 +++-
 sys/kern/kern_descrip.c    | 16 ++++++++++------
 sys/kern/vfs_vnops.c       |  2 +-
 3 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/sys/fs/fifofs/fifo_vnops.c b/sys/fs/fifofs/fifo_vnops.c
index 861f1b40a744..1b941620b080 100644
--- a/sys/fs/fifofs/fifo_vnops.c
+++ b/sys/fs/fifofs/fifo_vnops.c
@@ -376,5 +376,7 @@ fifo_advlock(ap)
 	} */ *ap;
 {
 
-	return (ap->a_flags & F_FLOCK ? EOPNOTSUPP : EINVAL);
+	if ((ap->a_flags & F_FLOCK) == 0)
+		return (EINVAL);
+	return (vop_stdadvlock(ap));
 }
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
index ed7fe83cf02f..58c2d1939dba 100644
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -3560,11 +3560,15 @@ sys_flock(struct thread *td, struct flock_args *uap)
 	error = fget(td, uap->fd, &cap_flock_rights, &fp);
 	if (error != 0)
 		return (error);
-	if (fp->f_type != DTYPE_VNODE || fp->f_ops == &path_fileops) {
-		fdrop(fp, td);
-		return (EOPNOTSUPP);
+	error = EOPNOTSUPP;
+	if (fp->f_type != DTYPE_VNODE && fp->f_type != DTYPE_FIFO) {
+		goto done;
+	}
+	if (fp->f_ops == &path_fileops) {
+		goto done;
 	}
 
+	error = 0;
 	vp = fp->f_vnode;
 	lf.l_whence = SEEK_SET;
 	lf.l_start = 0;
@@ -3573,7 +3577,7 @@ sys_flock(struct thread *td, struct flock_args *uap)
 		lf.l_type = F_UNLCK;
 		atomic_clear_int(&fp->f_flag, FHASLOCK);
 		error = VOP_ADVLOCK(vp, (caddr_t)fp, F_UNLCK, &lf, F_FLOCK);
-		goto done2;
+		goto done;
 	}
 	if (uap->how & LOCK_EX)
 		lf.l_type = F_WRLCK;
@@ -3581,12 +3585,12 @@ sys_flock(struct thread *td, struct flock_args *uap)
 		lf.l_type = F_RDLCK;
 	else {
 		error = EBADF;
-		goto done2;
+		goto done;
 	}
 	atomic_set_int(&fp->f_flag, FHASLOCK);
 	error = VOP_ADVLOCK(vp, (caddr_t)fp, F_SETLK, &lf,
 	    (uap->how & LOCK_NB) ? F_FLOCK : F_FLOCK | F_WAIT);
-done2:
+done:
 	fdrop(fp, td);
 	return (error);
 }
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index d4229160f11e..aeeeee3e3a1d 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -1829,7 +1829,7 @@ vn_closefile(struct file *fp, struct thread *td)
 
 	vp = fp->f_vnode;
 	fp->f_ops = &badfileops;
-	ref = (fp->f_flag & FHASLOCK) != 0 && fp->f_type == DTYPE_VNODE;
+	ref = (fp->f_flag & FHASLOCK) != 0;
 
 	error = vn_close1(vp, fp->f_flag, fp->f_cred, td, ref);
 


More information about the dev-commits-src-main mailing list