Skip to content

Commit

Permalink
Fix zmo leak when zfs_sb_create fails
Browse files Browse the repository at this point in the history
zfs_sb_create would normally takes ownership of zmo, and it will be freed in
zfs_sb_free. However, when zfs_sb_create fails we need to explicit free it.

Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Chunwei Chen <[email protected]>
Closes #5490 
Closes #5496
  • Loading branch information
tuxoko authored and behlendorf committed Dec 19, 2016
1 parent 1528bfd commit 6c01a4a
Showing 1 changed file with 9 additions and 10 deletions.
19 changes: 9 additions & 10 deletions module/zfs/zfs_vfsops.c
Original file line number Diff line number Diff line change
Expand Up @@ -744,19 +744,17 @@ zfs_sb_create(const char *osname, zfs_mntopts_t *zmo, zfs_sb_t **zsbp)
zsb = kmem_zalloc(sizeof (zfs_sb_t), KM_SLEEP);

/*
* We claim to always be readonly so we can open snapshots;
* other ZPL code will prevent us from writing to snapshots.
* Optional temporary mount options, free'd in zfs_sb_free().
*/
error = dmu_objset_own(osname, DMU_OST_ZFS, B_TRUE, zsb, &os);
if (error) {
kmem_free(zsb, sizeof (zfs_sb_t));
return (error);
}
zsb->z_mntopts = (zmo ? zmo : zfs_mntopts_alloc());

/*
* Optional temporary mount options, free'd in zfs_sb_free().
* We claim to always be readonly so we can open snapshots;
* other ZPL code will prevent us from writing to snapshots.
*/
zsb->z_mntopts = (zmo ? zmo : zfs_mntopts_alloc());
error = dmu_objset_own(osname, DMU_OST_ZFS, B_TRUE, zsb, &os);
if (error)
goto out_zmo;

/*
* Initialize the zfs-specific filesystem structure.
Expand Down Expand Up @@ -896,8 +894,9 @@ zfs_sb_create(const char *osname, zfs_mntopts_t *zmo, zfs_sb_t **zsbp)

out:
dmu_objset_disown(os, zsb);
out_zmo:
*zsbp = NULL;

zfs_mntopts_free(zsb->z_mntopts);
kmem_free(zsb, sizeof (zfs_sb_t));
return (error);
}
Expand Down

0 comments on commit 6c01a4a

Please sign in to comment.