Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OpenZFS 9164 - assert: newds == os->os_dsl_dataset #7336

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions include/sys/dmu_objset.h
Original file line number Diff line number Diff line change
Expand Up @@ -194,8 +194,8 @@ int dmu_objset_own(const char *name, dmu_objset_type_t type,
int dmu_objset_own_obj(struct dsl_pool *dp, uint64_t obj,
dmu_objset_type_t type, boolean_t readonly, boolean_t decrypt,
void *tag, objset_t **osp);
void dmu_objset_refresh_ownership(objset_t *os, boolean_t key_needed,
void *tag);
void dmu_objset_refresh_ownership(struct dsl_dataset *ds,
struct dsl_dataset **newds, boolean_t decrypt, void *tag);
void dmu_objset_rele(objset_t *os, void *tag);
void dmu_objset_rele_flags(objset_t *os, boolean_t decrypt, void *tag);
void dmu_objset_disown(objset_t *os, boolean_t decrypt, void *tag);
Expand Down
12 changes: 5 additions & 7 deletions module/zfs/dmu_objset.c
Original file line number Diff line number Diff line change
Expand Up @@ -791,24 +791,22 @@ dmu_objset_rele(objset_t *os, void *tag)
* same name so that it can be partially torn down and reconstructed.
*/
void
dmu_objset_refresh_ownership(objset_t *os, boolean_t decrypt, void *tag)
dmu_objset_refresh_ownership(dsl_dataset_t *ds, dsl_dataset_t **newds,
boolean_t decrypt, void *tag)
{
dsl_pool_t *dp;
dsl_dataset_t *ds, *newds;
char name[ZFS_MAX_DATASET_NAME_LEN];

ds = os->os_dsl_dataset;
VERIFY3P(ds, !=, NULL);
VERIFY3P(ds->ds_owner, ==, tag);
VERIFY(dsl_dataset_long_held(ds));

dsl_dataset_name(ds, name);
dp = dmu_objset_pool(os);
dp = ds->ds_dir->dd_pool;
dsl_pool_config_enter(dp, FTAG);
dmu_objset_disown(os, decrypt, tag);
dsl_dataset_disown(ds, decrypt, tag);
VERIFY0(dsl_dataset_own(dp, name,
(decrypt) ? DS_HOLD_FLAG_DECRYPT : 0, tag, &newds));
VERIFY3P(newds, ==, os->os_dsl_dataset);
(decrypt) ? DS_HOLD_FLAG_DECRYPT : 0, tag, newds));
dsl_pool_config_exit(dp, FTAG);
}

Expand Down
6 changes: 3 additions & 3 deletions module/zfs/zfs_ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -5290,14 +5290,14 @@ zfs_ioc_userspace_upgrade(zfs_cmd_t *zc)
* objset needs to be closed & reopened (to grow the
* objset_phys_t). Suspend/resume the fs will do that.
*/
dsl_dataset_t *ds;
dsl_dataset_t *ds, *newds;

ds = dmu_objset_ds(zfsvfs->z_os);
error = zfs_suspend_fs(zfsvfs);
if (error == 0) {
dmu_objset_refresh_ownership(zfsvfs->z_os,
dmu_objset_refresh_ownership(ds, &newds,
B_TRUE, zfsvfs);
error = zfs_resume_fs(zfsvfs, ds);
error = zfs_resume_fs(zfsvfs, newds);
}
}
if (error == 0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,22 @@ set -A spa_create_versions 9 15 24
set -A zpl_upgrade_versions 3 4 5
set -A spa_upgrade_versions 9 15 24

function get_pool_version #pool
{
ver=$(get_pool_prop version $1)

if [ "$ver" = "-" ]; then
ver="5000"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm sorry for derailing this, i was wrongfully thinking of filesystem version, not pool version.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@loli10K You didn't derail anything. Thank you for your assistance! :)

fi

echo "$ver"
}

function default_setup_datasets #rootfs
{
typeset rootfs=$1
typeset pool=${rootfs%%/*}
typeset -i vp=$(get_pool_prop version $pool)
typeset -i vp=$(get_pool_version $pool)
typeset -i version
typeset -i m
typeset -i spa_version
Expand Down Expand Up @@ -107,7 +118,7 @@ function default_cleanup_datasets #rootfs
typeset rootfs=$1

if datasetexists $rootfs ; then
log_must zfs destroy -Rf $rootfs
log_must_busy zfs destroy -Rf $rootfs
fi

if datasetnonexists $rootfs ; then
Expand All @@ -119,7 +130,7 @@ function default_check_zfs_upgrade #rootfs
{
typeset rootfs=$1
typeset pool=${rootfs%%/*}
typeset -i vp=$(get_pool_prop version $pool)
typeset -i vp=$(get_pool_version $pool)
typeset -i m
typeset -i spa_version
typeset -i zpl_version
Expand Down Expand Up @@ -150,9 +161,9 @@ function default_check_zfs_upgrade #rootfs

if (( df_ret != 0 )); then
if (( spa_version != 0 )) && (( vp < spa_version )); then
log_mustnot zfs upgrade $opt -a >/dev/null
log_must zpool upgrade $pool >/dev/null
vp=$(get_pool_prop version $pool)
log_mustnot eval "zfs upgrade $opt -a >/dev/null"
log_must eval "zpool upgrade $pool >/dev/null"
vp=$(get_pool_version $pool)
fi

log_must zfs upgrade $opt -a
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,8 @@ function destroy_upgraded_pool
typeset -n pool_files=ZPOOL_VERSION_${vers}_FILES
typeset -n pool_name=ZPOOL_VERSION_${vers}_NAME

if poolexists $pool_name; then
log_must zpool destroy $pool_name
fi
destroy_pool $pool_name

for file in $pool_files; do
rm -f $TEST_BASE_DIR/$file
done
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,19 +48,18 @@

verify_runnable "global"

https://github.com/zfsonlinux/zfs/issues/6112
log_unsupported "Known issue #6112"

function cleanup
{
destroy_upgraded_pool $config
}

POOL_CONFIGS="1raidz 1mirror 2raidz 2mirror 3raidz 3mirror"

log_assert "Import pools of all versions - 'zfs upgrade' on each pool works"
log_onexit cleanup

# $CONFIGS gets set in the .cfg script
for config in $CONFIGS; do
for config in $POOL_CONFIGS; do
typeset -n pool_name=ZPOOL_VERSION_${config}_NAME

create_old_pool $config
Expand Down