Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 15 Apr 2025 02:25:36 GMT
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: c1aa97cf79a6 - stable/14 - file: Add foffset_lock_pair()
Message-ID:  <202504150225.53F2PaGe014590@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/14 has been updated by markj:

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

commit c1aa97cf79a6fd40eb89bcbd4faebdc5656a6279
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2025-03-31 01:25:16 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2025-04-15 02:25:24 +0000

    file: Add foffset_lock_pair()
    
    This will be used in kern_copy_file_range(), which needs to lock two
    offsets.
    
    Reviewed by:    kib, rmacklem
    MFC after:      2 weeks
    Differential Revision:  https://reviews.freebsd.org/D49440
    
    (cherry picked from commit 12ecb0fe0afda8c051605045e446371ddd34741f)
---
 sys/kern/vfs_vnops.c | 20 ++++++++++++++++++++
 sys/sys/file.h       |  2 ++
 2 files changed, 22 insertions(+)

diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index c28d6e66853f..c447ceea1634 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -894,6 +894,26 @@ foffset_read(struct file *fp)
 }
 #endif
 
+void
+foffset_lock_pair(struct file *fp1, off_t *off1p, struct file *fp2, off_t *off2p,
+    int flags)
+{
+	KASSERT(fp1 != fp2, ("foffset_lock_pair: fp1 == fp2"));
+
+	/* Lock in a consistent order to avoid deadlock. */
+	if ((uintptr_t)fp1 > (uintptr_t)fp2) {
+		struct file *tmpfp;
+		off_t *tmpoffp;
+
+		tmpfp = fp1, fp1 = fp2, fp2 = tmpfp;
+		tmpoffp = off1p, off1p = off2p, off2p = tmpoffp;
+	}
+	if (fp1 != NULL)
+		*off1p = foffset_lock(fp1, flags);
+	if (fp2 != NULL)
+		*off2p = foffset_lock(fp2, flags);
+}
+
 void
 foffset_lock_uio(struct file *fp, struct uio *uio, int flags)
 {
diff --git a/sys/sys/file.h b/sys/sys/file.h
index bef21d39e641..07f6bbd5bcae 100644
--- a/sys/sys/file.h
+++ b/sys/sys/file.h
@@ -85,6 +85,8 @@ struct ucred;
 #define	FOF_NEXTOFF_W	0x08	/* Also update f_nextoff[UIO_WRITE] */
 #define	FOF_NOUPDATE	0x10	/* Do not update f_offset */
 off_t foffset_lock(struct file *fp, int flags);
+void foffset_lock_pair(struct file *fp1, off_t *off1p, struct file *fp2,
+    off_t *off2p, int flags);
 void foffset_lock_uio(struct file *fp, struct uio *uio, int flags);
 void foffset_unlock(struct file *fp, off_t val, int flags);
 void foffset_unlock_uio(struct file *fp, struct uio *uio, int flags);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202504150225.53F2PaGe014590>