Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 17 Oct 2012 10:59:57 +0000 (UTC)
From:      Andriy Gapon <avg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r241628 - head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Message-ID:  <201210171059.q9HAxvn9055203@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: avg
Date: Wed Oct 17 10:59:56 2012
New Revision: 241628
URL: http://svn.freebsd.org/changeset/base/241628

Log:
  zfs: make use of getnewvnode_reserve in zfs_mknode and zfs_zget
  
  getnewvnode_reserve helps to avoid "recursing" back into zfs code
  via getnewvnode when that latter needs to reclaim some vnodes.
  zfs code may hold a number of locks around getnewvnode and doesn't
  expect any recursion to happen on those locks, because that never
  happens in solaris.
  
  I believe that this change also eleiminates a need for the delayed
  znode destruction via the taskqueue.
  
  Many thanks to kib for devising getnewvnode_reserve.
  
  Reported by:	flo
  Tested by:	bapt, kwm, swills
  MFC after:	2 weeks
  X-MFC after:	r241556

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c	Wed Oct 17 08:19:08 2012	(r241627)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c	Wed Oct 17 10:59:56 2012	(r241628)
@@ -856,6 +856,7 @@ zfs_mknode(znode_t *dzp, vattr_t *vap, d
 		}
 	}
 
+	getnewvnode_reserve(1);
 	ZFS_OBJ_HOLD_ENTER(zfsvfs, obj);
 	VERIFY(0 == sa_buf_hold(zfsvfs->z_os, obj, NULL, &db));
 
@@ -1042,6 +1043,7 @@ zfs_mknode(znode_t *dzp, vattr_t *vap, d
 		KASSERT(err == 0, ("insmntque() failed: error %d", err));
 	}
 	ZFS_OBJ_HOLD_EXIT(zfsvfs, obj);
+	getnewvnode_drop_reserve();
 }
 
 /*
@@ -1152,12 +1154,14 @@ zfs_zget(zfsvfs_t *zfsvfs, uint64_t obj_
 
 	*zpp = NULL;
 
+	getnewvnode_reserve(1);
 again:
 	ZFS_OBJ_HOLD_ENTER(zfsvfs, obj_num);
 
 	err = sa_buf_hold(zfsvfs->z_os, obj_num, NULL, &db);
 	if (err) {
 		ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num);
+		getnewvnode_drop_reserve();
 		return (err);
 	}
 
@@ -1168,6 +1172,7 @@ again:
 	    doi.doi_bonus_size < sizeof (znode_phys_t)))) {
 		sa_buf_rele(db, NULL);
 		ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num);
+		getnewvnode_drop_reserve();
 		return (EINVAL);
 	}
 
@@ -1231,6 +1236,7 @@ again:
 		sa_buf_rele(db, NULL);
 		mutex_exit(&zp->z_lock);
 		ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num);
+		getnewvnode_drop_reserve();
 		return (err);
 	}
 
@@ -1266,6 +1272,7 @@ again:
 		}
 	}
 	ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num);
+	getnewvnode_drop_reserve();
 	return (err);
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201210171059.q9HAxvn9055203>