Author: mm
Date: Wed Jun 27 11:59:57 2012
New Revision: 237643
URL: http://svn.freebsd.org/changeset/base/237643

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/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.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/dsl_dataset.c
==============================================================================
--- stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c       
Wed Jun 27 11:36:33 2012        (r237642)
+++ stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c       
Wed Jun 27 11:59:57 2012        (r237643)
@@ -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;
_______________________________________________
svn-src-stable-9@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "svn-src-stable-9-unsubscr...@freebsd.org"

Reply via email to