Module Name: src Committed By: hannken Date: Thu Jun 16 09:21:04 UTC 2011
Modified Files: src/sys/fs/msdosfs: msdosfs_denode.c msdosfs_vnops.c src/sys/fs/tmpfs: tmpfs_subr.c src/sys/fs/udf: udf_allocation.c src/sys/rump/librump/rumpvfs: vm_vfs.c src/sys/ufs/ext2fs: ext2fs_inode.c src/sys/ufs/ffs: ffs_inode.c src/sys/ufs/lfs: lfs_inode.c src/sys/uvm: uvm_bio.c uvm_extern.h Log Message: Rename uvm_vnp_zerorange(struct vnode *, off_t, size_t) to ubc_zerorange(struct uvm_object *, off_t, size_t, int) changing the first argument to an uvm_object and adding a flags argument. Modify tmpfs_reg_resize() to zero the backing store (aobj) instead of the vnode. Ubc_purge() no longer panics when unmounting tmpfs. Keep uvm_vnp_zerorange() until the next kernel version bump. To generate a diff of this commit: cvs rdiff -u -r1.45 -r1.46 src/sys/fs/msdosfs/msdosfs_denode.c cvs rdiff -u -r1.76 -r1.77 src/sys/fs/msdosfs/msdosfs_vnops.c cvs rdiff -u -r1.73 -r1.74 src/sys/fs/tmpfs/tmpfs_subr.c cvs rdiff -u -r1.31 -r1.32 src/sys/fs/udf/udf_allocation.c cvs rdiff -u -r1.29 -r1.30 src/sys/rump/librump/rumpvfs/vm_vfs.c cvs rdiff -u -r1.73 -r1.74 src/sys/ufs/ext2fs/ext2fs_inode.c cvs rdiff -u -r1.106 -r1.107 src/sys/ufs/ffs/ffs_inode.c cvs rdiff -u -r1.123 -r1.124 src/sys/ufs/lfs/lfs_inode.c cvs rdiff -u -r1.73 -r1.74 src/sys/uvm/uvm_bio.c cvs rdiff -u -r1.173 -r1.174 src/sys/uvm/uvm_extern.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/fs/msdosfs/msdosfs_denode.c diff -u src/sys/fs/msdosfs/msdosfs_denode.c:1.45 src/sys/fs/msdosfs/msdosfs_denode.c:1.46 --- src/sys/fs/msdosfs/msdosfs_denode.c:1.45 Sun Jun 12 03:35:53 2011 +++ src/sys/fs/msdosfs/msdosfs_denode.c Thu Jun 16 09:21:02 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: msdosfs_denode.c,v 1.45 2011/06/12 03:35:53 rmind Exp $ */ +/* $NetBSD: msdosfs_denode.c,v 1.46 2011/06/16 09:21:02 hannken 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.45 2011/06/12 03:35:53 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: msdosfs_denode.c,v 1.46 2011/06/16 09:21:02 hannken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -537,8 +537,9 @@ else bdwrite(bp); } else { - uvm_vnp_zerorange(DETOV(dep), length, - pmp->pm_bpcluster - boff); + ubc_zerorange(&DETOV(dep)->v_uobj, length, + pmp->pm_bpcluster - boff, + UBC_UNMAP_FLAG(DETOV(dep))); } } @@ -626,7 +627,7 @@ } /* - * Zero extend file range; uvm_vnp_zerorange() uses ubc_alloc() and a + * Zero extend file range; ubc_zerorange() uses ubc_alloc() and a * memset(); we set the write size so ubc won't read in file data that * is zero'd later. */ @@ -634,8 +635,9 @@ dep->de_FileSize = length; uvm_vnp_setwritesize(DETOV(dep), (voff_t)dep->de_FileSize); dep->de_flag |= DE_UPDATE|DE_MODIFIED; - uvm_vnp_zerorange(DETOV(dep), (off_t)osize, - (size_t)(round_page(dep->de_FileSize) - osize)); + ubc_zerorange(&DETOV(dep)->v_uobj, (off_t)osize, + (size_t)(round_page(dep->de_FileSize) - osize), + UBC_UNMAP_FLAG(DETOV(dep))); uvm_vnp_setsize(DETOV(dep), (voff_t)dep->de_FileSize); return (deupdat(dep, 1)); } Index: src/sys/fs/msdosfs/msdosfs_vnops.c diff -u src/sys/fs/msdosfs/msdosfs_vnops.c:1.76 src/sys/fs/msdosfs/msdosfs_vnops.c:1.77 --- src/sys/fs/msdosfs/msdosfs_vnops.c:1.76 Sun Jun 12 03:35:53 2011 +++ src/sys/fs/msdosfs/msdosfs_vnops.c Thu Jun 16 09:21:02 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: msdosfs_vnops.c,v 1.76 2011/06/12 03:35:53 rmind Exp $ */ +/* $NetBSD: msdosfs_vnops.c,v 1.77 2011/06/16 09:21:02 hannken 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.76 2011/06/12 03:35:53 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.77 2011/06/16 09:21:02 hannken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -627,7 +627,8 @@ /* zero out the remainder of the last page */ rem = round_page(dep->de_FileSize) - dep->de_FileSize; if (rem > 0) - uvm_vnp_zerorange(vp, (off_t)dep->de_FileSize, rem); + ubc_zerorange(&vp->v_uobj, (off_t)dep->de_FileSize, + rem, UBC_UNMAP_FLAG(vp)); extended = 1; } Index: src/sys/fs/tmpfs/tmpfs_subr.c diff -u src/sys/fs/tmpfs/tmpfs_subr.c:1.73 src/sys/fs/tmpfs/tmpfs_subr.c:1.74 --- src/sys/fs/tmpfs/tmpfs_subr.c:1.73 Sun Jun 12 03:35:54 2011 +++ src/sys/fs/tmpfs/tmpfs_subr.c Thu Jun 16 09:21:02 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: tmpfs_subr.c,v 1.73 2011/06/12 03:35:54 rmind Exp $ */ +/* $NetBSD: tmpfs_subr.c,v 1.74 2011/06/16 09:21:02 hannken Exp $ */ /* * Copyright (c) 2005-2011 The NetBSD Foundation, Inc. @@ -74,7 +74,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tmpfs_subr.c,v 1.73 2011/06/12 03:35:54 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tmpfs_subr.c,v 1.74 2011/06/16 09:21:02 hannken Exp $"); #include <sys/param.h> #include <sys/dirent.h> @@ -803,6 +803,7 @@ { tmpfs_mount_t *tmp = VFS_TO_TMPFS(vp->v_mount); tmpfs_node_t *node = VP_TO_TMPFS_NODE(vp); + struct uvm_object *uobj = node->tn_spec.tn_reg.tn_aobj; size_t newpages, oldpages; off_t oldsize; @@ -822,8 +823,7 @@ } else if (newsize < oldsize) { int zerolen = MIN(round_page(newsize), node->tn_size) - newsize; - /* Zero out the truncated part of the last page. */ - uvm_vnp_zerorange(vp, newsize, zerolen); + ubc_zerorange(uobj, newsize, zerolen, UBC_UNMAP_FLAG(vp)); } node->tn_spec.tn_reg.tn_aobj_pages = newpages; @@ -834,9 +834,6 @@ * Free "backing store". */ if (newpages < oldpages) { - struct uvm_object *uobj; - - uobj = node->tn_spec.tn_reg.tn_aobj; KASSERT(uobj->vmobjlock == vp->v_interlock); mutex_enter(uobj->vmobjlock); Index: src/sys/fs/udf/udf_allocation.c diff -u src/sys/fs/udf/udf_allocation.c:1.31 src/sys/fs/udf/udf_allocation.c:1.32 --- src/sys/fs/udf/udf_allocation.c:1.31 Fri Jan 14 09:09:18 2011 +++ src/sys/fs/udf/udf_allocation.c Thu Jun 16 09:21:02 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: udf_allocation.c,v 1.31 2011/01/14 09:09:18 reinoud Exp $ */ +/* $NetBSD: udf_allocation.c,v 1.32 2011/06/16 09:21:02 hannken 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.31 2011/01/14 09:09:18 reinoud Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udf_allocation.c,v 1.32 2011/06/16 09:21:02 hannken Exp $"); #endif /* not lint */ @@ -2711,7 +2711,8 @@ #if 0 /* zero append space in buffer */ - uvm_vnp_zerorange(vp, old_size, new_size - old_size); + ubc_zerorange(&vp->v_uobj, old_size, + new_size - old_size, UBC_UNMAP_FLAG(vp)); #endif udf_node_sanity_check(udf_node, &new_inflen, &new_lbrec); @@ -2817,7 +2818,8 @@ c_ad.len = udf_rw32(len | flags); /* TODO zero appened space in buffer! */ - /* using uvm_vnp_zerorange(vp, old_size, new_size - old_size); ? */ + /* using ubc_zerorange(&vp->v_uobj, old_size, */ + /* new_size - old_size, UBC_UNMAP_FLAG(vp)); ? */ } memset(&s_ad, 0, sizeof(struct long_ad)); @@ -2987,7 +2989,8 @@ memset(data_pos + new_size, 0, old_size - new_size); /* TODO zero appened space in buffer! */ - /* using uvm_vnp_zerorange(vp, old_size, old_size - new_size); ? */ + /* using ubc_zerorange(&vp->v_uobj, old_size, */ + /* old_size - new_size, UBC_UNMAP_FLAG(vp)); ? */ /* set new size for uvm */ uvm_vnp_setsize(vp, new_size); Index: src/sys/rump/librump/rumpvfs/vm_vfs.c diff -u src/sys/rump/librump/rumpvfs/vm_vfs.c:1.29 src/sys/rump/librump/rumpvfs/vm_vfs.c:1.30 --- src/sys/rump/librump/rumpvfs/vm_vfs.c:1.29 Sun Jun 12 03:35:59 2011 +++ src/sys/rump/librump/rumpvfs/vm_vfs.c Thu Jun 16 09:21:03 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: vm_vfs.c,v 1.29 2011/06/12 03:35:59 rmind Exp $ */ +/* $NetBSD: vm_vfs.c,v 1.30 2011/06/16 09:21:03 hannken Exp $ */ /* * Copyright (c) 2008-2011 Antti Kantee. All Rights Reserved. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vm_vfs.c,v 1.29 2011/06/12 03:35:59 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vm_vfs.c,v 1.30 2011/06/16 09:21:03 hannken Exp $"); #include <sys/param.h> @@ -102,9 +102,8 @@ #define PAGERFLAGS (PGO_SYNCIO | PGO_NOBLOCKALLOC | PGO_NOTIMESTAMP) void -uvm_vnp_zerorange(struct vnode *vp, off_t off, size_t len) +ubc_zerorange(struct uvm_object *uobj, off_t off, size_t len, int flags) { - struct uvm_object *uobj = &vp->v_uobj; struct vm_page **pgs; struct uvm_object *pguobj; int maxpages = MIN(32, round_page(len) >> PAGE_SHIFT); Index: src/sys/ufs/ext2fs/ext2fs_inode.c diff -u src/sys/ufs/ext2fs/ext2fs_inode.c:1.73 src/sys/ufs/ext2fs/ext2fs_inode.c:1.74 --- src/sys/ufs/ext2fs/ext2fs_inode.c:1.73 Wed Jul 28 11:03:48 2010 +++ src/sys/ufs/ext2fs/ext2fs_inode.c Thu Jun 16 09:21:03 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: ext2fs_inode.c,v 1.73 2010/07/28 11:03:48 hannken Exp $ */ +/* $NetBSD: ext2fs_inode.c,v 1.74 2011/06/16 09:21:03 hannken Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1993 @@ -60,7 +60,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ext2fs_inode.c,v 1.73 2010/07/28 11:03:48 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ext2fs_inode.c,v 1.74 2011/06/16 09:21:03 hannken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -311,7 +311,8 @@ size = fs->e2fs_bsize; /* XXXUBC we should handle more than just VREG */ - uvm_vnp_zerorange(ovp, length, size - offset); + ubc_zerorange(&ovp->v_uobj, length, size - offset, + UBC_UNMAP_FLAG(ovp)); } (void)ext2fs_setsize(oip, length); uvm_vnp_setsize(ovp, length); Index: src/sys/ufs/ffs/ffs_inode.c diff -u src/sys/ufs/ffs/ffs_inode.c:1.106 src/sys/ufs/ffs/ffs_inode.c:1.107 --- src/sys/ufs/ffs/ffs_inode.c:1.106 Sun Jun 12 03:36:00 2011 +++ src/sys/ufs/ffs/ffs_inode.c Thu Jun 16 09:21:03 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: ffs_inode.c,v 1.106 2011/06/12 03:36:00 rmind Exp $ */ +/* $NetBSD: ffs_inode.c,v 1.107 2011/06/16 09:21:03 hannken 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.106 2011/06/12 03:36:00 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ffs_inode.c,v 1.107 2011/06/16 09:21:03 hannken Exp $"); #if defined(_KERNEL_OPT) #include "opt_ffs.h" @@ -321,7 +321,8 @@ size = blksize(fs, oip, lbn); eoz = MIN(MAX(lblktosize(fs, lbn) + size, round_page(pgoffset)), osize); - uvm_vnp_zerorange(ovp, length, eoz - length); + ubc_zerorange(&ovp->v_uobj, length, eoz - length, + UBC_UNMAP_FLAG(ovp)); if (round_page(eoz) > round_page(length)) { mutex_enter(ovp->v_interlock); error = VOP_PUTPAGES(ovp, round_page(length), Index: src/sys/ufs/lfs/lfs_inode.c diff -u src/sys/ufs/lfs/lfs_inode.c:1.123 src/sys/ufs/lfs/lfs_inode.c:1.124 --- src/sys/ufs/lfs/lfs_inode.c:1.123 Sun Jun 12 03:36:01 2011 +++ src/sys/ufs/lfs/lfs_inode.c Thu Jun 16 09:21:03 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_inode.c,v 1.123 2011/06/12 03:36:01 rmind Exp $ */ +/* $NetBSD: lfs_inode.c,v 1.124 2011/06/16 09:21:03 hannken 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.123 2011/06/12 03:36:01 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_inode.c,v 1.124 2011/06/16 09:21:03 hannken Exp $"); #if defined(_KERNEL_OPT) #include "opt_quota.h" @@ -391,7 +391,8 @@ xlbn = lblkno(fs, length); size = blksize(fs, oip, xlbn); eoz = MIN(lblktosize(fs, xlbn) + size, osize); - uvm_vnp_zerorange(ovp, length, eoz - length); + ubc_zerorange(&ovp->v_uobj, length, eoz - length, + UBC_UNMAP_FLAG(ovp)); if (round_page(eoz) > round_page(length)) { mutex_enter(ovp->v_interlock); error = VOP_PUTPAGES(ovp, round_page(length), Index: src/sys/uvm/uvm_bio.c diff -u src/sys/uvm/uvm_bio.c:1.73 src/sys/uvm/uvm_bio.c:1.74 --- src/sys/uvm/uvm_bio.c:1.73 Sun Jun 12 03:36:02 2011 +++ src/sys/uvm/uvm_bio.c Thu Jun 16 09:21:03 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_bio.c,v 1.73 2011/06/12 03:36:02 rmind Exp $ */ +/* $NetBSD: uvm_bio.c,v 1.74 2011/06/16 09:21:03 hannken Exp $ */ /* * Copyright (c) 1998 Chuck Silvers. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uvm_bio.c,v 1.73 2011/06/12 03:36:02 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uvm_bio.c,v 1.74 2011/06/16 09:21:03 hannken Exp $"); #include "opt_uvmhist.h" #include "opt_ubc.h" @@ -744,14 +744,13 @@ } /* - * uvm_vnp_zerorange: set a range of bytes in a file to zero. + * ubc_zerorange: set a range of bytes in an object to zero. */ void -uvm_vnp_zerorange(struct vnode *vp, off_t off, size_t len) +ubc_zerorange(struct uvm_object *uobj, off_t off, size_t len, int flags) { void *win; - int flags; /* * XXXUBC invent kzero() and use it @@ -760,10 +759,8 @@ while (len) { vsize_t bytelen = len; - win = ubc_alloc(&vp->v_uobj, off, &bytelen, UVM_ADV_NORMAL, - UBC_WRITE); + win = ubc_alloc(uobj, off, &bytelen, UVM_ADV_NORMAL, UBC_WRITE); memset(win, 0, bytelen); - flags = UBC_WANT_UNMAP(vp) ? UBC_UNMAP : 0; ubc_release(win, flags); off += bytelen; @@ -772,6 +769,18 @@ } /* + * uvm_vnp_zerorange: set a range of bytes in a file to zero. + * WILL BE REMOVED AFTER THE NEXT KERNEL VERSION BUMP (5.99.54)! + */ +void uvm_vnp_zerorange(struct vnode *, off_t, size_t); +void +uvm_vnp_zerorange(struct vnode *vp, off_t off, size_t len) +{ + + ubc_zerorange(&vp->v_uobj, off, len, UBC_UNMAP_FLAG(vp)); +} + +/* * ubc_purge: disassociate ubc_map structures from an empty uvm_object. */ Index: src/sys/uvm/uvm_extern.h diff -u src/sys/uvm/uvm_extern.h:1.173 src/sys/uvm/uvm_extern.h:1.174 --- src/sys/uvm/uvm_extern.h:1.173 Sun Jun 12 03:36:02 2011 +++ src/sys/uvm/uvm_extern.h Thu Jun 16 09:21:03 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_extern.h,v 1.173 2011/06/12 03:36:02 rmind Exp $ */ +/* $NetBSD: uvm_extern.h,v 1.174 2011/06/16 09:21:03 hannken Exp $ */ /* * Copyright (c) 1997 Charles D. Cranor and Washington University. @@ -574,6 +574,7 @@ void ubc_release(void *, int); int ubc_uiomove(struct uvm_object *, struct uio *, vsize_t, int, int); +void ubc_zerorange(struct uvm_object *, off_t, size_t, int); void ubc_purge(struct uvm_object *); /* uvm_emap.c */ @@ -756,7 +757,6 @@ void uvm_vnp_setwritesize(struct vnode *, voff_t); int uvn_findpages(struct uvm_object *, voff_t, int *, struct vm_page **, int); -void uvm_vnp_zerorange(struct vnode *, off_t, size_t); bool uvn_text_p(struct uvm_object *); bool uvn_clean_p(struct uvm_object *); bool uvn_needs_writefault_p(struct uvm_object *);