Skip to content
This repository has been archived by the owner on Nov 7, 2019. It is now read-only.

Commit

Permalink
9164 assert: newds == os->os_dsl_dataset
Browse files Browse the repository at this point in the history
Reviewed by: Matt Ahrens <[email protected]>
Reviewed by: Don Brady <[email protected]>
Approved by: Richard Lowe <[email protected]>

Closes #559
  • Loading branch information
avg-I authored and Prakash Surya committed Mar 14, 2018
1 parent 6a9c107 commit 0e776dc
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 11 deletions.
12 changes: 5 additions & 7 deletions usr/src/uts/common/fs/zfs/dmu_objset.c
Original file line number Diff line number Diff line change
Expand Up @@ -670,23 +670,21 @@ 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, void *tag)
dmu_objset_refresh_ownership(dsl_dataset_t *ds, dsl_dataset_t **newds,
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, tag);
VERIFY0(dsl_dataset_own(dp, name, tag, &newds));
VERIFY3P(newds, ==, os->os_dsl_dataset);
dsl_dataset_disown(ds, tag);
VERIFY0(dsl_dataset_own(dp, name, tag, newds));
dsl_pool_config_exit(dp, FTAG);
}

Expand Down
3 changes: 2 additions & 1 deletion usr/src/uts/common/fs/zfs/sys/dmu_objset.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,8 @@ int dmu_objset_own(const char *name, dmu_objset_type_t type,
boolean_t readonly, void *tag, objset_t **osp);
int dmu_objset_own_obj(struct dsl_pool *dp, uint64_t obj,
dmu_objset_type_t type, boolean_t readonly, void *tag, objset_t **osp);
void dmu_objset_refresh_ownership(objset_t *os, void *tag);
void dmu_objset_refresh_ownership(struct dsl_dataset *ds,
struct dsl_dataset **newds, void *tag);
void dmu_objset_rele(objset_t *os, void *tag);
void dmu_objset_disown(objset_t *os, void *tag);
int dmu_objset_from_ds(struct dsl_dataset *ds, objset_t **osp);
Expand Down
6 changes: 3 additions & 3 deletions usr/src/uts/common/fs/zfs/zfs_ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -4925,14 +4925,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,
zfsvfs);
error = zfs_resume_fs(zfsvfs, ds);
error = zfs_resume_fs(zfsvfs, newds);
}
}
if (error == 0)
Expand Down

0 comments on commit 0e776dc

Please sign in to comment.