Fix OpenSolaris bugs #6784757, #6784924, #6826861 OpenSolaris revision 8517:41a0783dde17 6784757 zfs rename occasionally fails with ebusy OpenSolaris revision 8779:f164e0e90508 6784924 panic while ludelete (zfs destroy) OpenSolaris revision 9390:887948510f80 6826861 assertion failed in dsl_dataset_destroy_sync when "zfs destroy" old fs Patch applies cleanly. References: http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6784757 http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6784924 http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6826861
Responsible Changed From-To: freebsd-bugs->freebsd-fs Over to maintainer(s).
On Mon, May 10, 2010 at 05:41:30PM +0200, Martin Matuska wrote: > > >Submitter-Id: current-users > >Originator: Martin Matuska > >Organization: > >Confidential: no > >Synopsis: [zfs] [patch] zfs bugfixes (6784757, 6784924, 6826861) > >Severity: non-critical > >Priority: low > >Category: kern > >Class: sw-bug > >Release: FreeBSD 9-CURRENT amd64 > >Environment: > >Description: > Fix OpenSolaris bugs #6784757, #6784924, #6826861 > > OpenSolaris revision 8517:41a0783dde17 > 6784757 zfs rename occasionally fails with ebusy > > OpenSolaris revision 8779:f164e0e90508 > 6784924 panic while ludelete (zfs destroy) > > OpenSolaris revision 9390:887948510f80 > 6826861 assertion failed in dsl_dataset_destroy_sync when "zfs destroy" old fs > > Patch applies cleanly. Looks good, go ahead. > References: > http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6784757 > http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6784924 > http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6826861 > > >How-To-Repeat: > >Fix: > Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c > =================================================================== > --- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c (revision 207846) > +++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c (working copy) > @@ -19,7 +19,7 @@ > * CDDL HEADER END > */ > /* > - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. > + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. > * Use is subject to license terms. > */ > > @@ -2205,6 +2205,12 @@ > err = dsl_dir_open(oldname, FTAG, &dd, &tail); > if (err) > return (err); > + /* > + * If there are more than 2 references there may be holds > + * hanging around that haven't been cleared out yet. > + */ > + if (dmu_buf_refcount(dd->dd_dbuf) > 2) > + txg_wait_synced(dd->dd_pool, 0); > if (tail == NULL) { > int delta = strlen(newname) - strlen(oldname); > > Index: cddl/contrib/opensolaris/cmd/ztest/ztest.c > =================================================================== > --- cddl/contrib/opensolaris/cmd/ztest/ztest.c (revision 207846) > +++ cddl/contrib/opensolaris/cmd/ztest/ztest.c (working copy) > @@ -19,7 +19,7 @@ > * CDDL HEADER END > */ > /* > - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. > + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. > * Use is subject to license terms. > */ > > @@ -93,6 +93,7 @@ > #include <sys/vdev_file.h> > #include <sys/spa_impl.h> > #include <sys/dsl_prop.h> > +#include <sys/dsl_dataset.h> > #include <sys/refcount.h> > #include <stdio.h> > #include <stdio_ext.h> > @@ -174,6 +175,7 @@ > ztest_func_t ztest_dsl_prop_get_set; > ztest_func_t ztest_dmu_objset_create_destroy; > ztest_func_t ztest_dmu_snapshot_create_destroy; > +ztest_func_t ztest_dsl_dataset_promote_busy; > ztest_func_t ztest_spa_create_destroy; > ztest_func_t ztest_fault_inject; > ztest_func_t ztest_spa_rename; > @@ -208,6 +210,7 @@ > { ztest_dsl_prop_get_set, 1, &zopt_sometimes }, > { ztest_dmu_objset_create_destroy, 1, &zopt_sometimes }, > { ztest_dmu_snapshot_create_destroy, 1, &zopt_sometimes }, > + { ztest_dsl_dataset_promote_busy, 1, &zopt_sometimes }, > { ztest_spa_create_destroy, 1, &zopt_sometimes }, > { ztest_fault_inject, 1, &zopt_sometimes }, > { ztest_spa_rename, 1, &zopt_rarely }, > @@ -1591,6 +1594,109 @@ > } > > /* > + * Verify dsl_dataset_promote handles EBUSY > + */ > +void > +ztest_dsl_dataset_promote_busy(ztest_args_t *za) > +{ > + int error; > + objset_t *os = za->za_os; > + objset_t *clone; > + dsl_dataset_t *ds; > + char snap1name[100]; > + char clone1name[100]; > + char snap2name[100]; > + char clone2name[100]; > + char snap3name[100]; > + char osname[MAXNAMELEN]; > + static uint64_t uniq = 0; > + uint64_t curval; > + > + curval = atomic_add_64_nv(&uniq, 5) - 5; > + > + (void) rw_rdlock(&ztest_shared->zs_name_lock); > + > + dmu_objset_name(os, osname); > + (void) snprintf(snap1name, 100, "%s@s1_%llu", osname, curval++); > + (void) snprintf(clone1name, 100, "%s/c1_%llu", osname, curval++); > + (void) snprintf(snap2name, 100, "%s@s2_%llu", clone1name, curval++); > + (void) snprintf(clone2name, 100, "%s/c2_%llu", osname, curval++); > + (void) snprintf(snap3name, 100, "%s@s3_%llu", clone1name, curval++); > + > + error = dmu_objset_snapshot(osname, strchr(snap1name, '@')+1, FALSE); > + if (error == ENOSPC) > + ztest_record_enospc("dmu_take_snapshot"); > + else if (error != 0 && error != EEXIST) > + fatal(0, "dmu_take_snapshot = %d", error); > + > + error = dmu_objset_open(snap1name, DMU_OST_OTHER, > + DS_MODE_USER | DS_MODE_READONLY, &clone); > + if (error) > + fatal(0, "dmu_open_snapshot(%s) = %d", snap1name, error); > + > + error = dmu_objset_create(clone1name, DMU_OST_OTHER, clone, 0, > + NULL, NULL); > + if (error) > + fatal(0, "dmu_objset_create(%s) = %d", clone1name, error); > + dmu_objset_close(clone); > + > + error = dmu_objset_snapshot(clone1name, strchr(snap2name, '@')+1, > + FALSE); > + if (error == ENOSPC) > + ztest_record_enospc("dmu_take_snapshot"); > + else if (error != 0 && error != EEXIST) > + fatal(0, "dmu_take_snapshot = %d", error); > + > + error = dmu_objset_snapshot(clone1name, strchr(snap3name, '@')+1, > + FALSE); > + if (error == ENOSPC) > + ztest_record_enospc("dmu_take_snapshot"); > + else if (error != 0 && error != EEXIST) > + fatal(0, "dmu_take_snapshot = %d", error); > + > + error = dmu_objset_open(snap3name, DMU_OST_OTHER, > + DS_MODE_USER | DS_MODE_READONLY, &clone); > + if (error) > + fatal(0, "dmu_open_snapshot(%s) = %d", snap3name, error); > + > + error = dmu_objset_create(clone2name, DMU_OST_OTHER, clone, 0, > + NULL, NULL); > + if (error) > + fatal(0, "dmu_objset_create(%s) = %d", clone2name, error); > + dmu_objset_close(clone); > + > + error = dsl_dataset_own(snap1name, 0, FTAG, &ds); > + if (error) > + fatal(0, "dsl_dataset_own(%s) = %d", snap1name, error); > + error = dsl_dataset_promote(clone2name); > + if (error != EBUSY) > + fatal(0, "dsl_dataset_promote(%s), %d, not EBUSY", clone2name, > + error); > + dsl_dataset_disown(ds, FTAG); > + > + error = dmu_objset_destroy(clone2name); > + if (error) > + fatal(0, "dmu_objset_destroy(%s) = %d", clone2name, error); > + > + error = dmu_objset_destroy(snap3name); > + if (error) > + fatal(0, "dmu_objset_destroy(%s) = %d", snap2name, error); > + > + error = dmu_objset_destroy(snap2name); > + if (error) > + fatal(0, "dmu_objset_destroy(%s) = %d", snap2name, error); > + > + error = dmu_objset_destroy(clone1name); > + if (error) > + fatal(0, "dmu_objset_destroy(%s) = %d", clone1name, error); > + error = dmu_objset_destroy(snap1name); > + if (error) > + fatal(0, "dmu_objset_destroy(%s) = %d", snap1name, error); > + > + (void) rw_unlock(&ztest_shared->zs_name_lock); > +} > + > +/* > * Verify that dmu_object_{alloc,free} work as expected. > */ > void > Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c > =================================================================== > --- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c (revision 207846) > +++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c (working copy) > @@ -554,6 +554,7 @@ > return (err); > if (!dsl_dataset_tryown(*dsp, DS_MODE_IS_INCONSISTENT(flags), owner)) { > dsl_dataset_rele(*dsp, owner); > + *dsp = NULL; > return (EBUSY); > } > return (0); > @@ -2578,7 +2579,7 @@ > { > struct promotenode *snap; > > - if (!list_link_active(&l->list_head)) > + if (!l || !list_link_active(&l->list_head)) > return; > > while ((snap = list_tail(l)) != NULL) { > Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c > =================================================================== > --- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c (revision 207846) > +++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c (working copy) > @@ -1267,8 +1267,7 @@ > (void) zio_wait(zio); > } > > - ASSERT(!(ds->ds_phys->ds_flags & DS_FLAG_UNIQUE_ACCURATE) || > - ds->ds_phys->ds_unique_bytes == 0); > + ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) || ds->ds_phys->ds_unique_bytes == 0); > > if (ds->ds_prev && ds->ds_prev != ds->ds_dir->dd_pool->dp_origin_snap) { > /* Change our contents to that of the prev snapshot */ > @@ -1660,7 +1659,7 @@ > err = traverse_dsl_dataset(ds, ds->ds_phys->ds_prev_snap_txg, > ADVANCE_POST, kill_blkptr, &ka); > ASSERT3U(err, ==, 0); > - ASSERT(spa_version(dp->dp_spa) < SPA_VERSION_UNIQUE_ACCURATE || > + ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) || > ds->ds_phys->ds_unique_bytes == 0); > } -- Pawel Jakub Dawidek http://www.wheelsystems.com pjd@FreeBSD.org http://www.FreeBSD.org FreeBSD committer Am I Evil? Yes, I Am!
Author: mm Date: Tue May 11 09:19:41 2010 New Revision: 207909 URL: http://svn.freebsd.org/changeset/base/207909 Log: Fix zfs rename (may occasionally fail with dataset busy). OpenSolaris onnv revision: 8517:41a0783dde17 PR: kern/146471 Approved by: pjd, delphij (mentor) Obtained from: OpenSolaris (Bug ID 6784757) MFC after: 3 days Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c 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 May 11 07:25:13 2010 (r207908) +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c Tue May 11 09:19:41 2010 (r207909) @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -2205,6 +2205,12 @@ dsl_dataset_rename(char *oldname, const err = dsl_dir_open(oldname, FTAG, &dd, &tail); if (err) return (err); + /* + * If there are more than 2 references there may be holds + * hanging around that haven't been cleared out yet. + */ + if (dmu_buf_refcount(dd->dd_dbuf) > 2) + txg_wait_synced(dd->dd_pool, 0); if (tail == NULL) { int delta = strlen(newname) - strlen(oldname); _______________________________________________ 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-unsubscribe@freebsd.org"
Author: mm Date: Tue May 11 09:23:46 2010 New Revision: 207910 URL: http://svn.freebsd.org/changeset/base/207910 Log: Fix possible panic with zfs destroy. OpenSolaris onnv revision: 8779:f164e0e90508 PR: kern/146471 Approved by: pjd, delphij (mentor) Obtained from: OpenSolaris (Bug ID 6784924) MFC after: 3 days Modified: head/cddl/contrib/opensolaris/cmd/ztest/ztest.c head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c Modified: head/cddl/contrib/opensolaris/cmd/ztest/ztest.c ============================================================================== --- head/cddl/contrib/opensolaris/cmd/ztest/ztest.c Tue May 11 09:19:41 2010 (r207909) +++ head/cddl/contrib/opensolaris/cmd/ztest/ztest.c Tue May 11 09:23:46 2010 (r207910) @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -93,6 +93,7 @@ #include <sys/vdev_file.h> #include <sys/spa_impl.h> #include <sys/dsl_prop.h> +#include <sys/dsl_dataset.h> #include <sys/refcount.h> #include <stdio.h> #include <stdio_ext.h> @@ -174,6 +175,7 @@ ztest_func_t ztest_traverse; ztest_func_t ztest_dsl_prop_get_set; ztest_func_t ztest_dmu_objset_create_destroy; ztest_func_t ztest_dmu_snapshot_create_destroy; +ztest_func_t ztest_dsl_dataset_promote_busy; ztest_func_t ztest_spa_create_destroy; ztest_func_t ztest_fault_inject; ztest_func_t ztest_spa_rename; @@ -208,6 +210,7 @@ ztest_info_t ztest_info[] = { { ztest_dsl_prop_get_set, 1, &zopt_sometimes }, { ztest_dmu_objset_create_destroy, 1, &zopt_sometimes }, { ztest_dmu_snapshot_create_destroy, 1, &zopt_sometimes }, + { ztest_dsl_dataset_promote_busy, 1, &zopt_sometimes }, { ztest_spa_create_destroy, 1, &zopt_sometimes }, { ztest_fault_inject, 1, &zopt_sometimes }, { ztest_spa_rename, 1, &zopt_rarely }, @@ -1591,6 +1594,109 @@ ztest_traverse(ztest_args_t *za) } /* + * Verify dsl_dataset_promote handles EBUSY + */ +void +ztest_dsl_dataset_promote_busy(ztest_args_t *za) +{ + int error; + objset_t *os = za->za_os; + objset_t *clone; + dsl_dataset_t *ds; + char snap1name[100]; + char clone1name[100]; + char snap2name[100]; + char clone2name[100]; + char snap3name[100]; + char osname[MAXNAMELEN]; + static uint64_t uniq = 0; + uint64_t curval; + + curval = atomic_add_64_nv(&uniq, 5) - 5; + + (void) rw_rdlock(&ztest_shared->zs_name_lock); + + dmu_objset_name(os, osname); + (void) snprintf(snap1name, 100, "%s@s1_%llu", osname, curval++); + (void) snprintf(clone1name, 100, "%s/c1_%llu", osname, curval++); + (void) snprintf(snap2name, 100, "%s@s2_%llu", clone1name, curval++); + (void) snprintf(clone2name, 100, "%s/c2_%llu", osname, curval++); + (void) snprintf(snap3name, 100, "%s@s3_%llu", clone1name, curval++); + + error = dmu_objset_snapshot(osname, strchr(snap1name, '@')+1, FALSE); + if (error == ENOSPC) + ztest_record_enospc("dmu_take_snapshot"); + else if (error != 0 && error != EEXIST) + fatal(0, "dmu_take_snapshot = %d", error); + + error = dmu_objset_open(snap1name, DMU_OST_OTHER, + DS_MODE_USER | DS_MODE_READONLY, &clone); + if (error) + fatal(0, "dmu_open_snapshot(%s) = %d", snap1name, error); + + error = dmu_objset_create(clone1name, DMU_OST_OTHER, clone, 0, + NULL, NULL); + if (error) + fatal(0, "dmu_objset_create(%s) = %d", clone1name, error); + dmu_objset_close(clone); + + error = dmu_objset_snapshot(clone1name, strchr(snap2name, '@')+1, + FALSE); + if (error == ENOSPC) + ztest_record_enospc("dmu_take_snapshot"); + else if (error != 0 && error != EEXIST) + fatal(0, "dmu_take_snapshot = %d", error); + + error = dmu_objset_snapshot(clone1name, strchr(snap3name, '@')+1, + FALSE); + if (error == ENOSPC) + ztest_record_enospc("dmu_take_snapshot"); + else if (error != 0 && error != EEXIST) + fatal(0, "dmu_take_snapshot = %d", error); + + error = dmu_objset_open(snap3name, DMU_OST_OTHER, + DS_MODE_USER | DS_MODE_READONLY, &clone); + if (error) + fatal(0, "dmu_open_snapshot(%s) = %d", snap3name, error); + + error = dmu_objset_create(clone2name, DMU_OST_OTHER, clone, 0, + NULL, NULL); + if (error) + fatal(0, "dmu_objset_create(%s) = %d", clone2name, error); + dmu_objset_close(clone); + + error = dsl_dataset_own(snap1name, 0, FTAG, &ds); + if (error) + fatal(0, "dsl_dataset_own(%s) = %d", snap1name, error); + error = dsl_dataset_promote(clone2name); + if (error != EBUSY) + fatal(0, "dsl_dataset_promote(%s), %d, not EBUSY", clone2name, + error); + dsl_dataset_disown(ds, FTAG); + + error = dmu_objset_destroy(clone2name); + if (error) + fatal(0, "dmu_objset_destroy(%s) = %d", clone2name, error); + + error = dmu_objset_destroy(snap3name); + if (error) + fatal(0, "dmu_objset_destroy(%s) = %d", snap2name, error); + + error = dmu_objset_destroy(snap2name); + if (error) + fatal(0, "dmu_objset_destroy(%s) = %d", snap2name, error); + + error = dmu_objset_destroy(clone1name); + if (error) + fatal(0, "dmu_objset_destroy(%s) = %d", clone1name, error); + error = dmu_objset_destroy(snap1name); + if (error) + fatal(0, "dmu_objset_destroy(%s) = %d", snap1name, error); + + (void) rw_unlock(&ztest_shared->zs_name_lock); +} + +/* * Verify that dmu_object_{alloc,free} work as expected. */ void 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 May 11 09:19:41 2010 (r207909) +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c Tue May 11 09:23:46 2010 (r207910) @@ -554,6 +554,7 @@ dsl_dataset_own_obj(dsl_pool_t *dp, uint return (err); if (!dsl_dataset_tryown(*dsp, DS_MODE_IS_INCONSISTENT(flags), owner)) { dsl_dataset_rele(*dsp, owner); + *dsp = NULL; return (EBUSY); } return (0); @@ -2584,7 +2585,7 @@ snaplist_destroy(list_t *l, boolean_t ow { struct promotenode *snap; - if (!list_link_active(&l->list_head)) + if (!l || !list_link_active(&l->list_head)) return; while ((snap = list_tail(l)) != NULL) { _______________________________________________ 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-unsubscribe@freebsd.org"
Author: mm Date: Tue May 11 09:26:46 2010 New Revision: 207911 URL: http://svn.freebsd.org/changeset/base/207911 Log: Fix failed assertion on destroying datasets from an older pool version. OpenSolaris onnv revision: 9390:887948510f80 PR: kern/146471 Approved by: pjd, delphij (mentor) Obtained from: OpenSolaris (Bug ID 6826861) MFC after: 3 days Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c 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 May 11 09:23:46 2010 (r207910) +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c Tue May 11 09:26:46 2010 (r207911) @@ -1268,8 +1268,7 @@ dsl_dataset_rollback_sync(void *arg1, vo (void) zio_wait(zio); } - ASSERT(!(ds->ds_phys->ds_flags & DS_FLAG_UNIQUE_ACCURATE) || - ds->ds_phys->ds_unique_bytes == 0); + ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) || ds->ds_phys->ds_unique_bytes == 0); if (ds->ds_prev && ds->ds_prev != ds->ds_dir->dd_pool->dp_origin_snap) { /* Change our contents to that of the prev snapshot */ @@ -1661,7 +1660,7 @@ dsl_dataset_destroy_sync(void *arg1, voi err = traverse_dsl_dataset(ds, ds->ds_phys->ds_prev_snap_txg, ADVANCE_POST, kill_blkptr, &ka); ASSERT3U(err, ==, 0); - ASSERT(spa_version(dp->dp_spa) < SPA_VERSION_UNIQUE_ACCURATE || + ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) || ds->ds_phys->ds_unique_bytes == 0); } _______________________________________________ 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-unsubscribe@freebsd.org"
Responsible Changed From-To: freebsd-fs->mm This is my PR.
State Changed From-To: open->patched Waiting for MFC.
Author: mm Date: Fri May 14 09:50:28 2010 New Revision: 208066 URL: http://svn.freebsd.org/changeset/base/208066 Log: MFC r207909, r207910, r207911: MFC r207909: Fix zfs rename (may occasionally fail with dataset busy). OpenSolaris onnv revision: 8517:41a0783dde17 MFC r207910: Fix possible panic with zfs destroy. OpenSolaris onnv revision: 8779:f164e0e90508 MFC r207911: Fix failed assertion on destroying datasets from an older pool version. OpenSolaris onnv revision: 9390:887948510f80 PR: kern/146471 Approved by: pjd, delphij (mentor) Obtained from: OpenSolaris (Bug ID 6784757, 6784924, 6826861) Modified: stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) stable/8/sys/dev/xen/xenpci/ (props changed) stable/8/sys/geom/sched/ (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 Fri May 14 09:09:08 2010 (r208065) +++ stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c Fri May 14 09:50:28 2010 (r208066) @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -554,6 +554,7 @@ dsl_dataset_own_obj(dsl_pool_t *dp, uint return (err); if (!dsl_dataset_tryown(*dsp, DS_MODE_IS_INCONSISTENT(flags), owner)) { dsl_dataset_rele(*dsp, owner); + *dsp = NULL; return (EBUSY); } return (0); @@ -1267,8 +1268,7 @@ dsl_dataset_rollback_sync(void *arg1, vo (void) zio_wait(zio); } - ASSERT(!(ds->ds_phys->ds_flags & DS_FLAG_UNIQUE_ACCURATE) || - ds->ds_phys->ds_unique_bytes == 0); + ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) || ds->ds_phys->ds_unique_bytes == 0); if (ds->ds_prev && ds->ds_prev != ds->ds_dir->dd_pool->dp_origin_snap) { /* Change our contents to that of the prev snapshot */ @@ -1660,7 +1660,7 @@ dsl_dataset_destroy_sync(void *arg1, voi err = traverse_dsl_dataset(ds, ds->ds_phys->ds_prev_snap_txg, ADVANCE_POST, kill_blkptr, &ka); ASSERT3U(err, ==, 0); - ASSERT(spa_version(dp->dp_spa) < SPA_VERSION_UNIQUE_ACCURATE || + ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) || ds->ds_phys->ds_unique_bytes == 0); } @@ -2205,6 +2205,12 @@ dsl_dataset_rename(char *oldname, const err = dsl_dir_open(oldname, FTAG, &dd, &tail); if (err) return (err); + /* + * If there are more than 2 references there may be holds + * hanging around that haven't been cleared out yet. + */ + if (dmu_buf_refcount(dd->dd_dbuf) > 2) + txg_wait_synced(dd->dd_pool, 0); if (tail == NULL) { int delta = strlen(newname) - strlen(oldname); @@ -2578,7 +2584,7 @@ snaplist_destroy(list_t *l, boolean_t ow { struct promotenode *snap; - if (!list_link_active(&l->list_head)) + if (!l || !list_link_active(&l->list_head)) return; while ((snap = list_tail(l)) != NULL) { _______________________________________________ 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-unsubscribe@freebsd.org"
Author: mm Date: Fri May 14 09:57:10 2010 New Revision: 208067 URL: http://svn.freebsd.org/changeset/base/208067 Log: MFC r207910: (cddl/contrib/opensolaris part) Fix possible panic with zfs destroy. OpenSolaris onnv revision: 8779:f164e0e90508 PR: kern/146471 Approved by: pjd, delphij (mentor) Obtained from: OpenSolaris (Bug ID 6784924) Modified: stable/8/cddl/contrib/opensolaris/cmd/ztest/ztest.c Directory Properties: stable/8/cddl/contrib/opensolaris/ (props changed) stable/8/cddl/contrib/opensolaris/cmd/zdb/ (props changed) stable/8/cddl/contrib/opensolaris/cmd/zfs/ (props changed) stable/8/cddl/contrib/opensolaris/lib/libzfs/ (props changed) Modified: stable/8/cddl/contrib/opensolaris/cmd/ztest/ztest.c ============================================================================== --- stable/8/cddl/contrib/opensolaris/cmd/ztest/ztest.c Fri May 14 09:50:28 2010 (r208066) +++ stable/8/cddl/contrib/opensolaris/cmd/ztest/ztest.c Fri May 14 09:57:10 2010 (r208067) @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -93,6 +93,7 @@ #include <sys/vdev_file.h> #include <sys/spa_impl.h> #include <sys/dsl_prop.h> +#include <sys/dsl_dataset.h> #include <sys/refcount.h> #include <stdio.h> #include <stdio_ext.h> @@ -174,6 +175,7 @@ ztest_func_t ztest_traverse; ztest_func_t ztest_dsl_prop_get_set; ztest_func_t ztest_dmu_objset_create_destroy; ztest_func_t ztest_dmu_snapshot_create_destroy; +ztest_func_t ztest_dsl_dataset_promote_busy; ztest_func_t ztest_spa_create_destroy; ztest_func_t ztest_fault_inject; ztest_func_t ztest_spa_rename; @@ -208,6 +210,7 @@ ztest_info_t ztest_info[] = { { ztest_dsl_prop_get_set, 1, &zopt_sometimes }, { ztest_dmu_objset_create_destroy, 1, &zopt_sometimes }, { ztest_dmu_snapshot_create_destroy, 1, &zopt_sometimes }, + { ztest_dsl_dataset_promote_busy, 1, &zopt_sometimes }, { ztest_spa_create_destroy, 1, &zopt_sometimes }, { ztest_fault_inject, 1, &zopt_sometimes }, { ztest_spa_rename, 1, &zopt_rarely }, @@ -1591,6 +1594,109 @@ ztest_traverse(ztest_args_t *za) } /* + * Verify dsl_dataset_promote handles EBUSY + */ +void +ztest_dsl_dataset_promote_busy(ztest_args_t *za) +{ + int error; + objset_t *os = za->za_os; + objset_t *clone; + dsl_dataset_t *ds; + char snap1name[100]; + char clone1name[100]; + char snap2name[100]; + char clone2name[100]; + char snap3name[100]; + char osname[MAXNAMELEN]; + static uint64_t uniq = 0; + uint64_t curval; + + curval = atomic_add_64_nv(&uniq, 5) - 5; + + (void) rw_rdlock(&ztest_shared->zs_name_lock); + + dmu_objset_name(os, osname); + (void) snprintf(snap1name, 100, "%s@s1_%llu", osname, curval++); + (void) snprintf(clone1name, 100, "%s/c1_%llu", osname, curval++); + (void) snprintf(snap2name, 100, "%s@s2_%llu", clone1name, curval++); + (void) snprintf(clone2name, 100, "%s/c2_%llu", osname, curval++); + (void) snprintf(snap3name, 100, "%s@s3_%llu", clone1name, curval++); + + error = dmu_objset_snapshot(osname, strchr(snap1name, '@')+1, FALSE); + if (error == ENOSPC) + ztest_record_enospc("dmu_take_snapshot"); + else if (error != 0 && error != EEXIST) + fatal(0, "dmu_take_snapshot = %d", error); + + error = dmu_objset_open(snap1name, DMU_OST_OTHER, + DS_MODE_USER | DS_MODE_READONLY, &clone); + if (error) + fatal(0, "dmu_open_snapshot(%s) = %d", snap1name, error); + + error = dmu_objset_create(clone1name, DMU_OST_OTHER, clone, 0, + NULL, NULL); + if (error) + fatal(0, "dmu_objset_create(%s) = %d", clone1name, error); + dmu_objset_close(clone); + + error = dmu_objset_snapshot(clone1name, strchr(snap2name, '@')+1, + FALSE); + if (error == ENOSPC) + ztest_record_enospc("dmu_take_snapshot"); + else if (error != 0 && error != EEXIST) + fatal(0, "dmu_take_snapshot = %d", error); + + error = dmu_objset_snapshot(clone1name, strchr(snap3name, '@')+1, + FALSE); + if (error == ENOSPC) + ztest_record_enospc("dmu_take_snapshot"); + else if (error != 0 && error != EEXIST) + fatal(0, "dmu_take_snapshot = %d", error); + + error = dmu_objset_open(snap3name, DMU_OST_OTHER, + DS_MODE_USER | DS_MODE_READONLY, &clone); + if (error) + fatal(0, "dmu_open_snapshot(%s) = %d", snap3name, error); + + error = dmu_objset_create(clone2name, DMU_OST_OTHER, clone, 0, + NULL, NULL); + if (error) + fatal(0, "dmu_objset_create(%s) = %d", clone2name, error); + dmu_objset_close(clone); + + error = dsl_dataset_own(snap1name, 0, FTAG, &ds); + if (error) + fatal(0, "dsl_dataset_own(%s) = %d", snap1name, error); + error = dsl_dataset_promote(clone2name); + if (error != EBUSY) + fatal(0, "dsl_dataset_promote(%s), %d, not EBUSY", clone2name, + error); + dsl_dataset_disown(ds, FTAG); + + error = dmu_objset_destroy(clone2name); + if (error) + fatal(0, "dmu_objset_destroy(%s) = %d", clone2name, error); + + error = dmu_objset_destroy(snap3name); + if (error) + fatal(0, "dmu_objset_destroy(%s) = %d", snap2name, error); + + error = dmu_objset_destroy(snap2name); + if (error) + fatal(0, "dmu_objset_destroy(%s) = %d", snap2name, error); + + error = dmu_objset_destroy(clone1name); + if (error) + fatal(0, "dmu_objset_destroy(%s) = %d", clone1name, error); + error = dmu_objset_destroy(snap1name); + if (error) + fatal(0, "dmu_objset_destroy(%s) = %d", snap1name, error); + + (void) rw_unlock(&ztest_shared->zs_name_lock); +} + +/* * Verify that dmu_object_{alloc,free} work as expected. */ void _______________________________________________ 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-unsubscribe@freebsd.org"
Author: mm Date: Fri May 14 10:04:11 2010 New Revision: 208068 URL: http://svn.freebsd.org/changeset/base/208068 Log: MFC r207909, r207910, r207911: MFC r207909: Fix zfs rename (may occasionally fail with dataset busy). OpenSolaris onnv revision: 8517:41a0783dde17 MFC r207910: Fix possible panic with zfs destroy. OpenSolaris onnv revision: 8779:f164e0e90508 MFC r207911: Fix failed assertion on destroying datasets from an older pool version. OpenSolaris onnv revision: 9390:887948510f80 PR: kern/146471 Approved by: pjd, delphij (mentor) Obtained from: OpenSolaris (Bug ID 6784757, 6784924, 6826861) Modified: stable/7/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c Directory Properties: stable/7/sys/ (props changed) stable/7/sys/cddl/contrib/opensolaris/ (props changed) stable/7/sys/contrib/dev/acpica/ (props changed) stable/7/sys/contrib/pf/ (props changed) Modified: stable/7/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c ============================================================================== --- stable/7/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c Fri May 14 09:57:10 2010 (r208067) +++ stable/7/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c Fri May 14 10:04:11 2010 (r208068) @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -554,6 +554,7 @@ dsl_dataset_own_obj(dsl_pool_t *dp, uint return (err); if (!dsl_dataset_tryown(*dsp, DS_MODE_IS_INCONSISTENT(flags), owner)) { dsl_dataset_rele(*dsp, owner); + *dsp = NULL; return (EBUSY); } return (0); @@ -1267,8 +1268,7 @@ dsl_dataset_rollback_sync(void *arg1, vo (void) zio_wait(zio); } - ASSERT(!(ds->ds_phys->ds_flags & DS_FLAG_UNIQUE_ACCURATE) || - ds->ds_phys->ds_unique_bytes == 0); + ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) || ds->ds_phys->ds_unique_bytes == 0); if (ds->ds_prev && ds->ds_prev != ds->ds_dir->dd_pool->dp_origin_snap) { /* Change our contents to that of the prev snapshot */ @@ -1660,7 +1660,7 @@ dsl_dataset_destroy_sync(void *arg1, voi err = traverse_dsl_dataset(ds, ds->ds_phys->ds_prev_snap_txg, ADVANCE_POST, kill_blkptr, &ka); ASSERT3U(err, ==, 0); - ASSERT(spa_version(dp->dp_spa) < SPA_VERSION_UNIQUE_ACCURATE || + ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) || ds->ds_phys->ds_unique_bytes == 0); } @@ -2205,6 +2205,12 @@ dsl_dataset_rename(char *oldname, const err = dsl_dir_open(oldname, FTAG, &dd, &tail); if (err) return (err); + /* + * If there are more than 2 references there may be holds + * hanging around that haven't been cleared out yet. + */ + if (dmu_buf_refcount(dd->dd_dbuf) > 2) + txg_wait_synced(dd->dd_pool, 0); if (tail == NULL) { int delta = strlen(newname) - strlen(oldname); @@ -2578,7 +2584,7 @@ snaplist_destroy(list_t *l, boolean_t ow { struct promotenode *snap; - if (!list_link_active(&l->list_head)) + if (!l || !list_link_active(&l->list_head)) return; while ((snap = list_tail(l)) != NULL) { _______________________________________________ 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-unsubscribe@freebsd.org"
Author: mm Date: Fri May 14 10:06:20 2010 New Revision: 208069 URL: http://svn.freebsd.org/changeset/base/208069 Log: MFC r207910: (cddl/contrib/opensolaris part) Fix possible panic with zfs destroy. OpenSolaris onnv revision: 8779:f164e0e90508 PR: kern/146471 Approved by: pjd, delphij (mentor) Obtained from: OpenSolaris (Bug ID 6784924) Modified: stable/7/cddl/contrib/opensolaris/cmd/ztest/ztest.c Directory Properties: stable/7/cddl/contrib/opensolaris/ (props changed) Modified: stable/7/cddl/contrib/opensolaris/cmd/ztest/ztest.c ============================================================================== --- stable/7/cddl/contrib/opensolaris/cmd/ztest/ztest.c Fri May 14 10:04:11 2010 (r208068) +++ stable/7/cddl/contrib/opensolaris/cmd/ztest/ztest.c Fri May 14 10:06:20 2010 (r208069) @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -93,6 +93,7 @@ #include <sys/vdev_file.h> #include <sys/spa_impl.h> #include <sys/dsl_prop.h> +#include <sys/dsl_dataset.h> #include <sys/refcount.h> #include <stdio.h> #include <stdio_ext.h> @@ -174,6 +175,7 @@ ztest_func_t ztest_traverse; ztest_func_t ztest_dsl_prop_get_set; ztest_func_t ztest_dmu_objset_create_destroy; ztest_func_t ztest_dmu_snapshot_create_destroy; +ztest_func_t ztest_dsl_dataset_promote_busy; ztest_func_t ztest_spa_create_destroy; ztest_func_t ztest_fault_inject; ztest_func_t ztest_spa_rename; @@ -208,6 +210,7 @@ ztest_info_t ztest_info[] = { { ztest_dsl_prop_get_set, 1, &zopt_sometimes }, { ztest_dmu_objset_create_destroy, 1, &zopt_sometimes }, { ztest_dmu_snapshot_create_destroy, 1, &zopt_sometimes }, + { ztest_dsl_dataset_promote_busy, 1, &zopt_sometimes }, { ztest_spa_create_destroy, 1, &zopt_sometimes }, { ztest_fault_inject, 1, &zopt_sometimes }, { ztest_spa_rename, 1, &zopt_rarely }, @@ -1592,6 +1595,109 @@ ztest_traverse(ztest_args_t *za) } /* + * Verify dsl_dataset_promote handles EBUSY + */ +void +ztest_dsl_dataset_promote_busy(ztest_args_t *za) +{ + int error; + objset_t *os = za->za_os; + objset_t *clone; + dsl_dataset_t *ds; + char snap1name[100]; + char clone1name[100]; + char snap2name[100]; + char clone2name[100]; + char snap3name[100]; + char osname[MAXNAMELEN]; + static uint64_t uniq = 0; + uint64_t curval; + + curval = atomic_add_64_nv(&uniq, 5) - 5; + + (void) rw_rdlock(&ztest_shared->zs_name_lock); + + dmu_objset_name(os, osname); + (void) snprintf(snap1name, 100, "%s@s1_%llu", osname, curval++); + (void) snprintf(clone1name, 100, "%s/c1_%llu", osname, curval++); + (void) snprintf(snap2name, 100, "%s@s2_%llu", clone1name, curval++); + (void) snprintf(clone2name, 100, "%s/c2_%llu", osname, curval++); + (void) snprintf(snap3name, 100, "%s@s3_%llu", clone1name, curval++); + + error = dmu_objset_snapshot(osname, strchr(snap1name, '@')+1, FALSE); + if (error == ENOSPC) + ztest_record_enospc("dmu_take_snapshot"); + else if (error != 0 && error != EEXIST) + fatal(0, "dmu_take_snapshot = %d", error); + + error = dmu_objset_open(snap1name, DMU_OST_OTHER, + DS_MODE_USER | DS_MODE_READONLY, &clone); + if (error) + fatal(0, "dmu_open_snapshot(%s) = %d", snap1name, error); + + error = dmu_objset_create(clone1name, DMU_OST_OTHER, clone, 0, + NULL, NULL); + if (error) + fatal(0, "dmu_objset_create(%s) = %d", clone1name, error); + dmu_objset_close(clone); + + error = dmu_objset_snapshot(clone1name, strchr(snap2name, '@')+1, + FALSE); + if (error == ENOSPC) + ztest_record_enospc("dmu_take_snapshot"); + else if (error != 0 && error != EEXIST) + fatal(0, "dmu_take_snapshot = %d", error); + + error = dmu_objset_snapshot(clone1name, strchr(snap3name, '@')+1, + FALSE); + if (error == ENOSPC) + ztest_record_enospc("dmu_take_snapshot"); + else if (error != 0 && error != EEXIST) + fatal(0, "dmu_take_snapshot = %d", error); + + error = dmu_objset_open(snap3name, DMU_OST_OTHER, + DS_MODE_USER | DS_MODE_READONLY, &clone); + if (error) + fatal(0, "dmu_open_snapshot(%s) = %d", snap3name, error); + + error = dmu_objset_create(clone2name, DMU_OST_OTHER, clone, 0, + NULL, NULL); + if (error) + fatal(0, "dmu_objset_create(%s) = %d", clone2name, error); + dmu_objset_close(clone); + + error = dsl_dataset_own(snap1name, 0, FTAG, &ds); + if (error) + fatal(0, "dsl_dataset_own(%s) = %d", snap1name, error); + error = dsl_dataset_promote(clone2name); + if (error != EBUSY) + fatal(0, "dsl_dataset_promote(%s), %d, not EBUSY", clone2name, + error); + dsl_dataset_disown(ds, FTAG); + + error = dmu_objset_destroy(clone2name); + if (error) + fatal(0, "dmu_objset_destroy(%s) = %d", clone2name, error); + + error = dmu_objset_destroy(snap3name); + if (error) + fatal(0, "dmu_objset_destroy(%s) = %d", snap2name, error); + + error = dmu_objset_destroy(snap2name); + if (error) + fatal(0, "dmu_objset_destroy(%s) = %d", snap2name, error); + + error = dmu_objset_destroy(clone1name); + if (error) + fatal(0, "dmu_objset_destroy(%s) = %d", clone1name, error); + error = dmu_objset_destroy(snap1name); + if (error) + fatal(0, "dmu_objset_destroy(%s) = %d", snap1name, error); + + (void) rw_unlock(&ztest_shared->zs_name_lock); +} + +/* * Verify that dmu_object_{alloc,free} work as expected. */ void _______________________________________________ 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-unsubscribe@freebsd.org"
State Changed From-To: patched->closed Committed. Thanks!