Author: mm
Date: Sun Mar 31 18:31:58 2013
New Revision: 248954
URL: http://svnweb.freebsd.org/changeset/base/248954

Log:
  MFC r247852:
    Import ZFS bpobj bugfix from vendor.
  
    Illumos ZFS issues:
    3603 panic from bpobj_enqueue_subobj()
    3604 zdb should print bpobjs more verbosely

Modified:
  stable/8/cddl/contrib/opensolaris/cmd/zdb/zdb.c
  stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/bpobj.c
  stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c
Directory Properties:
  stable/8/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/   (props changed)
  stable/8/sys/cddl/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)

Modified: stable/8/cddl/contrib/opensolaris/cmd/zdb/zdb.c
==============================================================================
--- stable/8/cddl/contrib/opensolaris/cmd/zdb/zdb.c     Sun Mar 31 18:27:46 
2013        (r248953)
+++ stable/8/cddl/contrib/opensolaris/cmd/zdb/zdb.c     Sun Mar 31 18:31:58 
2013        (r248954)
@@ -1189,7 +1189,7 @@ dump_bpobj_cb(void *arg, const blkptr_t 
 }
 
 static void
-dump_bpobj(bpobj_t *bpo, char *name)
+dump_bpobj(bpobj_t *bpo, char *name, int indent)
 {
        char bytes[32];
        char comp[32];
@@ -1199,31 +1199,56 @@ dump_bpobj(bpobj_t *bpo, char *name)
                return;
 
        zdb_nicenum(bpo->bpo_phys->bpo_bytes, bytes);
-       if (bpo->bpo_havesubobj) {
+       if (bpo->bpo_havesubobj && bpo->bpo_phys->bpo_subobjs != 0) {
                zdb_nicenum(bpo->bpo_phys->bpo_comp, comp);
                zdb_nicenum(bpo->bpo_phys->bpo_uncomp, uncomp);
-               (void) printf("\n    %s: %llu local blkptrs, %llu subobjs, "
-                   "%s (%s/%s comp)\n",
-                   name, (u_longlong_t)bpo->bpo_phys->bpo_num_blkptrs,
+               (void) printf("    %*s: object %llu, %llu local blkptrs, "
+                   "%llu subobjs, %s (%s/%s comp)\n",
+                   indent * 8, name,
+                   (u_longlong_t)bpo->bpo_object,
+                   (u_longlong_t)bpo->bpo_phys->bpo_num_blkptrs,
                    (u_longlong_t)bpo->bpo_phys->bpo_num_subobjs,
                    bytes, comp, uncomp);
+
+               for (uint64_t i = 0; i < bpo->bpo_phys->bpo_num_subobjs; i++) {
+                       uint64_t subobj;
+                       bpobj_t subbpo;
+                       int error;
+                       VERIFY0(dmu_read(bpo->bpo_os,
+                           bpo->bpo_phys->bpo_subobjs,
+                           i * sizeof (subobj), sizeof (subobj), &subobj, 0));
+                       error = bpobj_open(&subbpo, bpo->bpo_os, subobj);
+                       if (error != 0) {
+                               (void) printf("ERROR %u while trying to open "
+                                   "subobj id %llu\n",
+                                   error, (u_longlong_t)subobj);
+                               continue;
+                       }
+                       dump_bpobj(&subbpo, "subobj", indent + 1);
+               }
        } else {
-               (void) printf("\n    %s: %llu blkptrs, %s\n",
-                   name, (u_longlong_t)bpo->bpo_phys->bpo_num_blkptrs, bytes);
+               (void) printf("    %*s: object %llu, %llu blkptrs, %s\n",
+                   indent * 8, name,
+                   (u_longlong_t)bpo->bpo_object,
+                   (u_longlong_t)bpo->bpo_phys->bpo_num_blkptrs,
+                   bytes);
        }
 
        if (dump_opt['d'] < 5)
                return;
 
-       (void) printf("\n");
 
-       (void) bpobj_iterate_nofree(bpo, dump_bpobj_cb, NULL, NULL);
+       if (indent == 0) {
+               (void) bpobj_iterate_nofree(bpo, dump_bpobj_cb, NULL, NULL);
+               (void) printf("\n");
+       }
 }
 
 static void
 dump_deadlist(dsl_deadlist_t *dl)
 {
        dsl_deadlist_entry_t *dle;
+       uint64_t unused;
        char bytes[32];
        char comp[32];
        char uncomp[32];
@@ -1242,14 +1267,24 @@ dump_deadlist(dsl_deadlist_t *dl)
 
        (void) printf("\n");
 
+       /* force the tree to be loaded */
+       dsl_deadlist_space_range(dl, 0, UINT64_MAX, &unused, &unused, &unused);
+
        for (dle = avl_first(&dl->dl_tree); dle;
            dle = AVL_NEXT(&dl->dl_tree, dle)) {
-               (void) printf("      mintxg %llu -> obj %llu\n",
-                   (longlong_t)dle->dle_mintxg,
-                   (longlong_t)dle->dle_bpobj.bpo_object);
+               if (dump_opt['d'] >= 5) {
+                       char buf[128];
+                       (void) snprintf(buf, sizeof (buf), "mintxg %llu -> ",
+                           (longlong_t)dle->dle_mintxg,
+                           (longlong_t)dle->dle_bpobj.bpo_object);
 
-               if (dump_opt['d'] >= 5)
-                       dump_bpobj(&dle->dle_bpobj, "");
+                       dump_bpobj(&dle->dle_bpobj, buf, 0);
+               } else {
+                       (void) printf("mintxg %llu -> obj %llu\n",
+                           (longlong_t)dle->dle_mintxg,
+                           (longlong_t)dle->dle_bpobj.bpo_object);
+
+               }
        }
 }
 
@@ -1272,7 +1307,7 @@ fuid_table_destroy()
  * print uid or gid information.
  * For normal POSIX id just the id is printed in decimal format.
  * For CIFS files with FUID the fuid is printed in hex followed by
- * the doman-rid string.
+ * the domain-rid string.
  */
 static void
 print_idstr(uint64_t id, const char *id_type)
@@ -2529,10 +2564,11 @@ dump_zpool(spa_t *spa)
        if (dump_opt['d'] || dump_opt['i']) {
                dump_dir(dp->dp_meta_objset);
                if (dump_opt['d'] >= 3) {
-                       dump_bpobj(&spa->spa_deferred_bpobj, "Deferred frees");
+                       dump_bpobj(&spa->spa_deferred_bpobj,
+                           "Deferred frees", 0);
                        if (spa_version(spa) >= SPA_VERSION_DEADLISTS) {
                                dump_bpobj(&spa->spa_dsl_pool->dp_free_bpobj,
-                                   "Pool snapshot frees");
+                                   "Pool snapshot frees", 0);
                        }
 
                        if (spa_feature_is_active(spa,

Modified: stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/bpobj.c
==============================================================================
--- stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/bpobj.c     Sun Mar 
31 18:27:46 2013        (r248953)
+++ stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/bpobj.c     Sun Mar 
31 18:31:58 2013        (r248954)
@@ -20,7 +20,7 @@
  */
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012 by Delphix. All rights reserved.
+ * Copyright (c) 2013 by Delphix. All rights reserved.
  */
 
 #include <sys/bpobj.h>
@@ -414,6 +414,12 @@ bpobj_enqueue_subobj(bpobj_t *bpo, uint6
 
                        VERIFY3U(0, ==, dmu_buf_hold(bpo->bpo_os, subsubobjs,
                            0, FTAG, &subdb, 0));
+                       /*
+                        * Make sure that we are not asking dmu_write()
+                        * to write more data than we have in our buffer.
+                        */
+                       VERIFY3U(subdb->db_size, >=,
+                           numsubsub * sizeof (subobj));
                        dmu_write(bpo->bpo_os, bpo->bpo_phys->bpo_subobjs,
                            bpo->bpo_phys->bpo_num_subobjs * sizeof (subobj),
                            numsubsub * sizeof (subobj), subdb->db_data, tx);

Modified: stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c
==============================================================================
--- stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c       Sun Mar 
31 18:27:46 2013        (r248953)
+++ stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c       Sun Mar 
31 18:31:58 2013        (r248954)
@@ -1712,7 +1712,7 @@ dmu_object_info_from_dnode(dnode_t *dn, 
        doi->doi_checksum = dn->dn_checksum;
        doi->doi_compress = dn->dn_compress;
        doi->doi_physical_blocks_512 = (DN_USED_BYTES(dnp) + 256) >> 9;
-       doi->doi_max_offset = (dnp->dn_maxblkid + 1) * dn->dn_datablksz;
+       doi->doi_max_offset = (dn->dn_maxblkid + 1) * dn->dn_datablksz;
        doi->doi_fill_count = 0;
        for (int i = 0; i < dnp->dn_nblkptr; i++)
                doi->doi_fill_count += dnp->dn_blkptr[i].blk_fill;
_______________________________________________
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