5818 zfs {ref}compressratio is incorrect with 4k sector size
Author: Matthew Ahrens <mahrens@delphix.com> Reviewed by: George Wilson <george@delphix.com> Reviewed by: Richard Elling <richard.elling@richardelling.com> Reviewed by: Steven Hartland <killing@multiplay.co.uk> Reviewed by: Don Brady <dev.fs.zfs@gmail.com> Approved by: Albert Lee <trisk@omniti.com> illumos/illumos-gate@81cd5c555f
This commit is contained in:
parent
1a6c23b57a
commit
cd7e9ce6ff
@ -20,7 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2011, 2014 by Delphix. All rights reserved.
|
* Copyright (c) 2011, 2015 by Delphix. All rights reserved.
|
||||||
* Copyright 2011 Nexenta Systems, Inc. All rights reserved.
|
* Copyright 2011 Nexenta Systems, Inc. All rights reserved.
|
||||||
* Copyright (c) 2013 Steven Hartland. All rights reserved.
|
* Copyright (c) 2013 Steven Hartland. All rights reserved.
|
||||||
*/
|
*/
|
||||||
@ -967,21 +967,6 @@ ztest_random_spa_version(uint64_t initial_version)
|
|||||||
return (version);
|
return (version);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Find the largest ashift used
|
|
||||||
*/
|
|
||||||
static uint64_t
|
|
||||||
ztest_spa_get_ashift() {
|
|
||||||
uint64_t i;
|
|
||||||
uint64_t ashift = SPA_MINBLOCKSHIFT;
|
|
||||||
vdev_t *rvd = ztest_spa->spa_root_vdev;
|
|
||||||
|
|
||||||
for (i = 0; i < rvd->vdev_children; i++) {
|
|
||||||
ashift = MAX(ashift, rvd->vdev_child[i]->vdev_ashift);
|
|
||||||
}
|
|
||||||
return (ashift);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
ztest_random_blocksize(void)
|
ztest_random_blocksize(void)
|
||||||
{
|
{
|
||||||
@ -993,7 +978,7 @@ ztest_random_blocksize(void)
|
|||||||
int maxbs = SPA_OLD_MAXBLOCKSHIFT;
|
int maxbs = SPA_OLD_MAXBLOCKSHIFT;
|
||||||
if (spa_maxblocksize(ztest_spa) == SPA_MAXBLOCKSIZE)
|
if (spa_maxblocksize(ztest_spa) == SPA_MAXBLOCKSIZE)
|
||||||
maxbs = 20;
|
maxbs = 20;
|
||||||
block_shift = ztest_random(maxbs - ztest_spa_get_ashift() + 1);
|
block_shift = ztest_random(maxbs - ztest_spa->spa_max_ashift + 1);
|
||||||
return (1 << (SPA_MINBLOCKSHIFT + block_shift));
|
return (1 << (SPA_MINBLOCKSHIFT + block_shift));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2195,6 +2195,8 @@ spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config,
|
|||||||
return (error);
|
return (error);
|
||||||
|
|
||||||
ASSERT(spa->spa_root_vdev == rvd);
|
ASSERT(spa->spa_root_vdev == rvd);
|
||||||
|
ASSERT3U(spa->spa_min_ashift, >=, SPA_MINBLOCKSHIFT);
|
||||||
|
ASSERT3U(spa->spa_max_ashift, <=, SPA_MAXBLOCKSHIFT);
|
||||||
|
|
||||||
if (type != SPA_IMPORT_ASSEMBLE) {
|
if (type != SPA_IMPORT_ASSEMBLE) {
|
||||||
ASSERT(spa_guid(spa) == pool_guid);
|
ASSERT(spa_guid(spa) == pool_guid);
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2011, 2014 by Delphix. All rights reserved.
|
* Copyright (c) 2011, 2015 by Delphix. All rights reserved.
|
||||||
* Copyright 2011 Nexenta Systems, Inc. All rights reserved.
|
* Copyright 2011 Nexenta Systems, Inc. All rights reserved.
|
||||||
* Copyright (c) 2014 Spectra Logic Corporation, All rights reserved.
|
* Copyright (c) 2014 Spectra Logic Corporation, All rights reserved.
|
||||||
*/
|
*/
|
||||||
@ -648,6 +648,9 @@ spa_add(const char *name, nvlist_t *config, const char *altroot)
|
|||||||
|
|
||||||
spa->spa_debug = ((zfs_flags & ZFS_DEBUG_SPA) != 0);
|
spa->spa_debug = ((zfs_flags & ZFS_DEBUG_SPA) != 0);
|
||||||
|
|
||||||
|
spa->spa_min_ashift = INT_MAX;
|
||||||
|
spa->spa_max_ashift = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* As a pool is being created, treat all features as disabled by
|
* As a pool is being created, treat all features as disabled by
|
||||||
* setting SPA_FEATURE_DISABLED for all entries in the feature
|
* setting SPA_FEATURE_DISABLED for all entries in the feature
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2011, 2014 by Delphix. All rights reserved.
|
* Copyright (c) 2011, 2015 by Delphix. All rights reserved.
|
||||||
* Copyright 2011 Nexenta Systems, Inc. All rights reserved.
|
* Copyright 2011 Nexenta Systems, Inc. All rights reserved.
|
||||||
* Copyright (c) 2014 Spectra Logic Corporation, All rights reserved.
|
* Copyright (c) 2014 Spectra Logic Corporation, All rights reserved.
|
||||||
*/
|
*/
|
||||||
@ -150,6 +150,8 @@ struct spa {
|
|||||||
kcondvar_t spa_evicting_os_cv; /* Objset Eviction Completion */
|
kcondvar_t spa_evicting_os_cv; /* Objset Eviction Completion */
|
||||||
txg_list_t spa_vdev_txg_list; /* per-txg dirty vdev list */
|
txg_list_t spa_vdev_txg_list; /* per-txg dirty vdev list */
|
||||||
vdev_t *spa_root_vdev; /* top-level vdev container */
|
vdev_t *spa_root_vdev; /* top-level vdev container */
|
||||||
|
int spa_min_ashift; /* of vdevs in normal class */
|
||||||
|
int spa_max_ashift; /* of vdevs in normal class */
|
||||||
uint64_t spa_config_guid; /* config pool guid */
|
uint64_t spa_config_guid; /* config pool guid */
|
||||||
uint64_t spa_load_guid; /* spa_load initialized guid */
|
uint64_t spa_load_guid; /* spa_load initialized guid */
|
||||||
uint64_t spa_last_synced_guid; /* last synced guid */
|
uint64_t spa_last_synced_guid; /* last synced guid */
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2012, 2014 by Delphix. All rights reserved.
|
* Copyright (c) 2011, 2015 by Delphix. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _SYS_VDEV_IMPL_H
|
#ifndef _SYS_VDEV_IMPL_H
|
||||||
@ -207,7 +207,7 @@ struct vdev {
|
|||||||
boolean_t vdev_isl2cache; /* was a l2cache device */
|
boolean_t vdev_isl2cache; /* was a l2cache device */
|
||||||
vdev_queue_t vdev_queue; /* I/O deadline schedule queue */
|
vdev_queue_t vdev_queue; /* I/O deadline schedule queue */
|
||||||
vdev_cache_t vdev_cache; /* physical block cache */
|
vdev_cache_t vdev_cache; /* physical block cache */
|
||||||
spa_aux_vdev_t *vdev_aux; /* for l2cache vdevs */
|
spa_aux_vdev_t *vdev_aux; /* for l2cache and spares vdevs */
|
||||||
zio_t *vdev_probe_zio; /* root of current probe */
|
zio_t *vdev_probe_zio; /* root of current probe */
|
||||||
vdev_aux_t vdev_label_aux; /* on-disk aux state */
|
vdev_aux_t vdev_label_aux; /* on-disk aux state */
|
||||||
|
|
||||||
|
@ -21,8 +21,8 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright 2011 Nexenta Systems, Inc. All rights reserved.
|
* Copyright (c) 2011, 2015 by Delphix. All rights reserved.
|
||||||
* Copyright (c) 2011, 2014 by Delphix. All rights reserved.
|
* Copyright 2015 Nexenta Systems, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/zfs_context.h>
|
#include <sys/zfs_context.h>
|
||||||
@ -184,8 +184,9 @@ vdev_add_child(vdev_t *pvd, vdev_t *cvd)
|
|||||||
size_t oldsize, newsize;
|
size_t oldsize, newsize;
|
||||||
uint64_t id = cvd->vdev_id;
|
uint64_t id = cvd->vdev_id;
|
||||||
vdev_t **newchild;
|
vdev_t **newchild;
|
||||||
|
spa_t *spa = cvd->vdev_spa;
|
||||||
|
|
||||||
ASSERT(spa_config_held(cvd->vdev_spa, SCL_ALL, RW_WRITER) == SCL_ALL);
|
ASSERT(spa_config_held(spa, SCL_ALL, RW_WRITER) == SCL_ALL);
|
||||||
ASSERT(cvd->vdev_parent == NULL);
|
ASSERT(cvd->vdev_parent == NULL);
|
||||||
|
|
||||||
cvd->vdev_parent = pvd;
|
cvd->vdev_parent = pvd;
|
||||||
@ -1286,6 +1287,17 @@ vdev_open(vdev_t *vd)
|
|||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Track the min and max ashift values for normal data devices.
|
||||||
|
*/
|
||||||
|
if (vd->vdev_top == vd && vd->vdev_ashift != 0 &&
|
||||||
|
!vd->vdev_islog && vd->vdev_aux == NULL) {
|
||||||
|
if (vd->vdev_ashift > spa->spa_max_ashift)
|
||||||
|
spa->spa_max_ashift = vd->vdev_ashift;
|
||||||
|
if (vd->vdev_ashift < spa->spa_min_ashift)
|
||||||
|
spa->spa_min_ashift = vd->vdev_ashift;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If a leaf vdev has a DTL, and seems healthy, then kick off a
|
* If a leaf vdev has a DTL, and seems healthy, then kick off a
|
||||||
* resilver. But don't do this if we are doing a reopen for a scrub,
|
* resilver. But don't do this if we are doing a reopen for a scrub,
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2011, 2014 by Delphix. All rights reserved.
|
* Copyright (c) 2011, 2015 by Delphix. All rights reserved.
|
||||||
* Copyright (c) 2011 Nexenta Systems, Inc. All rights reserved.
|
* Copyright (c) 2011 Nexenta Systems, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -1178,19 +1178,23 @@ zio_write_bp_init(zio_t *zio)
|
|||||||
return (ZIO_PIPELINE_CONTINUE);
|
return (ZIO_PIPELINE_CONTINUE);
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* Round up compressed size to MINBLOCKSIZE and
|
* Round up compressed size up to the ashift
|
||||||
* zero the tail.
|
* of the smallest-ashift device, and zero the tail.
|
||||||
|
* This ensures that the compressed size of the BP
|
||||||
|
* (and thus compressratio property) are correct,
|
||||||
|
* in that we charge for the padding used to fill out
|
||||||
|
* the last sector.
|
||||||
*/
|
*/
|
||||||
size_t rounded =
|
ASSERT3U(spa->spa_min_ashift, >=, SPA_MINBLOCKSHIFT);
|
||||||
P2ROUNDUP(psize, (size_t)SPA_MINBLOCKSIZE);
|
size_t rounded = (size_t)P2ROUNDUP(psize,
|
||||||
if (rounded > psize) {
|
1ULL << spa->spa_min_ashift);
|
||||||
bzero((char *)cbuf + psize, rounded - psize);
|
if (rounded >= lsize) {
|
||||||
psize = rounded;
|
|
||||||
}
|
|
||||||
if (psize == lsize) {
|
|
||||||
compress = ZIO_COMPRESS_OFF;
|
compress = ZIO_COMPRESS_OFF;
|
||||||
zio_buf_free(cbuf, lsize);
|
zio_buf_free(cbuf, lsize);
|
||||||
|
psize = lsize;
|
||||||
} else {
|
} else {
|
||||||
|
bzero((char *)cbuf + psize, rounded - psize);
|
||||||
|
psize = rounded;
|
||||||
zio_push_transform(zio, cbuf,
|
zio_push_transform(zio, cbuf,
|
||||||
psize, lsize, NULL);
|
psize, lsize, NULL);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user