aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/sys/dmu.h2
-rw-r--r--man/man5/zfs-module-parameters.511
-rw-r--r--module/zfs/arc.c3
-rw-r--r--module/zfs/dbuf.c3
-rw-r--r--module/zfs/dmu.c21
-rw-r--r--module/zfs/zio.c14
-rwxr-xr-xtests/zfs-tests/tests/functional/rsend/send_encrypted_files.ksh11
7 files changed, 24 insertions, 41 deletions
diff --git a/include/sys/dmu.h b/include/sys/dmu.h
index cf9cbaa64..472a4f2b6 100644
--- a/include/sys/dmu.h
+++ b/include/sys/dmu.h
@@ -1033,8 +1033,6 @@ int dmu_diff(const char *tosnap_name, const char *fromsnap_name,
#define ZFS_CRC64_POLY 0xC96C5795D7870F42ULL /* ECMA-182, reflected form */
extern uint64_t zfs_crc64_table[256];
-extern int zfs_mdcomp_disable;
-
#ifdef __cplusplus
}
#endif
diff --git a/man/man5/zfs-module-parameters.5 b/man/man5/zfs-module-parameters.5
index 529684742..17335ebed 100644
--- a/man/man5/zfs-module-parameters.5
+++ b/man/man5/zfs-module-parameters.5
@@ -1403,17 +1403,6 @@ Default value: \fB1,048,576\fR.
.sp
.ne 2
.na
-\fBzfs_mdcomp_disable\fR (int)
-.ad
-.RS 12n
-Disable meta data compression
-.sp
-Use \fB1\fR for yes and \fB0\fR for no (default).
-.RE
-
-.sp
-.ne 2
-.na
\fBzfs_metaslab_fragmentation_threshold\fR (int)
.ad
.RS 12n
diff --git a/module/zfs/arc.c b/module/zfs/arc.c
index 7aa221b00..a78a029c2 100644
--- a/module/zfs/arc.c
+++ b/module/zfs/arc.c
@@ -6776,6 +6776,9 @@ arc_write_ready(zio_t *zio)
buf->b_flags &= ~ARC_BUF_FLAG_ENCRYPTED;
if (BP_GET_COMPRESS(bp) == ZIO_COMPRESS_OFF)
buf->b_flags &= ~ARC_BUF_FLAG_COMPRESSED;
+ } else if (BP_IS_HOLE(bp) && ARC_BUF_ENCRYPTED(buf)) {
+ buf->b_flags &= ~ARC_BUF_FLAG_ENCRYPTED;
+ buf->b_flags &= ~ARC_BUF_FLAG_COMPRESSED;
}
/* this must be done after the buffer flags are adjusted */
diff --git a/module/zfs/dbuf.c b/module/zfs/dbuf.c
index 51cb0c982..e885a2756 100644
--- a/module/zfs/dbuf.c
+++ b/module/zfs/dbuf.c
@@ -3465,7 +3465,8 @@ dbuf_check_crypt(dbuf_dirty_record_t *dr)
* Writing raw encrypted data requires the db's arc buffer
* to be converted to raw by the caller.
*/
- ASSERT(arc_is_encrypted(db->db_buf));
+ ASSERT(arc_is_encrypted(db->db_buf) ||
+ db->db.db_object == DMU_META_DNODE_OBJECT);
}
}
diff --git a/module/zfs/dmu.c b/module/zfs/dmu.c
index b7c5bba15..e0114e659 100644
--- a/module/zfs/dmu.c
+++ b/module/zfs/dmu.c
@@ -2107,8 +2107,6 @@ dmu_object_dirty_raw(objset_t *os, uint64_t object, dmu_tx_t *tx)
return (err);
}
-int zfs_mdcomp_disable = 0;
-
/*
* When the "redundant_metadata" property is set to "most", only indirect
* blocks of this level and higher will have an additional ditto block.
@@ -2138,16 +2136,12 @@ dmu_write_policy(objset_t *os, dnode_t *dn, int level, int wp, zio_prop_t *zp)
* 3. all other level 0 blocks
*/
if (ismd) {
- if (zfs_mdcomp_disable) {
- compress = ZIO_COMPRESS_EMPTY;
- } else {
- /*
- * XXX -- we should design a compression algorithm
- * that specializes in arrays of bps.
- */
- compress = zio_compress_select(os->os_spa,
- ZIO_COMPRESS_ON, ZIO_COMPRESS_ON);
- }
+ /*
+ * XXX -- we should design a compression algorithm
+ * that specializes in arrays of bps.
+ */
+ compress = zio_compress_select(os->os_spa,
+ ZIO_COMPRESS_ON, ZIO_COMPRESS_ON);
/*
* Metadata always gets checksummed. If the data
@@ -2523,9 +2517,6 @@ EXPORT_SYMBOL(dmu_buf_hold);
EXPORT_SYMBOL(dmu_ot);
/* BEGIN CSTYLED */
-module_param(zfs_mdcomp_disable, int, 0644);
-MODULE_PARM_DESC(zfs_mdcomp_disable, "Disable meta data compression");
-
module_param(zfs_nopwrite_enabled, int, 0644);
MODULE_PARM_DESC(zfs_nopwrite_enabled, "Enable NOP writes");
diff --git a/module/zfs/zio.c b/module/zfs/zio.c
index 9458f3924..7544cf4e3 100644
--- a/module/zfs/zio.c
+++ b/module/zfs/zio.c
@@ -1532,9 +1532,21 @@ zio_write_compress(zio_t *zio)
*bp = zio->io_bp_orig;
zio->io_pipeline = zio->io_orig_pipeline;
+ } else if ((zio->io_flags & ZIO_FLAG_RAW_ENCRYPT) != 0 &&
+ zp->zp_type == DMU_OT_DNODE) {
+ /*
+ * The DMU actually relies on the zio layer's compression
+ * to free metadnode blocks that have had all contained
+ * dnodes freed. As a result, even when doing a raw
+ * receive, we must check whether the block can be compressed
+ * to a hole.
+ */
+ psize = zio_compress_data(ZIO_COMPRESS_EMPTY,
+ zio->io_abd, NULL, lsize);
+ if (psize == 0)
+ compress = ZIO_COMPRESS_OFF;
} else {
ASSERT3U(psize, !=, 0);
-
}
/*
diff --git a/tests/zfs-tests/tests/functional/rsend/send_encrypted_files.ksh b/tests/zfs-tests/tests/functional/rsend/send_encrypted_files.ksh
index 20f3788d5..998c2afc3 100755
--- a/tests/zfs-tests/tests/functional/rsend/send_encrypted_files.ksh
+++ b/tests/zfs-tests/tests/functional/rsend/send_encrypted_files.ksh
@@ -39,11 +39,6 @@
verify_runnable "both"
-function set_metadata_compression_disabled # <0|1>
-{
- echo $1 > /sys/module/zfs/parameters/zfs_mdcomp_disable
-}
-
function cleanup
{
datasetexists $TESTPOOL/$TESTFS2 && \
@@ -73,12 +68,6 @@ log_must mkfile 32M /$TESTPOOL/$TESTFS2/truncated
log_must truncate -s 4M /$TESTPOOL/$TESTFS2/truncated
sync
-log_must set_metadata_compression_disabled 1
-log_must dd if=/dev/urandom of=/$TESTPOOL/$TESTFS2/no_mdcomp \
- count=1 bs=512 seek=10G >/dev/null 2>&1
-sync
-log_must set_metadata_compression_disabled 0
-
log_must mkdir -p /$TESTPOOL/$TESTFS2/dir
for i in {1..1000}; do
log_must mkfile 512 /$TESTPOOL/$TESTFS2/dir/file-$i