Author: avg
Date: Mon Feb 17 17:59:51 2014
New Revision: 262110
URL: http://svnweb.freebsd.org/changeset/base/262110

Log:
  MFC r260704,260717: zfs: getnewvnode_reserve must be called outside of a
  zfs transaction

Modified:
  stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c
  stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
  stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/cddl/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)

Modified: stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c
==============================================================================
--- stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c   Mon Feb 
17 17:52:14 2014        (r262109)
+++ stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c   Mon Feb 
17 17:59:51 2014        (r262110)
@@ -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/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
==============================================================================
--- stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c Mon Feb 
17 17:52:14 2014        (r262109)
+++ stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c Mon Feb 
17 17:59:51 2014        (r262110)
@@ -1644,6 +1644,9 @@ zfs_create(vnode_t *dvp, char *name, vat
                        return (error);
                }
        }
+
+       getnewvnode_reserve(1);
+
 top:
        *vpp = NULL;
 
@@ -1672,6 +1675,7 @@ top:
                                zfs_acl_ids_free(&acl_ids);
                        if (strcmp(name, "..") == 0)
                                error = SET_ERROR(EISDIR);
+                       getnewvnode_drop_reserve();
                        ZFS_EXIT(zfsvfs);
                        return (error);
                }
@@ -1740,6 +1744,7 @@ top:
                        }
                        zfs_acl_ids_free(&acl_ids);
                        dmu_tx_abort(tx);
+                       getnewvnode_drop_reserve();
                        ZFS_EXIT(zfsvfs);
                        return (error);
                }
@@ -1806,6 +1811,7 @@ top:
                }
        }
 out:
+       getnewvnode_drop_reserve();
        if (dl)
                zfs_dirent_unlock(dl);
 
@@ -2149,6 +2155,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.
         *
@@ -2162,6 +2171,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);
        }
@@ -2169,6 +2179,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);
        }
@@ -2176,6 +2187,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));
        }
@@ -2208,6 +2220,7 @@ top:
                }
                zfs_acl_ids_free(&acl_ids);
                dmu_tx_abort(tx);
+               getnewvnode_drop_reserve();
                ZFS_EXIT(zfsvfs);
                return (error);
        }
@@ -2237,6 +2250,8 @@ top:
 
        dmu_tx_commit(tx);
 
+       getnewvnode_drop_reserve();
+
        zfs_dirent_unlock(dl);
 
        if (zfsvfs->z_os->os_sync == ZFS_SYNC_ALWAYS)
@@ -4120,6 +4135,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.
@@ -4127,6 +4145,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);
        }
@@ -4134,6 +4153,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);
        }
@@ -4141,6 +4161,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));
        }
@@ -4168,6 +4189,7 @@ top:
                }
                zfs_acl_ids_free(&acl_ids);
                dmu_tx_abort(tx);
+               getnewvnode_drop_reserve();
                ZFS_EXIT(zfsvfs);
                return (error);
        }
@@ -4206,6 +4228,8 @@ top:
 
        dmu_tx_commit(tx);
 
+       getnewvnode_drop_reserve();
+
        zfs_dirent_unlock(dl);
 
        if (zfsvfs->z_os->os_sync == ZFS_SYNC_ALWAYS)

Modified: stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
==============================================================================
--- stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c Mon Feb 
17 17:52:14 2014        (r262109)
+++ stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c Mon Feb 
17 17:59:51 2014        (r262110)
@@ -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();
 }
 
 /*
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to