Author: delphij
Date: Tue Jun 11 19:16:14 2013
New Revision: 251632
URL: http://svnweb.freebsd.org/changeset/base/251632

Log:
  MFV r251621:
  
  ZFS needs a refcount audit
  
  Illumos ZFS issues:
    3741 zfs needs a refcount audit
  
  MFC after:      2 weeks

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_errlog.c
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zap.c
Directory Properties:
  head/sys/cddl/contrib/opensolaris/   (props changed)

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c   Tue Jun 
11 19:12:06 2013        (r251631)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c   Tue Jun 
11 19:16:14 2013        (r251632)
@@ -361,8 +361,10 @@ dsl_dataset_hold_obj(dsl_pool_t *dp, uin
 
        /* Make sure dsobj has the correct object type. */
        dmu_object_info_from_db(dbuf, &doi);
-       if (doi.doi_type != DMU_OT_DSL_DATASET)
+       if (doi.doi_type != DMU_OT_DSL_DATASET) {
+               dmu_buf_rele(dbuf, tag);
                return (SET_ERROR(EINVAL));
+       }
 
        ds = dmu_buf_get_user(dbuf);
        if (ds == NULL) {

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_errlog.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_errlog.c    Tue Jun 
11 19:12:06 2013        (r251631)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_errlog.c    Tue Jun 
11 19:16:14 2013        (r251632)
@@ -183,8 +183,10 @@ process_error_log(spa_t *spa, uint64_t o
 
                if (copyout(&zb, (char *)addr +
                    (*count - 1) * sizeof (zbookmark_t),
-                   sizeof (zbookmark_t)) != 0)
+                   sizeof (zbookmark_t)) != 0) {
+                       zap_cursor_fini(&zc);
                        return (SET_ERROR(EFAULT));
+               }
 
                *count -= 1;
        }

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zap.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zap.c   Tue Jun 11 
19:12:06 2013        (r251631)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zap.c   Tue Jun 11 
19:16:14 2013        (r251632)
@@ -295,7 +295,8 @@ zap_table_load(zap_t *zap, zap_table_phy
                err = dmu_buf_hold(zap->zap_objset, zap->zap_object,
                    (tbl->zt_nextblk + blk) << bs, FTAG, &db,
                    DMU_READ_NO_PREFETCH);
-               dmu_buf_rele(db, FTAG);
+               if (err == 0)
+                       dmu_buf_rele(db, FTAG);
        }
        return (err);
 }
@@ -992,18 +993,21 @@ zap_join(objset_t *os, uint64_t fromobj,
        zap_attribute_t za;
        int err;
 
+       err = 0;
        for (zap_cursor_init(&zc, os, fromobj);
            zap_cursor_retrieve(&zc, &za) == 0;
            (void) zap_cursor_advance(&zc)) {
-               if (za.za_integer_length != 8 || za.za_num_integers != 1)
-                       return (SET_ERROR(EINVAL));
+               if (za.za_integer_length != 8 || za.za_num_integers != 1) {
+                       err = SET_ERROR(EINVAL);
+                       break;
+               }
                err = zap_add(os, intoobj, za.za_name,
                    8, 1, &za.za_first_integer, tx);
                if (err)
-                       return (err);
+                       break;
        }
        zap_cursor_fini(&zc);
-       return (0);
+       return (err);
 }
 
 int
@@ -1014,18 +1018,21 @@ zap_join_key(objset_t *os, uint64_t from
        zap_attribute_t za;
        int err;
 
+       err = 0;
        for (zap_cursor_init(&zc, os, fromobj);
            zap_cursor_retrieve(&zc, &za) == 0;
            (void) zap_cursor_advance(&zc)) {
-               if (za.za_integer_length != 8 || za.za_num_integers != 1)
-                       return (SET_ERROR(EINVAL));
+               if (za.za_integer_length != 8 || za.za_num_integers != 1) {
+                       err = SET_ERROR(EINVAL);
+                       break;
+               }
                err = zap_add(os, intoobj, za.za_name,
                    8, 1, &value, tx);
                if (err)
-                       return (err);
+                       break;
        }
        zap_cursor_fini(&zc);
-       return (0);
+       return (err);
 }
 
 int
@@ -1036,24 +1043,27 @@ zap_join_increment(objset_t *os, uint64_
        zap_attribute_t za;
        int err;
 
+       err = 0;
        for (zap_cursor_init(&zc, os, fromobj);
            zap_cursor_retrieve(&zc, &za) == 0;
            (void) zap_cursor_advance(&zc)) {
                uint64_t delta = 0;
 
-               if (za.za_integer_length != 8 || za.za_num_integers != 1)
-                       return (SET_ERROR(EINVAL));
+               if (za.za_integer_length != 8 || za.za_num_integers != 1) {
+                       err = SET_ERROR(EINVAL);
+                       break;
+               }
 
                err = zap_lookup(os, intoobj, za.za_name, 8, 1, &delta);
                if (err != 0 && err != ENOENT)
-                       return (err);
+                       break;
                delta += za.za_first_integer;
                err = zap_update(os, intoobj, za.za_name, 8, 1, &delta, tx);
                if (err)
-                       return (err);
+                       break;
        }
        zap_cursor_fini(&zc);
-       return (0);
+       return (err);
 }
 
 int
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to