Date: Sun, 30 Jun 2013 13:41:21 +0000 (UTC) From: Attilio Rao <attilio@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r252418 - user/attilio/vmobj-readlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs Message-ID: <201306301341.r5UDfLM1002377@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: attilio Date: Sun Jun 30 13:41:21 2013 New Revision: 252418 URL: http://svnweb.freebsd.org/changeset/base/252418 Log: Fix a mismerge of ZFS: page_busy() could lead to deadlocks when non valid pages were returned. Sponsored by: EMC / Isilon storage division Reported by: bapt Modified: user/attilio/vmobj-readlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c Modified: user/attilio/vmobj-readlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c ============================================================================== --- user/attilio/vmobj-readlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c Sun Jun 30 13:32:02 2013 (r252417) +++ user/attilio/vmobj-readlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c Sun Jun 30 13:41:21 2013 (r252418) @@ -350,12 +350,9 @@ page_busy(vnode_t *vp, int64_t start, in continue; } vm_page_busy_rlock(pp); - } else if (!alloc) { - pp = NULL; - break; - } - if (pp == NULL) { - ASSERT(alloc); + } else if (pp == NULL) { + if (!alloc) + break; pp = vm_page_alloc(obj, OFF_TO_IDX(start), VM_ALLOC_SYSTEM | VM_ALLOC_IFCACHED | VM_ALLOC_RBUSY); @@ -366,11 +363,11 @@ page_busy(vnode_t *vp, int64_t start, in if (pp != NULL) { ASSERT3U(pp->valid, ==, VM_PAGE_BITS_ALL); - if (alloc) { - vm_object_pip_add(obj, 1); - pmap_remove_write(pp); - vm_page_clear_dirty(pp, off, nbytes); - } + if (!alloc) + break; + vm_object_pip_add(obj, 1); + pmap_remove_write(pp); + vm_page_clear_dirty(pp, off, nbytes); } break; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201306301341.r5UDfLM1002377>