mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	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
	
	Block a user
	 Matthew Ahrens
						Matthew Ahrens