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