svn commit: r262111 - stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Andriy Gapon
avg at FreeBSD.org
Mon Feb 17 18:00:04 UTC 2014
Author: avg
Date: Mon Feb 17 18:00:02 2014
New Revision: 262111
URL: http://svnweb.freebsd.org/changeset/base/262111
Log:
MFC r260704,260717: zfs: getnewvnode_reserve must be called outside of a
zfs transaction
Modified:
stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c
stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
Directory Properties:
stable/9/sys/ (props changed)
stable/9/sys/cddl/contrib/opensolaris/ (props changed)
Modified: stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c
==============================================================================
--- stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c Mon Feb 17 17:59:51 2014 (r262110)
+++ stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c Mon Feb 17 18:00:02 2014 (r262111)
@@ -951,6 +951,8 @@ zfs_make_xattrdir(znode_t *zp, vattr_t *
return (SET_ERROR(EDQUOT));
}
+ getnewvnode_reserve(1);
+
tx = dmu_tx_create(zfsvfs->z_os);
dmu_tx_hold_sa_create(tx, acl_ids.z_aclp->z_acl_bytes +
ZFS_SA_BASE_ATTR_SIZE);
@@ -985,6 +987,8 @@ zfs_make_xattrdir(znode_t *zp, vattr_t *
zfs_acl_ids_free(&acl_ids);
dmu_tx_commit(tx);
+ getnewvnode_drop_reserve();
+
*xvpp = ZTOV(xzp);
return (0);
Modified: stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
==============================================================================
--- stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c Mon Feb 17 17:59:51 2014 (r262110)
+++ stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c Mon Feb 17 18:00:02 2014 (r262111)
@@ -1620,6 +1620,9 @@ zfs_create(vnode_t *dvp, char *name, vat
return (error);
}
}
+
+ getnewvnode_reserve(1);
+
top:
*vpp = NULL;
@@ -1648,6 +1651,7 @@ top:
zfs_acl_ids_free(&acl_ids);
if (strcmp(name, "..") == 0)
error = SET_ERROR(EISDIR);
+ getnewvnode_drop_reserve();
ZFS_EXIT(zfsvfs);
return (error);
}
@@ -1716,6 +1720,7 @@ top:
}
zfs_acl_ids_free(&acl_ids);
dmu_tx_abort(tx);
+ getnewvnode_drop_reserve();
ZFS_EXIT(zfsvfs);
return (error);
}
@@ -1782,6 +1787,7 @@ top:
}
}
out:
+ getnewvnode_drop_reserve();
if (dl)
zfs_dirent_unlock(dl);
@@ -2125,6 +2131,9 @@ zfs_mkdir(vnode_t *dvp, char *dirname, v
ZFS_EXIT(zfsvfs);
return (error);
}
+
+ getnewvnode_reserve(1);
+
/*
* First make sure the new directory doesn't exist.
*
@@ -2138,6 +2147,7 @@ top:
if (error = zfs_dirent_lock(&dl, dzp, dirname, &zp, zf,
NULL, NULL)) {
zfs_acl_ids_free(&acl_ids);
+ getnewvnode_drop_reserve();
ZFS_EXIT(zfsvfs);
return (error);
}
@@ -2145,6 +2155,7 @@ top:
if (error = zfs_zaccess(dzp, ACE_ADD_SUBDIRECTORY, 0, B_FALSE, cr)) {
zfs_acl_ids_free(&acl_ids);
zfs_dirent_unlock(dl);
+ getnewvnode_drop_reserve();
ZFS_EXIT(zfsvfs);
return (error);
}
@@ -2152,6 +2163,7 @@ top:
if (zfs_acl_ids_overquota(zfsvfs, &acl_ids)) {
zfs_acl_ids_free(&acl_ids);
zfs_dirent_unlock(dl);
+ getnewvnode_drop_reserve();
ZFS_EXIT(zfsvfs);
return (SET_ERROR(EDQUOT));
}
@@ -2184,6 +2196,7 @@ top:
}
zfs_acl_ids_free(&acl_ids);
dmu_tx_abort(tx);
+ getnewvnode_drop_reserve();
ZFS_EXIT(zfsvfs);
return (error);
}
@@ -2213,6 +2226,8 @@ top:
dmu_tx_commit(tx);
+ getnewvnode_drop_reserve();
+
zfs_dirent_unlock(dl);
if (zfsvfs->z_os->os_sync == ZFS_SYNC_ALWAYS)
@@ -4096,6 +4111,9 @@ zfs_symlink(vnode_t *dvp, vnode_t **vpp,
ZFS_EXIT(zfsvfs);
return (error);
}
+
+ getnewvnode_reserve(1);
+
top:
/*
* Attempt to lock directory; fail if entry already exists.
@@ -4103,6 +4121,7 @@ top:
error = zfs_dirent_lock(&dl, dzp, name, &zp, zflg, NULL, NULL);
if (error) {
zfs_acl_ids_free(&acl_ids);
+ getnewvnode_drop_reserve();
ZFS_EXIT(zfsvfs);
return (error);
}
@@ -4110,6 +4129,7 @@ top:
if (error = zfs_zaccess(dzp, ACE_ADD_FILE, 0, B_FALSE, cr)) {
zfs_acl_ids_free(&acl_ids);
zfs_dirent_unlock(dl);
+ getnewvnode_drop_reserve();
ZFS_EXIT(zfsvfs);
return (error);
}
@@ -4117,6 +4137,7 @@ top:
if (zfs_acl_ids_overquota(zfsvfs, &acl_ids)) {
zfs_acl_ids_free(&acl_ids);
zfs_dirent_unlock(dl);
+ getnewvnode_drop_reserve();
ZFS_EXIT(zfsvfs);
return (SET_ERROR(EDQUOT));
}
@@ -4144,6 +4165,7 @@ top:
}
zfs_acl_ids_free(&acl_ids);
dmu_tx_abort(tx);
+ getnewvnode_drop_reserve();
ZFS_EXIT(zfsvfs);
return (error);
}
@@ -4182,6 +4204,8 @@ top:
dmu_tx_commit(tx);
+ getnewvnode_drop_reserve();
+
zfs_dirent_unlock(dl);
if (zfsvfs->z_os->os_sync == ZFS_SYNC_ALWAYS)
Modified: stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
==============================================================================
--- stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c Mon Feb 17 17:59:51 2014 (r262110)
+++ stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c Mon Feb 17 18:00:02 2014 (r262111)
@@ -624,6 +624,8 @@ zfs_znode_alloc(zfsvfs_t *zfsvfs, dmu_bu
zp = kmem_cache_alloc(znode_cache, KM_SLEEP);
+ KASSERT(curthread->td_vp_reserv > 0,
+ ("zfs_znode_alloc: getnewvnode without any vnodes reserved"));
error = getnewvnode("zfs", zfsvfs->z_parent->z_vfs, &zfs_vnodeops, &vp);
if (error != 0) {
kmem_cache_free(znode_cache, zp);
@@ -832,7 +834,6 @@ 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));
@@ -1019,7 +1020,6 @@ 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();
}
/*
More information about the svn-src-stable-9
mailing list