svn commit: r337674 - head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys

Matt Macy mmacy at FreeBSD.org
Sun Aug 12 02:09:08 UTC 2018


Author: mmacy
Date: Sun Aug 12 02:09:06 2018
New Revision: 337674
URL: https://svnweb.freebsd.org/changeset/base/337674

Log:
  Restore legacy dnode_phys layout on tier 2 arches
  
  Evidently gcc4 doesn't support anonymous union members

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dnode.h

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dnode.h
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dnode.h	Sun Aug 12 01:54:05 2018	(r337673)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dnode.h	Sun Aug 12 02:09:06 2018	(r337674)
@@ -161,25 +161,54 @@ typedef struct dnode_phys {
 	uint64_t dn_maxblkid;		/* largest allocated block ID */
 	uint64_t dn_used;		/* bytes (or sectors) of disk space */
 
+	/*
+	 * Both dn_pad2 and dn_pad3 are protected by the block's MAC. This
+	 * allows us to protect any fields that might be added here in the
+	 * future. In either case, developers will want to check
+	 * zio_crypt_init_uios_dnode() to ensure the new field is being
+	 * protected properly.
+	 */
 	uint64_t dn_pad3[4];
- 	union {
+	/*
+	 * The tail region is 448 bytes for a 512 byte dnode, and
+	 * correspondingly larger for larger dnode sizes. The spill
+	 * block pointer, when present, is always at the end of the tail
+	 * region. There are three ways this space may be used, using
+	 * a 512 byte dnode for this diagram:
+	 *
+	 * 0       64      128     192     256     320     384     448 (offset)
+	 * +---------------+---------------+---------------+-------+
+	 * | dn_blkptr[0]  | dn_blkptr[1]  | dn_blkptr[2]  | /     |
+	 * +---------------+---------------+---------------+-------+
+	 * | dn_blkptr[0]  | dn_bonus[0..319]                      |
+	 * +---------------+-----------------------+---------------+
+	 * | dn_blkptr[0]  | dn_bonus[0..191]      | dn_spill      |
+	 * +---------------+-----------------------+---------------+
+	 */
+#if defined(__i386__) || defined(__amd64__)
+	union {
 		blkptr_t dn_blkptr[1+DN_OLD_MAX_BONUSLEN/sizeof (blkptr_t)];
- 		struct {
- 			blkptr_t __dn_ignore1;
+		struct {
+			blkptr_t __dn_ignore1;
 			uint8_t dn_bonus[DN_OLD_MAX_BONUSLEN];
- 		};
- 		struct {
- 			blkptr_t __dn_ignore2;
+		};
+		struct {
+			blkptr_t __dn_ignore2;
 			uint8_t __dn_ignore3[DN_OLD_MAX_BONUSLEN -
 			    sizeof (blkptr_t)];
- 			blkptr_t dn_spill;
+			blkptr_t dn_spill;
  		};
- 	};
+	};
+#else
+	blkptr_t dn_blkptr[1];
+	uint8_t dn_bonus[DN_MAX_BONUSLEN - sizeof (blkptr_t)];
+	blkptr_t dn_spill;
+#endif
 } dnode_phys_t;
 
 #define	DN_SPILL_BLKPTR(dnp)	(blkptr_t *)((char *)(dnp) + \
 	(((dnp)->dn_extra_slots + 1) << DNODE_SHIFT) - (1 << SPA_BLKPTRSHIFT))
-    
+
 struct dnode {
 	/*
 	 * Protects the structure of the dnode, including the number of levels


More information about the svn-src-head mailing list