Thu Apr 23 21:47:09 2020 UTC ()
PR kern/54759 (vm.ubc_direct deadlock when read()/write() into mapping of itself)
- Add new flag UBC_ISMAPPED which tells ubc_uiomove() the object is mmap()ed
somewhere. Use it to decide whether to do direct-mapped copy, rather than
poking around directly in the vnode in ubc_uiomove(), which is ugly and
doesn't work for tmpfs. It would be nicer to contain all this in UVM but
the filesystem provides the needed locking here (VV_MAPPED) and to
reinvent that would suck more.
- Rename UBC_UNMAP_FLAG() to UBC_VNODE_FLAGS(). Pass in UBC_ISMAPPED where
appropriate.
(ad)
diff -r1.52 -r1.53 src/sys/fs/adosfs/advnops.c
diff -r1.55 -r1.56 src/sys/fs/cd9660/cd9660_vnops.c
diff -r1.38 -r1.39 src/sys/fs/efs/efs_vnops.c
diff -r1.44 -r1.45 src/sys/fs/filecorefs/filecore_vnops.c
diff -r1.34 -r1.35 src/sys/fs/hfs/hfs_vnops.c
diff -r1.58 -r1.59 src/sys/fs/msdosfs/msdosfs_denode.c
diff -r1.101 -r1.102 src/sys/fs/msdosfs/msdosfs_vnops.c
diff -r1.39 -r1.40 src/sys/fs/nilfs/nilfs_vnops.c
diff -r1.214 -r1.215 src/sys/fs/puffs/puffs_vnops.c
diff -r1.64 -r1.65 src/sys/fs/sysvbfs/sysvbfs_vnops.c
diff -r1.108 -r1.109 src/sys/fs/tmpfs/tmpfs_subr.c
diff -r1.135 -r1.136 src/sys/fs/tmpfs/tmpfs_vnops.c
diff -r1.40 -r1.41 src/sys/fs/udf/udf_allocation.c
diff -r1.111 -r1.112 src/sys/fs/udf/udf_vnops.c
diff -r1.28 -r1.29 src/sys/fs/v7fs/v7fs_vnops.c
diff -r1.195 -r1.196 src/sys/nfs/nfs_bio.c
diff -r1.156 -r1.157 src/sys/rump/librump/rumpvfs/rumpfs.c
diff -r1.11 -r1.12 src/sys/ufs/chfs/chfs_subr.c
diff -r1.37 -r1.38 src/sys/ufs/chfs/chfs_vnops.c
diff -r1.88 -r1.89 src/sys/ufs/ext2fs/ext2fs_inode.c
diff -r1.76 -r1.77 src/sys/ufs/ext2fs/ext2fs_readwrite.c
diff -r1.127 -r1.128 src/sys/ufs/ffs/ffs_inode.c
diff -r1.159 -r1.160 src/sys/ufs/lfs/lfs_inode.c
diff -r1.26 -r1.27 src/sys/ufs/lfs/ulfs_readwrite.c
diff -r1.125 -r1.126 src/sys/ufs/ufs/ufs_readwrite.c
diff -r1.109 -r1.110 src/sys/uvm/uvm_bio.c
diff -r1.223 -r1.224 src/sys/uvm/uvm_extern.h
--- src/sys/fs/adosfs/advnops.c 2020/04/23 09:58:37 1.52
+++ src/sys/fs/adosfs/advnops.c 2020/04/23 21:47:07 1.53
@@ -1,4 +1,4 @@
-/* $NetBSD: advnops.c,v 1.52 2020/04/23 09:58:37 jdolecek Exp $ */
+/* $NetBSD: advnops.c,v 1.53 2020/04/23 21:47:07 ad Exp $ */
/*
* Copyright (c) 1994 Christian E. Hopps
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: advnops.c,v 1.52 2020/04/23 09:58:37 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: advnops.c,v 1.53 2020/04/23 21:47:07 ad Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -270,7 +270,7 @@
break;
}
error = ubc_uiomove(&vp->v_uobj, uio, bytelen, advice,
- UBC_READ | UBC_PARTIALOK | UBC_UNMAP_FLAG(vp));
+ UBC_READ | UBC_PARTIALOK | UBC_VNODE_FLAGS(vp));
if (error) {
break;
}
--- src/sys/fs/cd9660/cd9660_vnops.c 2019/07/12 17:18:30 1.55
+++ src/sys/fs/cd9660/cd9660_vnops.c 2020/04/23 21:47:07 1.56
@@ -1,4 +1,4 @@
-/* $NetBSD: cd9660_vnops.c,v 1.55 2019/07/12 17:18:30 maxv Exp $ */
+/* $NetBSD: cd9660_vnops.c,v 1.56 2020/04/23 21:47:07 ad Exp $ */
/*-
* Copyright (c) 1994
@@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cd9660_vnops.c,v 1.55 2019/07/12 17:18:30 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cd9660_vnops.c,v 1.56 2020/04/23 21:47:07 ad Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -241,7 +241,7 @@
if (bytelen == 0)
break;
error = ubc_uiomove(&vp->v_uobj, uio, bytelen, advice,
- UBC_READ | UBC_PARTIALOK | UBC_UNMAP_FLAG(vp));
+ UBC_READ | UBC_PARTIALOK | UBC_VNODE_FLAGS(vp));
if (error)
break;
}
--- src/sys/fs/efs/efs_vnops.c 2017/05/26 14:21:00 1.38
+++ src/sys/fs/efs/efs_vnops.c 2020/04/23 21:47:07 1.39
@@ -1,4 +1,4 @@
-/* $NetBSD: efs_vnops.c,v 1.38 2017/05/26 14:21:00 riastradh Exp $ */
+/* $NetBSD: efs_vnops.c,v 1.39 2020/04/23 21:47:07 ad Exp $ */
/*
* Copyright (c) 2006 Stephen M. Rumble <rumble@ephemeral.org>
@@ -17,7 +17,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: efs_vnops.c,v 1.38 2017/05/26 14:21:00 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: efs_vnops.c,v 1.39 2020/04/23 21:47:07 ad Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -278,7 +278,7 @@
len = MIN(len, eip->ei_size - uio->uio_offset);
err = ubc_uiomove(&ap->a_vp->v_uobj, uio, len, advice,
- UBC_READ | UBC_PARTIALOK | UBC_UNMAP_FLAG(ap->a_vp));
+ UBC_READ | UBC_PARTIALOK | UBC_VNODE_FLAGS(ap->a_vp));
if (err) {
EFS_DPRINTF(("efs_read: uiomove error %d\n",
err));
--- src/sys/fs/filecorefs/filecore_vnops.c 2015/04/20 23:03:08 1.44
+++ src/sys/fs/filecorefs/filecore_vnops.c 2020/04/23 21:47:07 1.45
@@ -1,4 +1,4 @@
-/* $NetBSD: filecore_vnops.c,v 1.44 2015/04/20 23:03:08 riastradh Exp $ */
+/* $NetBSD: filecore_vnops.c,v 1.45 2020/04/23 21:47:07 ad Exp $ */
/*-
* Copyright (c) 1994 The Regents of the University of California.
@@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: filecore_vnops.c,v 1.44 2015/04/20 23:03:08 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: filecore_vnops.c,v 1.45 2020/04/23 21:47:07 ad Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -230,7 +230,7 @@
break;
}
error = ubc_uiomove(&vp->v_uobj, uio, bytelen, advice,
- UBC_READ | UBC_PARTIALOK | UBC_UNMAP_FLAG(vp));
+ UBC_READ | UBC_PARTIALOK | UBC_VNODE_FLAGS(vp));
if (error) {
break;
}
--- src/sys/fs/hfs/hfs_vnops.c 2017/05/26 14:21:00 1.34
+++ src/sys/fs/hfs/hfs_vnops.c 2020/04/23 21:47:07 1.35
@@ -1,4 +1,4 @@
-/* $NetBSD: hfs_vnops.c,v 1.34 2017/05/26 14:21:00 riastradh Exp $ */
+/* $NetBSD: hfs_vnops.c,v 1.35 2020/04/23 21:47:07 ad Exp $ */
/*-
* Copyright (c) 2005, 2007 The NetBSD Foundation, Inc.
@@ -101,7 +101,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hfs_vnops.c,v 1.34 2017/05/26 14:21:00 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hfs_vnops.c,v 1.35 2020/04/23 21:47:07 ad Exp $");
#ifdef _KERNEL_OPT
#include "opt_ipsec.h"
@@ -852,7 +852,7 @@
break;
error = ubc_uiomove(&vp->v_uobj, uio, len, advice,
- UBC_READ | UBC_PARTIALOK | UBC_UNMAP_FLAG(vp));
+ UBC_READ | UBC_PARTIALOK | UBC_VNODE_FLAGS(vp));
}
return error;
--- src/sys/fs/msdosfs/msdosfs_denode.c 2020/04/13 19:23:17 1.58
+++ src/sys/fs/msdosfs/msdosfs_denode.c 2020/04/23 21:47:07 1.59
@@ -1,4 +1,4 @@
-/* $NetBSD: msdosfs_denode.c,v 1.58 2020/04/13 19:23:17 ad Exp $ */
+/* $NetBSD: msdosfs_denode.c,v 1.59 2020/04/23 21:47:07 ad Exp $ */
/*-
* Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank.
@@ -48,7 +48,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: msdosfs_denode.c,v 1.58 2020/04/13 19:23:17 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: msdosfs_denode.c,v 1.59 2020/04/23 21:47:07 ad Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -425,7 +425,7 @@
} else {
ubc_zerorange(&DETOV(dep)->v_uobj, length,
pmp->pm_bpcluster - boff,
- UBC_UNMAP_FLAG(DETOV(dep)));
+ UBC_VNODE_FLAGS(DETOV(dep)));
}
}
@@ -523,7 +523,7 @@
dep->de_flag |= DE_UPDATE|DE_MODIFIED;
ubc_zerorange(&DETOV(dep)->v_uobj, (off_t)osize,
(size_t)(round_page(dep->de_FileSize) - osize),
- UBC_UNMAP_FLAG(DETOV(dep)));
+ UBC_VNODE_FLAGS(DETOV(dep)));
uvm_vnp_setsize(DETOV(dep), (voff_t)dep->de_FileSize);
return (deupdat(dep, 1));
}
--- src/sys/fs/msdosfs/msdosfs_vnops.c 2020/04/13 19:23:17 1.101
+++ src/sys/fs/msdosfs/msdosfs_vnops.c 2020/04/23 21:47:07 1.102
@@ -1,4 +1,4 @@
-/* $NetBSD: msdosfs_vnops.c,v 1.101 2020/04/13 19:23:17 ad Exp $ */
+/* $NetBSD: msdosfs_vnops.c,v 1.102 2020/04/23 21:47:07 ad Exp $ */
/*-
* Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank.
@@ -48,7 +48,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.101 2020/04/13 19:23:17 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.102 2020/04/23 21:47:07 ad Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -480,7 +480,7 @@
if (bytelen == 0)
break;
error = ubc_uiomove(&vp->v_uobj, uio, bytelen, advice,
- UBC_READ | UBC_PARTIALOK | UBC_UNMAP_FLAG(vp));
+ UBC_READ | UBC_PARTIALOK | UBC_VNODE_FLAGS(vp));
if (error)
break;
}
@@ -624,7 +624,7 @@
rem = round_page(dep->de_FileSize) - dep->de_FileSize;
if (rem > 0)
ubc_zerorange(&vp->v_uobj, (off_t)dep->de_FileSize,
- rem, UBC_UNMAP_FLAG(vp));
+ rem, UBC_VNODE_FLAGS(vp));
extended = 1;
}
@@ -633,7 +633,7 @@
bytelen = uio->uio_resid;
error = ubc_uiomove(&vp->v_uobj, uio, bytelen,
- IO_ADV_DECODE(ioflag), UBC_WRITE | UBC_UNMAP_FLAG(vp));
+ IO_ADV_DECODE(ioflag), UBC_WRITE | UBC_VNODE_FLAGS(vp));
if (error)
break;
--- src/sys/fs/nilfs/nilfs_vnops.c 2020/04/13 19:23:18 1.39
+++ src/sys/fs/nilfs/nilfs_vnops.c 2020/04/23 21:47:07 1.40
@@ -1,4 +1,4 @@
-/* $NetBSD: nilfs_vnops.c,v 1.39 2020/04/13 19:23:18 ad Exp $ */
+/* $NetBSD: nilfs_vnops.c,v 1.40 2020/04/23 21:47:07 ad Exp $ */
/*
* Copyright (c) 2008, 2009 Reinoud Zandijk
@@ -28,7 +28,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__KERNEL_RCSID(0, "$NetBSD: nilfs_vnops.c,v 1.39 2020/04/13 19:23:18 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nilfs_vnops.c,v 1.40 2020/04/23 21:47:07 ad Exp $");
#endif /* not lint */
@@ -179,7 +179,7 @@
/* ubc, here we come, prepare to trap */
error = ubc_uiomove(uobj, uio, len, advice,
- UBC_READ | UBC_PARTIALOK | UBC_UNMAP_FLAG(vp));
+ UBC_READ | UBC_PARTIALOK | UBC_VNODE_FLAGS(vp));
if (error)
break;
}
@@ -269,7 +269,7 @@
/* ubc, here we come, prepare to trap */
error = ubc_uiomove(uobj, uio, len, advice,
- UBC_WRITE | UBC_UNMAP_FLAG(vp));
+ UBC_WRITE | UBC_VNODE_FLAGS(vp));
if (error)
break;
}
--- src/sys/fs/puffs/puffs_vnops.c 2020/02/23 15:46:40 1.214
+++ src/sys/fs/puffs/puffs_vnops.c 2020/04/23 21:47:07 1.215
@@ -1,4 +1,4 @@
-/* $NetBSD: puffs_vnops.c,v 1.214 2020/02/23 15:46:40 ad Exp $ */
+/* $NetBSD: puffs_vnops.c,v 1.215 2020/04/23 21:47:07 ad Exp $ */
/*
* Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.214 2020/02/23 15:46:40 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.215 2020/04/23 21:47:07 ad Exp $");
#include <sys/param.h>
#include <sys/buf.h>
@@ -1158,7 +1158,7 @@
return;
vsize_t len = round_page(off) - off;
- ubc_zerorange(&vp->v_uobj, off, len, UBC_WRITE|UBC_UNMAP_FLAG(vp));
+ ubc_zerorange(&vp->v_uobj, off, len, UBC_WRITE|UBC_VNODE_FLAGS(vp));
}
static int
@@ -2297,7 +2297,7 @@
break;
error = ubc_uiomove(&vp->v_uobj, uio, bytelen, advice,
- UBC_READ | UBC_PARTIALOK | UBC_UNMAP_FLAG(vp));
+ UBC_READ | UBC_PARTIALOK | UBC_VNODE_FLAGS(vp));
if (error)
break;
}
@@ -2407,7 +2407,7 @@
if (vp->v_type == VREG &&
PUFFS_USE_PAGECACHE(pmp) &&
!(pn->pn_stat & PNODE_WDIRECT)) {
- ubcflags = UBC_WRITE | UBC_PARTIALOK | UBC_UNMAP_FLAG(vp);
+ ubcflags = UBC_WRITE | UBC_PARTIALOK | UBC_VNODE_FLAGS(vp);
while (uio->uio_resid > 0) {
oldoff = uio->uio_offset;
--- src/sys/fs/sysvbfs/sysvbfs_vnops.c 2020/01/17 20:08:08 1.64
+++ src/sys/fs/sysvbfs/sysvbfs_vnops.c 2020/04/23 21:47:08 1.65
@@ -1,4 +1,4 @@
-/* $NetBSD: sysvbfs_vnops.c,v 1.64 2020/01/17 20:08:08 ad Exp $ */
+/* $NetBSD: sysvbfs_vnops.c,v 1.65 2020/04/23 21:47:08 ad Exp $ */
/*-
* Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sysvbfs_vnops.c,v 1.64 2020/01/17 20:08:08 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysvbfs_vnops.c,v 1.65 2020/04/23 21:47:08 ad Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -448,7 +448,7 @@
break;
err = ubc_uiomove(&v->v_uobj, uio, sz, advice,
- UBC_READ | UBC_PARTIALOK | UBC_UNMAP_FLAG(v));
+ UBC_READ | UBC_PARTIALOK | UBC_VNODE_FLAGS(v));
if (err)
break;
DPRINTF("%s: read %ldbyte\n", __func__, sz);
@@ -495,7 +495,7 @@
while (uio->uio_resid > 0) {
sz = uio->uio_resid;
err = ubc_uiomove(&v->v_uobj, uio, sz, advice,
- UBC_WRITE | UBC_UNMAP_FLAG(v));
+ UBC_WRITE | UBC_VNODE_FLAGS(v));
if (err)
break;
DPRINTF("%s: write %ldbyte\n", __func__, sz);
--- src/sys/fs/tmpfs/tmpfs_subr.c 2020/04/04 20:49:30 1.108
+++ src/sys/fs/tmpfs/tmpfs_subr.c 2020/04/23 21:47:08 1.109
@@ -1,4 +1,4 @@
-/* $NetBSD: tmpfs_subr.c,v 1.108 2020/04/04 20:49:30 ad Exp $ */
+/* $NetBSD: tmpfs_subr.c,v 1.109 2020/04/23 21:47:08 ad Exp $ */
/*
* Copyright (c) 2005-2013 The NetBSD Foundation, Inc.
@@ -73,7 +73,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tmpfs_subr.c,v 1.108 2020/04/04 20:49:30 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tmpfs_subr.c,v 1.109 2020/04/23 21:47:08 ad Exp $");
#include <sys/param.h>
#include <sys/cprng.h>
@@ -929,7 +929,7 @@
size_t zerolen;
zerolen = MIN(round_page(newsize), node->tn_size) - newsize;
- ubc_zerorange(uobj, newsize, zerolen, UBC_UNMAP_FLAG(vp));
+ ubc_zerorange(uobj, newsize, zerolen, UBC_VNODE_FLAGS(vp));
}
node->tn_spec.tn_reg.tn_aobj_pages = newpages;
--- src/sys/fs/tmpfs/tmpfs_vnops.c 2020/03/14 13:39:36 1.135
+++ src/sys/fs/tmpfs/tmpfs_vnops.c 2020/04/23 21:47:08 1.136
@@ -1,4 +1,4 @@
-/* $NetBSD: tmpfs_vnops.c,v 1.135 2020/03/14 13:39:36 ad Exp $ */
+/* $NetBSD: tmpfs_vnops.c,v 1.136 2020/04/23 21:47:08 ad Exp $ */
/*
* Copyright (c) 2005, 2006, 2007 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tmpfs_vnops.c,v 1.135 2020/03/14 13:39:36 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tmpfs_vnops.c,v 1.136 2020/04/23 21:47:08 ad Exp $");
#include <sys/param.h>
#include <sys/dirent.h>
@@ -546,7 +546,7 @@
break;
}
error = ubc_uiomove(uobj, uio, len, IO_ADV_DECODE(ioflag),
- UBC_READ | UBC_PARTIALOK | UBC_UNMAP_FLAG(vp));
+ UBC_READ | UBC_PARTIALOK | UBC_VNODE_FLAGS(vp));
}
tmpfs_update(vp, TMPFS_UPDATE_ATIME);
@@ -608,7 +608,7 @@
break;
}
error = ubc_uiomove(uobj, uio, len, IO_ADV_DECODE(ioflag),
- UBC_WRITE | UBC_UNMAP_FLAG(vp));
+ UBC_WRITE | UBC_VNODE_FLAGS(vp));
}
if (error) {
(void)tmpfs_reg_resize(vp, oldsize);
--- src/sys/fs/udf/udf_allocation.c 2018/10/14 17:37:40 1.40
+++ src/sys/fs/udf/udf_allocation.c 2020/04/23 21:47:08 1.41
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_allocation.c,v 1.40 2018/10/14 17:37:40 jdolecek Exp $ */
+/* $NetBSD: udf_allocation.c,v 1.41 2020/04/23 21:47:08 ad Exp $ */
/*
* Copyright (c) 2006, 2008 Reinoud Zandijk
@@ -28,7 +28,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__KERNEL_RCSID(0, "$NetBSD: udf_allocation.c,v 1.40 2018/10/14 17:37:40 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udf_allocation.c,v 1.41 2020/04/23 21:47:08 ad Exp $");
#endif /* not lint */
@@ -2678,7 +2678,7 @@
#if 0
/* zero append space in buffer */
ubc_zerorange(&vp->v_uobj, old_size,
- new_size - old_size, UBC_UNMAP_FLAG(vp));
+ new_size - old_size, UBC_VNODE_FLAGS(vp));
#endif
udf_node_sanity_check(udf_node, &new_inflen, &new_lbrec);
@@ -2784,7 +2784,7 @@
/* TODO zero appened space in buffer! */
/* using ubc_zerorange(&vp->v_uobj, old_size, */
- /* new_size - old_size, UBC_UNMAP_FLAG(vp)); ? */
+ /* new_size - old_size, UBC_VNODE_FLAGS(vp)); ? */
}
memset(&s_ad, 0, sizeof(struct long_ad));
@@ -2955,7 +2955,7 @@
/* TODO zero appened space in buffer! */
/* using ubc_zerorange(&vp->v_uobj, old_size, */
- /* old_size - new_size, UBC_UNMAP_FLAG(vp)); ? */
+ /* old_size - new_size, UBC_VNODE_FLAGS(vp)); ? */
/* set new size for uvm */
uvm_vnp_setsize(vp, new_size);
--- src/sys/fs/udf/udf_vnops.c 2020/04/14 11:45:42 1.111
+++ src/sys/fs/udf/udf_vnops.c 2020/04/23 21:47:08 1.112
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_vnops.c,v 1.111 2020/04/14 11:45:42 reinoud Exp $ */
+/* $NetBSD: udf_vnops.c,v 1.112 2020/04/23 21:47:08 ad Exp $ */
/*
* Copyright (c) 2006, 2008 Reinoud Zandijk
@@ -32,7 +32,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__KERNEL_RCSID(0, "$NetBSD: udf_vnops.c,v 1.111 2020/04/14 11:45:42 reinoud Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udf_vnops.c,v 1.112 2020/04/23 21:47:08 ad Exp $");
#endif /* not lint */
@@ -248,7 +248,7 @@
/* ubc, here we come, prepare to trap */
error = ubc_uiomove(uobj, uio, len, advice,
- UBC_READ | UBC_PARTIALOK | UBC_UNMAP_FLAG(vp));
+ UBC_READ | UBC_PARTIALOK | UBC_VNODE_FLAGS(vp));
if (error)
break;
}
@@ -366,7 +366,7 @@
/* ubc, here we come, prepare to trap */
error = ubc_uiomove(uobj, uio, len, advice,
- UBC_WRITE | UBC_UNMAP_FLAG(vp));
+ UBC_WRITE | UBC_VNODE_FLAGS(vp));
if (error)
break;
--- src/sys/fs/v7fs/v7fs_vnops.c 2020/04/13 19:23:18 1.28
+++ src/sys/fs/v7fs/v7fs_vnops.c 2020/04/23 21:47:08 1.29
@@ -1,4 +1,4 @@
-/* $NetBSD: v7fs_vnops.c,v 1.28 2020/04/13 19:23:18 ad Exp $ */
+/* $NetBSD: v7fs_vnops.c,v 1.29 2020/04/23 21:47:08 ad Exp $ */
/*-
* Copyright (c) 2004, 2011 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: v7fs_vnops.c,v 1.28 2020/04/13 19:23:18 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: v7fs_vnops.c,v 1.29 2020/04/23 21:47:08 ad Exp $");
#if defined _KERNEL_OPT
#include "opt_v7fs.h"
#endif
@@ -592,7 +592,7 @@
break;
error = ubc_uiomove(&vp->v_uobj, uio, sz, advice, UBC_READ |
- UBC_PARTIALOK | UBC_UNMAP_FLAG(v));
+ UBC_PARTIALOK | UBC_VNODE_FLAGS(vp));
if (error) {
break;
}
@@ -644,7 +644,7 @@
while (uio->uio_resid > 0) {
sz = uio->uio_resid;
if ((error = ubc_uiomove(&vp->v_uobj, uio, sz, advice,
- UBC_WRITE | UBC_UNMAP_FLAG(v))))
+ UBC_WRITE | UBC_VNODE_FLAGS(vp))))
break;
DPRINTF("write %zubyte\n", sz);
}
--- src/sys/nfs/nfs_bio.c 2020/03/22 18:32:42 1.195
+++ src/sys/nfs/nfs_bio.c 2020/04/23 21:47:08 1.196
@@ -1,4 +1,4 @@
-/* $NetBSD: nfs_bio.c,v 1.195 2020/03/22 18:32:42 ad Exp $ */
+/* $NetBSD: nfs_bio.c,v 1.196 2020/04/23 21:47:08 ad Exp $ */
/*
* Copyright (c) 1989, 1993
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nfs_bio.c,v 1.195 2020/03/22 18:32:42 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nfs_bio.c,v 1.196 2020/04/23 21:47:08 ad Exp $");
#ifdef _KERNEL_OPT
#include "opt_nfs.h"
@@ -158,7 +158,7 @@
bytelen =
MIN(np->n_size - uio->uio_offset, uio->uio_resid);
error = ubc_uiomove(&vp->v_uobj, uio, bytelen, advice,
- UBC_READ | UBC_PARTIALOK | UBC_UNMAP_FLAG(vp));
+ UBC_READ | UBC_PARTIALOK | UBC_VNODE_FLAGS(vp));
if (error) {
/*
* XXXkludge
@@ -531,7 +531,7 @@
error = ubc_uiomove(&vp->v_uobj, uio, bytelen,
UVM_ADV_RANDOM, UBC_WRITE | UBC_PARTIALOK |
(overwrite ? UBC_FAULTBUSY : 0) |
- UBC_UNMAP_FLAG(vp));
+ UBC_VNODE_FLAGS(vp));
if (error) {
uvm_vnp_setwritesize(vp, vp->v_size);
if (overwrite && np->n_size != oldsize) {
--- src/sys/rump/librump/rumpvfs/rumpfs.c 2020/04/13 19:23:20 1.156
+++ src/sys/rump/librump/rumpvfs/rumpfs.c 2020/04/23 21:47:08 1.157
@@ -1,4 +1,4 @@
-/* $NetBSD: rumpfs.c,v 1.156 2020/04/13 19:23:20 ad Exp $ */
+/* $NetBSD: rumpfs.c,v 1.157 2020/04/23 21:47:08 ad Exp $ */
/*
* Copyright (c) 2009, 2010, 2011 Antti Kantee. All Rights Reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.156 2020/04/13 19:23:20 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.157 2020/04/23 21:47:08 ad Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -1403,7 +1403,7 @@
if (chunk == 0)
break;
error = ubc_uiomove(&vp->v_uobj, uio, chunk, advice,
- UBC_READ | UBC_PARTIALOK | UBC_UNMAP_FLAG(vp));
+ UBC_READ | UBC_PARTIALOK | UBC_VNODE_FLAGS(vp));
if (error)
break;
}
@@ -1505,7 +1505,7 @@
if (chunk == 0)
break;
error = ubc_uiomove(&vp->v_uobj, uio, chunk, advice,
- UBC_WRITE | UBC_PARTIALOK | UBC_UNMAP_FLAG(vp));
+ UBC_WRITE | UBC_PARTIALOK | UBC_VNODE_FLAGS(vp));
if (error)
break;
}
--- src/sys/ufs/chfs/chfs_subr.c 2019/12/31 13:07:13 1.11
+++ src/sys/ufs/chfs/chfs_subr.c 2020/04/23 21:47:08 1.12
@@ -1,4 +1,4 @@
-/* $NetBSD: chfs_subr.c,v 1.11 2019/12/31 13:07:13 ad Exp $ */
+/* $NetBSD: chfs_subr.c,v 1.12 2020/04/23 21:47:08 ad Exp $ */
/*-
* Copyright (c) 2010 Department of Software Engineering,
@@ -232,7 +232,7 @@
}
if (size != 0) {
- ubc_zerorange(&vp->v_uobj, size, ip->size - size, UBC_UNMAP_FLAG(vp));
+ ubc_zerorange(&vp->v_uobj, size, ip->size - size, UBC_VNODE_FLAGS(vp));
}
/* drop unused fragments */
--- src/sys/ufs/chfs/chfs_vnops.c 2020/04/04 20:49:31 1.37
+++ src/sys/ufs/chfs/chfs_vnops.c 2020/04/23 21:47:08 1.38
@@ -1,4 +1,4 @@
-/* $NetBSD: chfs_vnops.c,v 1.37 2020/04/04 20:49:31 ad Exp $ */
+/* $NetBSD: chfs_vnops.c,v 1.38 2020/04/23 21:47:08 ad Exp $ */
/*-
* Copyright (c) 2010 Department of Software Engineering,
@@ -675,8 +675,7 @@
if (bytelen == 0)
break;
error = ubc_uiomove(&vp->v_uobj, uio, bytelen, advice,
- UBC_READ | UBC_PARTIALOK |
- (UBC_WANT_UNMAP(vp) ? UBC_UNMAP : 0));
+ UBC_READ | UBC_PARTIALOK | UBC_VNODE_FLAGS(vp));
if (error)
break;
@@ -933,7 +932,7 @@
* copy the data.
*/
- ubc_flags |= UBC_WANT_UNMAP(vp) ? UBC_UNMAP : 0;
+ ubc_flags |= UBC_VNODE_FLAGS(vp);
error = ubc_uiomove(&vp->v_uobj, uio, bytelen,
IO_ADV_DECODE(ioflag), ubc_flags);
--- src/sys/ufs/ext2fs/ext2fs_inode.c 2017/05/26 14:34:20 1.88
+++ src/sys/ufs/ext2fs/ext2fs_inode.c 2020/04/23 21:47:08 1.89
@@ -1,4 +1,4 @@
-/* $NetBSD: ext2fs_inode.c,v 1.88 2017/05/26 14:34:20 riastradh Exp $ */
+/* $NetBSD: ext2fs_inode.c,v 1.89 2020/04/23 21:47:08 ad Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1993
@@ -60,7 +60,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ext2fs_inode.c,v 1.88 2017/05/26 14:34:20 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_inode.c,v 1.89 2020/04/23 21:47:08 ad Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -360,7 +360,7 @@
/* XXXUBC we should handle more than just VREG */
ubc_zerorange(&ovp->v_uobj, length, size - offset,
- UBC_UNMAP_FLAG(ovp));
+ UBC_VNODE_FLAGS(ovp));
}
(void)ext2fs_setsize(oip, length);
uvm_vnp_setsize(ovp, length);
--- src/sys/ufs/ext2fs/ext2fs_readwrite.c 2020/02/23 15:46:42 1.76
+++ src/sys/ufs/ext2fs/ext2fs_readwrite.c 2020/04/23 21:47:08 1.77
@@ -1,4 +1,4 @@
-/* $NetBSD: ext2fs_readwrite.c,v 1.76 2020/02/23 15:46:42 ad Exp $ */
+/* $NetBSD: ext2fs_readwrite.c,v 1.77 2020/04/23 21:47:08 ad Exp $ */
/*-
* Copyright (c) 1993
@@ -60,7 +60,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ext2fs_readwrite.c,v 1.76 2020/02/23 15:46:42 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_readwrite.c,v 1.77 2020/04/23 21:47:08 ad Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -135,7 +135,7 @@
break;
error = ubc_uiomove(&vp->v_uobj, uio, bytelen, advice,
- UBC_READ | UBC_PARTIALOK | UBC_UNMAP_FLAG(vp));
+ UBC_READ | UBC_PARTIALOK | UBC_VNODE_FLAGS(vp));
if (error)
break;
}
@@ -316,7 +316,7 @@
if (error)
break;
error = ubc_uiomove(&vp->v_uobj, uio, bytelen, advice,
- UBC_WRITE | UBC_UNMAP_FLAG(vp));
+ UBC_WRITE | UBC_VNODE_FLAGS(vp));
if (error)
break;
--- src/sys/ufs/ffs/ffs_inode.c 2020/04/18 19:18:34 1.127
+++ src/sys/ufs/ffs/ffs_inode.c 2020/04/23 21:47:09 1.128
@@ -1,4 +1,4 @@
-/* $NetBSD: ffs_inode.c,v 1.127 2020/04/18 19:18:34 christos Exp $ */
+/* $NetBSD: ffs_inode.c,v 1.128 2020/04/23 21:47:09 ad Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ffs_inode.c,v 1.127 2020/04/18 19:18:34 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ffs_inode.c,v 1.128 2020/04/23 21:47:09 ad Exp $");
#if defined(_KERNEL_OPT)
#include "opt_ffs.h"
@@ -364,7 +364,7 @@
eoz = MIN(MAX(ffs_lblktosize(fs, lbn) + size, round_page(pgoffset)),
osize);
ubc_zerorange(&ovp->v_uobj, length, eoz - length,
- UBC_UNMAP_FLAG(ovp));
+ UBC_VNODE_FLAGS(ovp));
if (round_page(eoz) > round_page(length)) {
rw_enter(ovp->v_uobj.vmobjlock, RW_WRITER);
error = VOP_PUTPAGES(ovp, round_page(length),
--- src/sys/ufs/lfs/lfs_inode.c 2020/02/23 15:46:42 1.159
+++ src/sys/ufs/lfs/lfs_inode.c 2020/04/23 21:47:09 1.160
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_inode.c,v 1.159 2020/02/23 15:46:42 ad Exp $ */
+/* $NetBSD: lfs_inode.c,v 1.160 2020/04/23 21:47:09 ad Exp $ */
/*-
* Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_inode.c,v 1.159 2020/02/23 15:46:42 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_inode.c,v 1.160 2020/04/23 21:47:09 ad Exp $");
#if defined(_KERNEL_OPT)
#include "opt_quota.h"
@@ -409,7 +409,7 @@
size = lfs_blksize(fs, oip, xlbn);
eoz = MIN(lfs_lblktosize(fs, xlbn) + size, osize);
ubc_zerorange(&ovp->v_uobj, length, eoz - length,
- UBC_UNMAP_FLAG(ovp));
+ UBC_VNODE_FLAGS(ovp));
if (round_page(eoz) > round_page(length)) {
rw_enter(ovp->v_uobj.vmobjlock, RW_WRITER);
error = VOP_PUTPAGES(ovp, round_page(length),
--- src/sys/ufs/lfs/ulfs_readwrite.c 2020/02/23 15:46:42 1.26
+++ src/sys/ufs/lfs/ulfs_readwrite.c 2020/04/23 21:47:09 1.27
@@ -1,4 +1,4 @@
-/* $NetBSD: ulfs_readwrite.c,v 1.26 2020/02/23 15:46:42 ad Exp $ */
+/* $NetBSD: ulfs_readwrite.c,v 1.27 2020/04/23 21:47:09 ad Exp $ */
/* from NetBSD: ufs_readwrite.c,v 1.120 2015/04/12 22:48:38 riastradh Exp */
/*-
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: ulfs_readwrite.c,v 1.26 2020/02/23 15:46:42 ad Exp $");
+__KERNEL_RCSID(1, "$NetBSD: ulfs_readwrite.c,v 1.27 2020/04/23 21:47:09 ad Exp $");
#define FS struct lfs
#define I_FS i_lfs
@@ -105,7 +105,7 @@
if (bytelen == 0)
break;
error = ubc_uiomove(&vp->v_uobj, uio, bytelen, advice,
- UBC_READ | UBC_PARTIALOK | UBC_UNMAP_FLAG(vp));
+ UBC_READ | UBC_PARTIALOK | UBC_VNODE_FLAGS(vp));
if (error)
break;
}
@@ -373,7 +373,7 @@
*/
error = ubc_uiomove(&vp->v_uobj, uio, bytelen,
- IO_ADV_DECODE(ioflag), ubc_flags | UBC_UNMAP_FLAG(vp));
+ IO_ADV_DECODE(ioflag), ubc_flags | UBC_VNODE_FLAGS(vp));
/*
* update UVM's notion of the size now that we've
--- src/sys/ufs/ufs/ufs_readwrite.c 2020/02/23 15:46:43 1.125
+++ src/sys/ufs/ufs/ufs_readwrite.c 2020/04/23 21:47:09 1.126
@@ -1,4 +1,4 @@
-/* $NetBSD: ufs_readwrite.c,v 1.125 2020/02/23 15:46:43 ad Exp $ */
+/* $NetBSD: ufs_readwrite.c,v 1.126 2020/04/23 21:47:09 ad Exp $ */
/*-
* Copyright (c) 1993
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: ufs_readwrite.c,v 1.125 2020/02/23 15:46:43 ad Exp $");
+__KERNEL_RCSID(1, "$NetBSD: ufs_readwrite.c,v 1.126 2020/04/23 21:47:09 ad Exp $");
#define FS struct fs
#define I_FS i_fs
@@ -106,7 +106,7 @@
if (bytelen == 0)
break;
error = ubc_uiomove(&vp->v_uobj, uio, bytelen, advice,
- UBC_READ | UBC_PARTIALOK | UBC_UNMAP_FLAG(vp));
+ UBC_READ | UBC_PARTIALOK | UBC_VNODE_FLAGS(vp));
if (error)
break;
}
@@ -408,7 +408,7 @@
*/
error = ubc_uiomove(&vp->v_uobj, uio, bytelen,
- IO_ADV_DECODE(ioflag), ubc_flags | UBC_UNMAP_FLAG(vp));
+ IO_ADV_DECODE(ioflag), ubc_flags | UBC_VNODE_FLAGS(vp));
/*
* update UVM's notion of the size now that we've
--- src/sys/uvm/uvm_bio.c 2020/04/23 21:12:06 1.109
+++ src/sys/uvm/uvm_bio.c 2020/04/23 21:47:09 1.110
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_bio.c,v 1.109 2020/04/23 21:12:06 ad Exp $ */
+/* $NetBSD: uvm_bio.c,v 1.110 2020/04/23 21:47:09 ad Exp $ */
/*
* Copyright (c) 1998 Chuck Silvers.
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_bio.c,v 1.109 2020/04/23 21:12:06 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_bio.c,v 1.110 2020/04/23 21:47:09 ad Exp $");
#include "opt_uvmhist.h"
#include "opt_ubc.h"
@@ -734,25 +734,17 @@
((flags & UBC_READ) != 0 && uio->uio_rw == UIO_READ));
#ifdef UBC_USE_PMAP_DIRECT
- if (ubc_direct && UVM_OBJ_IS_VNODE(uobj)) {
- /*
- * during direct access pages need to be held busy to
- * prevent them disappearing. if the LWP reads or writes
- * a vnode into a mapped view of same it could deadlock.
- * prevent this by disallowing direct access if the vnode
- * is visible somewhere via mmap().
- *
- * the vnode flags are tested here, but at all points UBC is
- * called for vnodes, the vnode is locked (thus preventing a
- * new mapping via mmap() while busy here).
- */
+ /*
+ * during direct access pages need to be held busy to prevent them
+ * changing identity, and therefore if we read or write an object
+ * into a mapped view of same we could deadlock while faulting.
+ *
+ * avoid the problem by disallowing direct access if the object
+ * might be visible somewhere via mmap().
+ */
- struct vnode *vp = (struct vnode *)uobj;
- KASSERT(VOP_ISLOCKED(vp) != LK_NONE);
- if ((vp->v_vflag & VV_MAPPED) == 0) {
- return ubc_uiomove_direct(uobj, uio, todo, advice,
- flags);
- }
+ if (ubc_direct && (flags & UBC_ISMAPPED) == 0) {
+ return ubc_uiomove_direct(uobj, uio, todo, advice, flags);
}
#endif
--- src/sys/uvm/uvm_extern.h 2020/04/18 03:27:13 1.223
+++ src/sys/uvm/uvm_extern.h 2020/04/23 21:47:09 1.224
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_extern.h,v 1.223 2020/04/18 03:27:13 thorpej Exp $ */
+/* $NetBSD: uvm_extern.h,v 1.224 2020/04/23 21:47:09 ad Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -226,6 +226,7 @@
#define UBC_FAULTBUSY 0x004 /* nobody else is using these pages, so busy
* them at alloc and unbusy at release (e.g.,
* for writes extending a file) */
+#define UBC_ISMAPPED 0x008 /* object may be mapped by a process */
/*
* flags for ubc_release()
@@ -549,11 +550,13 @@
* helpers for calling ubc_release()
*/
#ifdef PMAP_CACHE_VIVT
-#define UBC_WANT_UNMAP(vp) (((vp)->v_iflag & VI_TEXT) != 0)
+#define UBC_VNODE_FLAGS(vp) \
+ ((((vp)->v_iflag & VI_TEXT) != 0 ? UBC_UNMAP : 0) |
+ (((vp)->v_vflag & VV_MAPPED) != 0 ? UBC_ISMAPPED : 0))
#else
-#define UBC_WANT_UNMAP(vp) false
+#define UBC_VNODE_FLAGS(vp) \
+ (((vp)->v_vflag & VV_MAPPED) != 0 ? UBC_ISMAPPED : 0)
#endif
-#define UBC_UNMAP_FLAG(vp) (UBC_WANT_UNMAP(vp) ? UBC_UNMAP : 0)
#if defined(_KERNEL) || defined(_KMEMUSER)
/*