Author: mm
Date: Wed Jun 27 12:00:35 2012
New Revision: 237644
URL: http://svn.freebsd.org/changeset/base/237644

Log:
  MFC r236823 (pjd):
  
  ds_guid of 0 is special, as it is used by snapshot receive code to
  differentiate between an incremental and full stream.
  Be sure not to generate guid equal to 0.
  
  Reported by:  someone who saw 0 being generated as 64bit random guid

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

Modified: stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
==============================================================================
--- stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c       
Wed Jun 27 11:59:57 2012        (r237643)
+++ stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c       
Wed Jun 27 12:00:35 2012        (r237644)
@@ -809,8 +809,10 @@ dsl_dataset_create_sync_dd(dsl_dir_t *dd
        dsphys->ds_dir_obj = dd->dd_object;
        dsphys->ds_flags = flags;
        dsphys->ds_fsid_guid = unique_create();
-       (void) random_get_pseudo_bytes((void*)&dsphys->ds_guid,
-           sizeof (dsphys->ds_guid));
+       do {
+               (void) random_get_pseudo_bytes((void*)&dsphys->ds_guid,
+                   sizeof (dsphys->ds_guid));
+       } while (dsphys->ds_guid == 0);
        dsphys->ds_snapnames_zapobj =
            zap_create_norm(mos, U8_TEXTPREP_TOUPPER, DMU_OT_DSL_DS_SNAP_MAP,
            DMU_OT_NONE, 0, tx);
@@ -2082,8 +2084,10 @@ dsl_dataset_snapshot_sync(void *arg1, vo
        bzero(dsphys, sizeof (dsl_dataset_phys_t));
        dsphys->ds_dir_obj = ds->ds_dir->dd_object;
        dsphys->ds_fsid_guid = unique_create();
-       (void) random_get_pseudo_bytes((void*)&dsphys->ds_guid,
-           sizeof (dsphys->ds_guid));
+       do {
+               (void) random_get_pseudo_bytes((void*)&dsphys->ds_guid,
+                   sizeof (dsphys->ds_guid));
+       } while (dsphys->ds_guid == 0);
        dsphys->ds_prev_snap_obj = ds->ds_phys->ds_prev_snap_obj;
        dsphys->ds_prev_snap_txg = ds->ds_phys->ds_prev_snap_txg;
        dsphys->ds_next_snap_obj = ds->ds_object;
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to