Date: Thu, 2 May 2013 18:53:59 GMT From: John Baldwin <jhb@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 228334 for review Message-ID: <201305021853.r42Irx06097058@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@228334?ac=10 Change 228334 by jhb@jhb_jhbbsd on 2013/05/02 18:53:11 IFC @228332 Affected files ... .. //depot/projects/smpng/sys/fs/tmpfs/tmpfs.h#16 integrate .. //depot/projects/smpng/sys/fs/tmpfs/tmpfs_subr.c#22 integrate .. //depot/projects/smpng/sys/fs/tmpfs/tmpfs_vnops.c#27 integrate .. //depot/projects/smpng/sys/vm/vm_mmap.c#98 integrate Differences ... ==== //depot/projects/smpng/sys/fs/tmpfs/tmpfs.h#16 (text+ko) ==== @@ -29,7 +29,7 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD: head/sys/fs/tmpfs/tmpfs.h 248597 2013-03-21 22:44:33Z pjd $ + * $FreeBSD: head/sys/fs/tmpfs/tmpfs.h 250189 2013-05-02 18:44:31Z kib $ */ #ifndef _FS_TMPFS_TMPFS_H_ @@ -402,6 +402,7 @@ const char *, u_int, struct tmpfs_dirent **); void tmpfs_free_dirent(struct tmpfs_mount *, struct tmpfs_dirent *); void tmpfs_dirent_init(struct tmpfs_dirent *, const char *, u_int); +void tmpfs_destroy_vobject(struct vnode *vp, vm_object_t obj); int tmpfs_alloc_vp(struct mount *, struct tmpfs_node *, int, struct vnode **); void tmpfs_free_vp(struct vnode *); ==== //depot/projects/smpng/sys/fs/tmpfs/tmpfs_subr.c#22 (text+ko) ==== @@ -34,7 +34,7 @@ * Efficient memory file system supporting functions. */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: head/sys/fs/tmpfs/tmpfs_subr.c 250030 2013-04-28 19:38:59Z kib $"); +__FBSDID("$FreeBSD: head/sys/fs/tmpfs/tmpfs_subr.c 250189 2013-05-02 18:44:31Z kib $"); #include <sys/param.h> #include <sys/fnv_hash.h> @@ -429,7 +429,37 @@ /* --------------------------------------------------------------------- */ +void +tmpfs_destroy_vobject(struct vnode *vp, vm_object_t obj) +{ + + if (vp->v_type != VREG || obj == NULL) + return; + + VM_OBJECT_WLOCK(obj); + VI_LOCK(vp); + vm_object_clear_flag(obj, OBJ_TMPFS); + obj->un_pager.swp.swp_tmpfs = NULL; + VI_UNLOCK(vp); + VM_OBJECT_WUNLOCK(obj); +} + /* + * Need to clear v_object for insmntque failure. + */ +static void +tmpfs_insmntque_dtr(struct vnode *vp, void *dtr_arg) +{ + + tmpfs_destroy_vobject(vp, vp->v_object); + vp->v_object = NULL; + vp->v_data = NULL; + vp->v_op = &dead_vnodeops; + vgone(vp); + vput(vp); +} + +/* * Allocates a new vnode for the node node or returns a new reference to * an existing one if the node had already a vnode referencing it. The * resulting locked vnode is returned in *vpp. @@ -540,7 +570,7 @@ panic("tmpfs_alloc_vp: type %p %d", node, (int)node->tn_type); } - error = insmntque(vp, mp); + error = insmntque1(vp, mp, tmpfs_insmntque_dtr, NULL); if (error) vp = NULL; ==== //depot/projects/smpng/sys/fs/tmpfs/tmpfs_vnops.c#27 (text+ko) ==== @@ -34,7 +34,7 @@ * tmpfs vnode interface. */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: head/sys/fs/tmpfs/tmpfs_vnops.c 250030 2013-04-28 19:38:59Z kib $"); +__FBSDID("$FreeBSD: head/sys/fs/tmpfs/tmpfs_vnops.c 250190 2013-05-02 18:46:31Z kib $"); #include <sys/param.h> #include <sys/fcntl.h> @@ -264,6 +264,7 @@ error = EPERM; else { error = 0; + /* For regular files, the call below is nop. */ vnode_create_vobject(vp, node->tn_size, v->a_td); } @@ -494,7 +495,8 @@ vm_page_unhold(m); vm_page_deactivate(m); /* Requeue to maintain LRU ordering. */ - vm_page_requeue(m); + if (m->queue != PQ_NONE) + vm_page_requeue(m); vm_page_unlock(m); VM_OBJECT_WUNLOCK(tobj); @@ -609,7 +611,8 @@ vm_page_unhold(tpg); vm_page_deactivate(tpg); /* Requeue to maintain LRU ordering. */ - vm_page_requeue(tpg); + if (tpg->queue != PQ_NONE) + vm_page_requeue(tpg); vm_page_unlock(tpg); VM_OBJECT_WUNLOCK(tobj); @@ -1466,23 +1469,14 @@ struct tmpfs_mount *tmp; struct tmpfs_node *node; - vm_object_t obj; node = VP_TO_TMPFS_NODE(vp); tmp = VFS_TO_TMPFS(vp->v_mount); - if (node->tn_type == VREG) { - obj = node->tn_reg.tn_aobj; - if (obj != NULL) { - /* Instead of vnode_destroy_vobject() */ - VM_OBJECT_WLOCK(obj); - VI_LOCK(vp); - vm_object_clear_flag(obj, OBJ_TMPFS); - obj->un_pager.swp.swp_tmpfs = NULL; - VI_UNLOCK(vp); - VM_OBJECT_WUNLOCK(obj); - } - } + if (vp->v_type == VREG) + tmpfs_destroy_vobject(vp, node->tn_reg.tn_aobj); + else + vnode_destroy_vobject(vp); vp->v_object = NULL; cache_purge(vp); ==== //depot/projects/smpng/sys/vm/vm_mmap.c#98 (text+ko) ==== @@ -41,7 +41,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: head/sys/vm/vm_mmap.c 250029 2013-04-28 19:25:09Z kib $"); +__FBSDID("$FreeBSD: head/sys/vm/vm_mmap.c 250187 2013-05-02 18:35:12Z kib $"); #include "opt_compat.h" #include "opt_hwpmc_hooks.h" @@ -1289,7 +1289,7 @@ vp = (struct vnode *)obj->handle; /* * Bypass filesystems obey the mpsafety of the - * underlying fs. + * underlying fs. Tmpfs never bypasses. */ error = vget(vp, locktype, td); if (error != 0)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201305021853.r42Irx06097058>