OpenZFS 8155 - simplify dmu_write_policy handling of pre-compressed buffers
Authored by: Matthew Ahrens <mahrens@delphix.com> Reviewed by: Dan Kimmel <dan.kimmel@delphix.com> Reviewed by: George Wilson <george.wilson@delphix.com> Approved by: Robert Mustacchi <rm@joyent.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Ported-by: Giuseppe Di Natale <dinatale2@llnl.gov> When writing pre-compressed buffers, arc_write() requires that the compression algorithm used to compress the buffer matches the compression algorithm requested by the zio_prop_t, which is set by dmu_write_policy(). This makes dmu_write_policy() and its callers a bit more complicated. We simplify this by making arc_write() trust the caller to supply the type of pre-compressed buffer that it wants to write, and override the compression setting in the zio_prop_t. OpenZFS-issue: https://www.illumos.org/issues/8155 OpenZFS-commit: https://github.com/openzfs/openzfs/commit/b55ff58 Closes #6200
This commit is contained in:
parent
4070bfd852
commit
82644107c4
|
@ -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, 2016 by Delphix. All rights reserved.
|
* Copyright (c) 2011, 2017 by Delphix. All rights reserved.
|
||||||
* Copyright 2011 Nexenta Systems, Inc. All rights reserved.
|
* Copyright 2011 Nexenta Systems, Inc. All rights reserved.
|
||||||
* Copyright (c) 2012, Joyent, Inc. All rights reserved.
|
* Copyright (c) 2012, Joyent, Inc. All rights reserved.
|
||||||
* Copyright 2014 HybridCluster. All rights reserved.
|
* Copyright 2014 HybridCluster. All rights reserved.
|
||||||
|
@ -430,8 +430,8 @@ dmu_write_embedded(objset_t *os, uint64_t object, uint64_t offset,
|
||||||
#define WP_DMU_SYNC 0x2
|
#define WP_DMU_SYNC 0x2
|
||||||
#define WP_SPILL 0x4
|
#define WP_SPILL 0x4
|
||||||
|
|
||||||
void dmu_write_policy(objset_t *os, struct dnode *dn, int level, int wp,
|
void dmu_write_policy(objset_t *os, dnode_t *dn, int level, int wp,
|
||||||
enum zio_compress compress_override, struct zio_prop *zp);
|
struct zio_prop *zp);
|
||||||
/*
|
/*
|
||||||
* The bonus data is accessed more or less like a regular buffer.
|
* The bonus data is accessed more or less like a regular buffer.
|
||||||
* You must dmu_bonus_hold() to get the buffer, which will give you a
|
* You must dmu_bonus_hold() to get the buffer, which will give you a
|
||||||
|
|
|
@ -5977,6 +5977,7 @@ arc_write(zio_t *pio, spa_t *spa, uint64_t txg,
|
||||||
arc_buf_hdr_t *hdr = buf->b_hdr;
|
arc_buf_hdr_t *hdr = buf->b_hdr;
|
||||||
arc_write_callback_t *callback;
|
arc_write_callback_t *callback;
|
||||||
zio_t *zio;
|
zio_t *zio;
|
||||||
|
zio_prop_t localprop = *zp;
|
||||||
|
|
||||||
ASSERT3P(ready, !=, NULL);
|
ASSERT3P(ready, !=, NULL);
|
||||||
ASSERT3P(done, !=, NULL);
|
ASSERT3P(done, !=, NULL);
|
||||||
|
@ -5987,7 +5988,13 @@ arc_write(zio_t *pio, spa_t *spa, uint64_t txg,
|
||||||
if (l2arc)
|
if (l2arc)
|
||||||
arc_hdr_set_flags(hdr, ARC_FLAG_L2CACHE);
|
arc_hdr_set_flags(hdr, ARC_FLAG_L2CACHE);
|
||||||
if (ARC_BUF_COMPRESSED(buf)) {
|
if (ARC_BUF_COMPRESSED(buf)) {
|
||||||
ASSERT3U(zp->zp_compress, !=, ZIO_COMPRESS_OFF);
|
/*
|
||||||
|
* We're writing a pre-compressed buffer. Make the
|
||||||
|
* compression algorithm requested by the zio_prop_t match
|
||||||
|
* the pre-compressed buffer's compression algorithm.
|
||||||
|
*/
|
||||||
|
localprop.zp_compress = HDR_GET_COMPRESS(hdr);
|
||||||
|
|
||||||
ASSERT3U(HDR_GET_LSIZE(hdr), !=, arc_buf_size(buf));
|
ASSERT3U(HDR_GET_LSIZE(hdr), !=, arc_buf_size(buf));
|
||||||
zio_flags |= ZIO_FLAG_RAW;
|
zio_flags |= ZIO_FLAG_RAW;
|
||||||
}
|
}
|
||||||
|
@ -6023,8 +6030,7 @@ arc_write(zio_t *pio, spa_t *spa, uint64_t txg,
|
||||||
|
|
||||||
zio = zio_write(pio, spa, txg, bp,
|
zio = zio_write(pio, spa, txg, bp,
|
||||||
abd_get_from_buf(buf->b_data, HDR_GET_LSIZE(hdr)),
|
abd_get_from_buf(buf->b_data, HDR_GET_LSIZE(hdr)),
|
||||||
HDR_GET_LSIZE(hdr), arc_buf_size(buf), zp,
|
HDR_GET_LSIZE(hdr), arc_buf_size(buf), &localprop, arc_write_ready,
|
||||||
arc_write_ready,
|
|
||||||
(children_ready != NULL) ? arc_write_children_ready : NULL,
|
(children_ready != NULL) ? arc_write_children_ready : NULL,
|
||||||
arc_write_physdone, arc_write_done, callback,
|
arc_write_physdone, arc_write_done, callback,
|
||||||
priority, zio_flags, zb);
|
priority, zio_flags, zb);
|
||||||
|
|
|
@ -3736,9 +3736,7 @@ dbuf_write(dbuf_dirty_record_t *dr, arc_buf_t *data, dmu_tx_t *tx)
|
||||||
wp_flag = WP_SPILL;
|
wp_flag = WP_SPILL;
|
||||||
wp_flag |= (db->db_state == DB_NOFILL) ? WP_NOFILL : 0;
|
wp_flag |= (db->db_state == DB_NOFILL) ? WP_NOFILL : 0;
|
||||||
|
|
||||||
dmu_write_policy(os, dn, db->db_level, wp_flag,
|
dmu_write_policy(os, dn, db->db_level, wp_flag, &zp);
|
||||||
(data != NULL && arc_get_compression(data) != ZIO_COMPRESS_OFF) ?
|
|
||||||
arc_get_compression(data) : ZIO_COMPRESS_INHERIT, &zp);
|
|
||||||
DB_DNODE_EXIT(db);
|
DB_DNODE_EXIT(db);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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, 2016 by Delphix. All rights reserved.
|
* Copyright (c) 2011, 2017 by Delphix. All rights reserved.
|
||||||
* Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
|
* Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
|
||||||
* Copyright (c) 2013, Joyent, Inc. All rights reserved.
|
* Copyright (c) 2013, Joyent, Inc. All rights reserved.
|
||||||
* Copyright (c) 2016, Nexenta Systems, Inc. All rights reserved.
|
* Copyright (c) 2016, Nexenta Systems, Inc. All rights reserved.
|
||||||
|
@ -1705,8 +1705,7 @@ dmu_sync(zio_t *pio, uint64_t txg, dmu_sync_cb_t *done, zgd_t *zgd)
|
||||||
|
|
||||||
DB_DNODE_ENTER(db);
|
DB_DNODE_ENTER(db);
|
||||||
dn = DB_DNODE(db);
|
dn = DB_DNODE(db);
|
||||||
dmu_write_policy(os, dn, db->db_level, WP_DMU_SYNC,
|
dmu_write_policy(os, dn, db->db_level, WP_DMU_SYNC, &zp);
|
||||||
ZIO_COMPRESS_INHERIT, &zp);
|
|
||||||
DB_DNODE_EXIT(db);
|
DB_DNODE_EXIT(db);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1876,8 +1875,7 @@ int zfs_mdcomp_disable = 0;
|
||||||
int zfs_redundant_metadata_most_ditto_level = 2;
|
int zfs_redundant_metadata_most_ditto_level = 2;
|
||||||
|
|
||||||
void
|
void
|
||||||
dmu_write_policy(objset_t *os, dnode_t *dn, int level, int wp,
|
dmu_write_policy(objset_t *os, dnode_t *dn, int level, int wp, zio_prop_t *zp)
|
||||||
enum zio_compress override_compress, zio_prop_t *zp)
|
|
||||||
{
|
{
|
||||||
dmu_object_type_t type = dn ? dn->dn_type : DMU_OT_OBJSET;
|
dmu_object_type_t type = dn ? dn->dn_type : DMU_OT_OBJSET;
|
||||||
boolean_t ismd = (level > 0 || DMU_OT_IS_METADATA(type) ||
|
boolean_t ismd = (level > 0 || DMU_OT_IS_METADATA(type) ||
|
||||||
|
@ -1890,9 +1888,6 @@ dmu_write_policy(objset_t *os, dnode_t *dn, int level, int wp,
|
||||||
boolean_t dedup_verify = os->os_dedup_verify;
|
boolean_t dedup_verify = os->os_dedup_verify;
|
||||||
int copies = os->os_copies;
|
int copies = os->os_copies;
|
||||||
|
|
||||||
IMPLY(override_compress == ZIO_COMPRESS_LZ4,
|
|
||||||
spa_feature_is_active(os->os_spa, SPA_FEATURE_LZ4_COMPRESS));
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We maintain different write policies for each of the following
|
* We maintain different write policies for each of the following
|
||||||
* types of data:
|
* types of data:
|
||||||
|
@ -1979,14 +1974,7 @@ dmu_write_policy(objset_t *os, dnode_t *dn, int level, int wp,
|
||||||
}
|
}
|
||||||
|
|
||||||
zp->zp_checksum = checksum;
|
zp->zp_checksum = checksum;
|
||||||
|
zp->zp_compress = compress;
|
||||||
/*
|
|
||||||
* If we're writing a pre-compressed buffer, the compression type we use
|
|
||||||
* must match the data. If it hasn't been compressed yet, then we should
|
|
||||||
* use the value dictated by the policies above.
|
|
||||||
*/
|
|
||||||
zp->zp_compress = override_compress != ZIO_COMPRESS_INHERIT
|
|
||||||
? override_compress : compress;
|
|
||||||
ASSERT3U(zp->zp_compress, !=, ZIO_COMPRESS_INHERIT);
|
ASSERT3U(zp->zp_compress, !=, ZIO_COMPRESS_INHERIT);
|
||||||
|
|
||||||
zp->zp_type = (wp & WP_SPILL) ? dn->dn_bonustype : type;
|
zp->zp_type = (wp & WP_SPILL) ? dn->dn_bonustype : type;
|
||||||
|
|
|
@ -1326,7 +1326,7 @@ dmu_objset_sync(objset_t *os, zio_t *pio, dmu_tx_t *tx)
|
||||||
ZB_ROOT_OBJECT, ZB_ROOT_LEVEL, ZB_ROOT_BLKID);
|
ZB_ROOT_OBJECT, ZB_ROOT_LEVEL, ZB_ROOT_BLKID);
|
||||||
arc_release(os->os_phys_buf, &os->os_phys_buf);
|
arc_release(os->os_phys_buf, &os->os_phys_buf);
|
||||||
|
|
||||||
dmu_write_policy(os, NULL, 0, 0, ZIO_COMPRESS_INHERIT, &zp);
|
dmu_write_policy(os, NULL, 0, 0, &zp);
|
||||||
|
|
||||||
zio = arc_write(pio, os->os_spa, tx->tx_txg,
|
zio = arc_write(pio, os->os_spa, tx->tx_txg,
|
||||||
blkptr_copy, os->os_phys_buf, DMU_OS_IS_L2CACHEABLE(os),
|
blkptr_copy, os->os_phys_buf, DMU_OS_IS_L2CACHEABLE(os),
|
||||||
|
|
Loading…
Reference in New Issue