Page MenuHomeFreeBSD

D49440.diff
No OneTemporary

D49440.diff

diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -892,6 +892,26 @@
}
#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
--- a/sys/sys/file.h
+++ b/sys/sys/file.h
@@ -86,6 +86,8 @@
#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);

File Metadata

Mime Type
text/plain
Expires
Wed, Feb 18, 2:36 PM (16 h, 32 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28847938
Default Alt Text
D49440.diff (1 KB)

Event Timeline